2013-08-16 2 views
1

У меня есть функция поиска, в которой отображаются только конкретные панели аккордеона, когда сопоставляется поисковый запрос. См. fiddle. Аккордеон расширяется (class = "in"), когда sth сопоставляется. Как только поле поиска будет очищено, я бы хотел, чтобы аккордеон вернулся к обрушению. Для этого я пытаюсь удалить добавленный класс = "in", но кажется, что он не обновляется, когда поле очищается. Есть идеи?jquery: как обновить событие keyup для аккордеона

var $infoPanels = $('.panel-info'), 
    cachedText = []; 
$infoPanels.each(function (i, v) { 
    cachedText[i] = $(this).text().toLowerCase(); 
}); 

$('#search-criteria').on('keyup', function() { 
    var g = $(this).val().toLowerCase(); 
    if (g !== ""){ 
    $infoPanels.parentsUntil('.accordion').hide().removeClass("in"); 
    } 
    $.each(cachedText, function (i, v) { 
     if (g.length > 0 && v.indexOf(g) !== -1) { 
      $infoPanels.eq(i).show().parentsUntil('.accordion').addClass("in").show(); 
     } 
    }); 
}); 

UPDATE: я получил эту работу, добавляя еще, если посмотреть Fiddle.

ответ

0

Код проверяет, имеет ли значение search-criteria значение, а затем удаляет класс. Вместо этого он должен проверить, g == "", а затем удалить класс. Также добавьте условие else к этому условию, поэтому класс in не добавляется, когда g == "".

$('#search-criteria').on('keyup', function() { 
    var g = $(this).val().toLowerCase(); 

    if (g == ""){ //check if g is empty string 

     $infoPanels.parentsUntil('.accordion').hide().removeClass("in"); 

    }else{ //if not empty add the class 

     $.each(cachedText, function (i, v) { 
      if (g.length > 0 && v.indexOf(g) !== -1) { 
       $infoPanels.eq(i).show().parentsUntil('.accordion').addClass("in").show(); 
      } 
     }); 
    } 
}); 

Рабочий пример:http://jsfiddle.net/bsXGp/2/

+0

@Blitz Любая удача? –

+0

Спасибо за помощь, Кевин. Когда поле поиска будет очищено, все исчезнет в вашем решении. Он должен удалить только класс, не скрывающий аккордеон. Но я использовал вашу идею, чтобы добавить else, если ([Fiddle] (http://jsfiddle.net/7Y87R/). Это очень хорошо работает в моей домашней версии, если я удаляю символы очень медленно, иначе только аккордеоны, совпадающие с поиском – Blitz

+0

@Blitz Glad Я мог бы помочь! По общему признанию, я был немного не уверен в своих требованиях. Хорошая работа, выясняя это. –

0

Попробуйте

var $infoPanels = $('.panel-info'), 
    cachedText = []; 
$infoPanels.each(function (i, v) { 
    cachedText[i] = $(this).text().toLowerCase(); 
}); 

$('#search-criteria').on('keyup', function() { 
    var g = $(this).val().toLowerCase(); 
    $infoPanels.hide(); 
    $.each(cachedText, function (i, v) { 
     if (g.length > 0 && v.indexOf(g) !== -1) { 
      $infoPanels.eq(i).show(); 
     } 
    }); 
}); 

Demo: Fiddle или Fiddle

+0

Спасибо. Это решение скроет только содержимое панелей, но все аккордеоны отображаются с поиском и без него. Я хочу показать только соответствующие аккордеонные и инфо-панели. – Blitz

Смежные вопросы