2012-06-27 7 views
5

Auf meiner Homepage habe ich eine Schleife von Posts, die unendlich scroll verwendet. Ein Benutzer kann diese Schleife mit anderen Schleifen ersetzen, indem er Ajax wie Ajax-Suche verwendet und so weiter. Mein Problem ist, dass das unendliche Scrollen nur beim ersten Mal funktioniert. Wenn es also für die Hauptschleife ausgelöst wird, funktioniert es nicht mehr, wenn eine neue Schleife die Hauptschleife ersetzt. Jedes Mal, wenn eine neue Schleife die alte ersetzt, wird die folgende Funktion neu geladen. Also, wie mache ich unendliche Scroll-Reset und Arbeit jedes Mal, wenn eine neue Schleife aufgerufen wird?Wie man einen unendlichen Scroll-Reset mit neuem Ajax-Inhalt macht

var href = 'first'; 
$(document).ready(function() { 
    $('#boxes').infinitescroll({ 
     navSelector: '.infinitescroll', 
     nextSelector: '.infinitescroll a', 
     itemSelector: '#boxes .box', 
     loadingImg: '<?php echo get_bloginfo('stylesheet_directory') ?>/images/loading.gif', 
     loadingText: 'Loading...', 
     donetext: 'No more pages to load.', 
     debug: false 
    }, function(arrayOfNewElems) { 
     $('#boxes').masonry('appended', $(arrayOfNewElems)); 
     if(href != $('.infinitescroll a').attr('href')) { 
      href = $('.infinitescroll a').attr('href'); 
     } 
    }); 
}); 

Ich verwende die neueste Version 2.0b2.120519 der Pual Irish infinite scroll plugin auf einer Wordpress-Seite.

+1

Ist es möglich, ein anschauliches Beispiel des Codes zu sehen brechen? – rlemon

+0

Es ist eine Beta-Site hinter verschlossenen Türen, aber ich habe einen Link für dich im js-Chat hinterlassen. –

Antwort

3

Ich bin nicht 100% sicher, welche Version des Plugins Sie verwenden, aber ich habe in die neueste Distribution eingecheckt und Sie müssen zwei Methoden ausführen, um dies zu arbeiten.

Zuerst müssen Sie in Ihrer Ajax-Funktion destroy the session on success.

$.ajax({ 
    url: 'path/to/something.ext', 
    success: function(data){ 
    //call the method to destroy the current infinitescroll session. 
    $('#boxes').infinitescroll('destroy'); 

    //insert the new data into the container from the_loop() call 
    $('#boxes').html(data); 

    //reinstantiate the container 
    $('#boxes').infinitescroll({      
     state: {            
     isDestroyed: false, 
     isDone: false       
     } 
    }); 

    //call the methods you need on the container again. 
    $('#boxes').infinitescroll({ 
     navSelector: '.infinitescroll', 
     nextSelector: '.infinitescroll a', 
     itemSelector: '#boxes .box', 
     loadingImg: '<?php echo get_bloginfo('stylesheet_directory') ?>/images/loading.gif', 
     loadingText: 'Loading...', 
     donetext: 'No more pages to load.', 
     debug: false 
    }, function(arrayOfNewElems) { 
     $('#boxes').masonry('appended', $(arrayOfNewElems)); 
     if(href != $('.infinitescroll a').attr('href')) { 
     href = $('.infinitescroll a').attr('href'); 
     } 
    }); 
    } 
}); 

Sie könnten es auch eine Funktion machen, binden sich an sie, und unbind/rebind stattdessen eine Menge Code zu wiederholen, aber der Code, den ich skizziert habe sollte eine Kopie + Paste Lösung sein.

+0

Ich hatte diese Lösung gesehen, konnte sie aber nicht zum Laufen bringen. Wie soll der Weg sein und soll man dafür nicht "dokumentfertig" verwenden? –

+0

Hallo @ Ohgodwhy Ich versuche, Ihr Skript zu verwenden, aber beim Debuggen erhalte ich ein 'Uncaught TypeError: Kann Methode' appendTo 'von null' nicht aufrufen. Ich bin zu 1000% sicher, dass die Divs, die ich anrufe, da sind. Weißt du, ob dieser Code mit der neuesten Version funktionieren würde? Vielen Dank! – Jaypee

+0

@Jaypee Hallo. Wenn Sie eine Fehlermeldung erhalten, dass jQuery keine Methode für "null" aufrufen kann, bedeutet dies, dass Ihr Selektor fehlgeschlagen ist. In welcher Eigenschaft auch immer. Kannst du mir kurz zeigen, was dein Selector für dein 'appendTo()' ist? – Ohgodwhy

1

Ich denke, dass es das tun kann. in meiner Seite, ich wat, um unterschiedliches Element zu klicken, um unterschiedliche page.and diese Seite auch infinitescroll zu laden. so ändern i die Quelle unter:

 // creation 
     case 'object': 

      this.each(function() { 

       var instance = $.data(this, 'infinitescroll'); 

      /* if (instance) { 

        // update options of current instance 
        instance.update(options); 

       } else { 
      */ 
       $(this).removeData("infinitescroll"); 

       // initialize new instance 
       $.data(this, 'infinitescroll', new $.infinitescroll(options, callback, this)); 

     // } 

      }); 

jedes Mal, wenn ich das Datum entfernen und eine neue infinitescroll erstellen. Also jedes Mal und jeder Elment ist gut.

0

Anruf

$('#boxes').infinitescroll({      
       state: {            
        isDuringAjax: false, 
        isInvalidPage: false, 
      isDestroyed: false, 
      isDone: false, // For when it goes all the way through the archive. 
      isPaused: false, 
      currPage: 1 

       } 
      }); 
then 
$('#boxes').infinitescroll({ 
     navSelector: '.infinitescroll', 
     nextSelector: '.infinitescroll a', 
     itemSelector: '#boxes .box', 
     loadingImg: '<?php echo get_bloginfo('stylesheet_directory') ?>/images/loading.gif', 
     loadingText: 'Loading...', 
     donetext: 'No more pages to load.', 
     debug: false 
    }, function(arrayOfNewElems) { 
     $('#boxes').masonry('appended', $(arrayOfNewElems)); 
     if(href != $('.infinitescroll a').attr('href')) { 
     href = $('.infinitescroll a').attr('href'); 
     } 
    }); 

Hoffe, es funktioniert

+0

Ihre Antwort wäre wesentlich besser, wenn Sie erklären könnten, warum es funktionieren sollte. – Ben