2014-05-23 14 views
9

Sto utilizzando gli isotopi (v1) e ho creato un campo di ricerca dopo an example in a Pen.Filtri + Cerca con Isotopi Breaks Cerca?

Inizialmente funziona, tuttavia, se filtro la galleria Isotopo, il campo di ricerca smette di funzionare.

Credo che la funzione di ricerca continua a funzionare solo non filtra la galleria e non sono sicuro su come risolvere il problema. In effetti, non sono sicuro di quale sia il problema esatto in quanto non vengono emessi errori.

Here is a Fiddle con un esempio funzionante.

Qui è la ricerca, filtro e isotopi JavaScript:

var $container = $('.isotope'), 
    qsRegex, 
    filters = {}; 

$container.isotope({ 
    itemSelector : '.element', 
    masonry : { 
    columnWidth : 120 
    }, 
    getSortData : { 
    name : function ($elem) { 
     return $elem.find('.name').text(); 
    } 
    }, 
filter: function() { 
    return qsRegex ? $(this).text().match(qsRegex) : true; 
} 
}); 

function searchFilter() { 
    qsRegex = new RegExp($quicksearch.val(), 'gi'); 
    $container.isotope(); 
} 

// use value of search field to filter 
var $quicksearch = $('#quicksearch').keyup(debounce(searchFilter)); 

$('#reset').on('click', function() { 
    $quicksearch.val(''); 
    searchFilter() 
}); 

    // store filter for each group 


    $('#filters').on('click', '.button', function() { 
     var $this = $(this); 
     // get group key 
     var $buttonGroup = $this.parents('.button-group'); 
     var filterGroup = $buttonGroup.attr('data-filter-group'); 
     // set filter for group 
     filters[ filterGroup ] = $this.attr('data-filter'); 
     // combine filters 
     var filterValue = ''; 
     for (var prop in filters) { 
     filterValue += filters[ prop ]; 
     } 
     // set filter for Isotope 
     $container.isotope({ filter: filterValue }); 

    }); 

    // debounce so filtering doesn't happen every millisecond 
    function debounce(fn, threshold) { 
    var timeout; 
    return function debounced() { 
     if (timeout) { 
     clearTimeout(timeout); 
     } 
     function delayed() { 
     fn(); 
     timeout = null; 
     } 
     setTimeout(delayed, threshold || 100); 
    } 
    } 

Come posso risolvere il problema?

Nota: sto usando jQuery 2.1.1.

+0

si può fare un violino? –

+0

@DaveA - C'è un violino nella mia domanda. Appena sopra il mio codice c'è il link. – L84

+1

@MohdDhiyaulhaq - Hai modificato la domanda e aggiunto il tag 'jsFiddle'. Non dovresti aggiungere quel tag, da [wiki tag jsFiddle] (http://stackoverflow.com/tags/jsfiddle/info): 'Questo tag dovrebbe essere usato quando si fa una domanda su jsFiddle, non perché la tua domanda contiene semplicemente un esempio ospitato su jsFiddle. – L84

risposta

4

Nell'esempio $('#filters').on('click', '.button', function() interrompendo la funzione di ricerca e si resetta ma inserito all'interno di #filters div così quando si fa clic sul motore di ricerca viene fermato anche.

non ho la soluzione migliore, ma risolvere alcuni problemi:

idea di utilizzare la funzione di chiamare motore posteriore:

var iso = function() { 

//engine here 

} 

e

$(function() { 
    iso(); 
    $('.iso').click(function(){ 
     setTimeout(iso, 500); 
}); 
}); 

senza setTimeout si può' lavoro.

Ma non risolve il problema principale

sguardo FIDDLE e capirete cosa intendo

Oppure si può mettere solo resettare e visualizzare tutti i pulsanti esterni #filters div

3

Ho affrontato lo stesso problema implementando filtri + funzionalità di ricerca.

Ho risolto questo problema passando la funzione filtro alla chiamata Isotope ($container.isotope();) nella funzione di ricerca (function searchFilter(){...}) anziché durante l'inizializzazione dell'istanza Isotope.

Così, nel codice che dovrebbe essere simile a questo:

// No filter specified when initializing the Isotope instance 
$container.isotope({ 
    itemSelector : '.element', 
    masonry : { 
    columnWidth : 120 
    }, 
    getSortData : { 
    name : function ($elem) { 
     return $elem.find('.name').text(); 
    } 
    } 
}); 
// Instead, the filter is specified here 
function searchFilter() { 
    qsRegex = new RegExp($quicksearch.val(), 'gi'); 
    $container.isotope({ 
    filter: function() { 
    return qsRegex ? $(this).text().match(qsRegex) : true; 
    } 
    }); 
} 
+0

Sarebbe possibile mettere la tua soluzione in un violino? Sono ancora un po 'confuso su come funziona la tua soluzione. Grazie per il tuo tempo, in entrambi i casi. – Dylan

+1

Sicuro! http: // jsfiddle.net/vD62w/3/ La parte importante è l'aggiunta della funzione filtro sull'inizializzazione degli isotopi su "searchRilter" invece che all'inizio. – esbanarango

+0

Grazie per quello, molto utile – Dylan