Wie die Umsetzung Isotop mit Paginierung

Bin ich versucht zu implementieren-Isotop mit der Paginierung auf meiner WordPress-Seite (die offensichtlich ein problem für die meisten Menschen). Habe ich kommen mit einem Szenario, das kann funktionieren, wenn ich kann herausfinden, ein paar Dinge aus.

Auf meiner Seite, ich habe diesen Teil meiner isotope-Skript -

$('.goforward').click(function(event) {
    var href = $(this).attr('href');
    $('.isotope').empty();
    $('.isotope').load(href +".html .isotope > *");
    $( 'div.box' ).addClass( 'isotope-item' );
    $container.append( $items ).isotope( 'insert', $items, true );
    event.preventDefault();
});

Dann bin ich mit dieser Paginierung Funktion, die ich geändert hier die "goforward" Klasse --

function isotope_pagination($pages = '', $range = 2)
{  
     $showitems = ($range * 2)+1;  

     global $paged;
     if(empty($paged)) $paged = 1;

     if($pages == '')
     {
         global $wp_query;
         $pages = $wp_query->max_num_pages;
         if(!$pages)
         {
             $pages = 1;
         }
     }   

     if(1 != $pages)
     {
         echo "<div class='pagination'>";
         for ($i=1; $i <= $pages; $i++)
         {
             if (1 != $pages &&( !($i >= $paged+$range+1 || $i <= $paged-$range-1) || $pages <= $showitems ))
             {
                 echo ($paged == $i)? "<a href='".get_pagenum_link($i)."' class='inactive goforward'>".$i."</a>":"<a href='".get_pagenum_link($i)."' class='inactive goforward' >".$i."</a>";
             }
         }
         echo "</div>\n";
     }
}

1. Problem - habe ich Probleme mit dem filtern/Sortieren. Es filtert feine für die erste Seite, aber Sortieren nicht. Auf der zweiten Seite oder einer anderen Seite geladen, es nicht Anhängen/einfügen oder auch filter/Sortierung beim Start frisch auf dieser Seite. Stattdessen, wenn Sie versuchen zu tun, so es gibt mir diese Fehlermeldung --

Uncaught TypeError: Cannot read property '[object Array]' of undefined

2. Problem - Beim laden der Seite-Fragmente, gibt es eine Verzögerung und die aktuelle Seite immer noch sichtbar ist, bevor die nächste Seite-fragment geladen wird, an seinem Platz.

Ich kenne eine Menge Leute haben Probleme mit der Isotopen-und Seitenumbruch, normalerweise, am Ende mit infinite scroll, obwohl Isotop Autor nicht zu empfehlen.

Also meine Theorie ist das laden von Inhalten über load() und einem callback von einer Art auf nur die Anzeige der gefilterten Elemente.

Irgendwelche Ideen auf, wie dies zu erreichen?

Meine gesamte isotope-Skript ---

$(function () {
    var selectChoice, updatePageState, updateFiltersFromObject,
    $container = $('.isotope');
    $items = $('.item');  

    ////////////////////////////////////////////////////////////////////////////////////
    ///EVENT HANDLERS
    ////////////////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////
        //Mark filtering element as active/inactive and trigger filters update
        $('.js-filter').on( 'click', '[data-filter]', function (event) {
          event.preventDefault();
          selectChoice($(this), {click: true});
          $container.trigger('filter-update');
        });
        //////////////////////////////////////////////////////
        //Sort filtered (or not) elements
        $('.js-sort').on('click', '[data-sort]', function (event) {
          event.preventDefault();
          selectChoice($(this), {click: true});
          $container.trigger('filter-update');
        });
        //////////////////////////////////////////////////////
        //Listen to filters update event and update Isotope filters based on the marked elements
        $container.on('filter-update', function (event, opts) {
          var filters, sorting, push;
          opts = opts || {};
          filters = $('.js-filter li.active a:not([data-filter="all"])').map(function () {
            return $(this).data('filter');
          }).toArray();
          sorting = $('.js-sort li.active a').map(function () {
            return $(this).data('sort');
          }).toArray();
          if (typeof opts.pushState == 'undefined' || opts.pushState) {
            updatePageState(filters, sorting);
          }
          $container.isotope({
            filter: filters.join(''),
            sortBy: sorting
          });

        });
        //////////////////////////////////////////////////////
        //Set a handler for history state change
        History.Adapter.bind(window, 'statechange', function () {
          var state = History.getState();
          updateFiltersFromObject(state.data);
          $container.trigger('filter-update', {pushState: false});
        });
        ////////////////////////////////////////////////////////////////////////////////////
        ///HELPERS FUNCTIONS
        ////////////////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////
        //Build an URI to get the query string to update the page history state
        updatePageState = function (filters, sorting) {
          var uri = new URI('');
          $.each(filters, function (idx, filter) {
            var match = /^\.([^-]+)-(.*)$/.exec(filter);
            if (match && match.length == 3) {
              uri.addSearch(match[1], match[2]);
            }
          });
          $.each(sorting, function (idx, sort) {
            uri.addSearch('sort', sort);
          });
          History.pushState(uri.search(true), null, uri.search() || '?');
        };
        //////////////////////////////////////////////////////
        //Select the clicked (or from URL) choice in the dropdown menu
        selectChoice = function ($link, opts) {
          var $group = $link.closest('.btn-group'),
              $li = $link.closest('li'),
              mediumFilter = $group.length == 0;
          if (mediumFilter) {
            $group = $link.closest('.js-filter');
          }

          if (opts.click) {
            $li.toggleClass('active');
          } else {
            $li.addClass('active');
          }
          $group.find('.active').not($li).removeClass('active');
          if (!mediumFilter) {
            if ($group.find('li.active').length == 0) {
              $group.find('li:first-child').addClass('active');
            }
            $group.find('.selection').html($group.find('li.active a').first().html());
          }
        };
        //////////////////////////////////////////////////////
        //Update filters by the values in the current URL
        updateFiltersFromObject = function (values) {
          if ($.isEmptyObject(values)) {
            $('.js-filter').each(function () {
                selectChoice($(this).find('li').first(), {click: false});
            });
            selectChoice($('.js-sort').find('li').first(), {click: false});
          } else {
            $.each(values, function (key, val) {
              val = typeof val == 'string' ? [val] : val;
              $.each(val, function (idx, v) {
                var $filter = $('[data-filter=".' + key + '-' + v + '"]'),
                    $sort = $('[data-sort="' + v + '"]');
                if ($filter.length > 0) {
                  selectChoice($filter, {click: false});
                } else if ($sort.length > 0) {
                  selectChoice($sort, {click: false});
                }
              });
            });
          }
        };
        ////////////////////////////////////////////////////////////////////////////////////
        ///Initialization
        ////////////////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////
        //Initialize Isotope
    $container.imagesLoaded( function(){
        $container.isotope({
            masonry: { resizesContainer: true },
            itemSelector: '.item',
            getSortData: {
                date: function ( itemElem ) {
                    var date = $( itemElem ).find('.thedate').text();
                    return parseInt( date.replace( /[\(\)]/g, '') );
                },
            area: function( itemElem ) { //function
                var area = $( itemElem ).find('.thearea').text();
                return parseInt( area.replace( /[\(\)]/g, '') );
            },
            price: function( itemElem ) { //function
                var price = $( itemElem ).find('.theprice').text();
                return parseInt( price.replace( /[\(\)]/g, '') );
            }
        }
    });

    var total = $(".next a:last").html();
    var pgCount = 1;
    var numPg = total;
    pgCount++;

    $('.goback').click(function() {
        $('.isotope').empty();
        $('.isotope').load("/page/<?php echo --$paged;?>/?<?php echo $_SERVER["QUERY_STRING"]; ?>.html .isotope > *");
        $container.append( $items ).isotope( 'insert', $items, true );
        $( 'div.box' ).addClass( 'isotope-item' );
   });

   $('.goforward').click(function(event) {
       var href = $(this).attr('href');
       $('.isotope').empty();
       $('.isotope').load(href +".html .isotope > *");
       $( 'div.box' ).addClass( 'isotope-item' );
       $container.append( $items ).isotope( 'insert', $items, true );
       event.preventDefault();
   });
});
        //////////////////////////////////////////////////////
        //Initialize counters
        $('.stat-count').each(function () {
          var $count = $(this),
              filter = $count.closest('[data-filter]').data('filter');
          $count.html($(filter).length);
        });
        //////////////////////////////////////////////////////
        //Set initial filters from URL
        updateFiltersFromObject(new URI().search(true));
        $container.trigger('filter-update', {pushState: false});
      }); 
});
  • welche Zeile wird der Fehler Uncaught TypeError: Cannot read property '[object Array]' of undefined generiert?
  • jquery.Isotop.min.js:13 Uncaught TypeError: Cannot read property '[object Array]' undefined
  • Sind Sie sicher, dass Sie copy/Paste Ihre gesamte Skript? Da sieht es aus wie deine letzten beiden Teile (beginnend mit Zähler Initialisieren..) sind außerhalb des Bereichs der jQuery-ready-IIFE. Wenn das der Fall ist, $container nicht definiert werden, und vielleicht ist das ja der TypeError.
  • Ich glaube, Sie haben einen Fehler in dieser Zeile: $('.Isotop').load(href +".html-Code .isotope > *"); Das sollte sein: $('.Isotop').load(href +" .html-Code .isotope > *"); ( ein space char fehlt zwischen +" und .html). Dieser Raum ist notwendig, um jquery zu verstehen, dass Sie verwenden die Besondere syntax, die nimmt nur einen Teil der eingehenden Seite... Das könnte bedeuten, dass die gesamten zurückgegebenen Seite würde Hinzugefügt werden .isotope element, das dazu führen könnte, alle anderen Funktionen arbeiten nicht richtig, wie das nicht finden, Elemente in der erwarteten position in der Hierarchie der Seite.
  • Auch ein weiteres problem: Sie definieren das $items-variable Wert NUR in der startup aufrufen: dies bedeutet, dass diese variable enthält die Elemente, die in der Seite BEIM Systemstart, nicht diejenigen, die jetzt in die Seite: Wenn der container enthält A,B,C, das bedeutet, dass an der Seite init, die Sie zuweisen $Elemente A,B,C. Dann Ruf Sie an .laden, und der container-Inhalt wird nun D,E,F, ABER $Elemente enthält NOCH A,B,C! So fügen Sie $items = $('.Element'); nur vor dem container.append(... sonst würde es nicht funktionieren: wenn du es nicht tust, wirst du immer anrufen Isotop von A,B,C, und das ist genau das, was passiert!
InformationsquelleAutor Rich | 2016-01-19
Schreibe einen Kommentar