2016-09-19 2 views
0

Я работаю над страницей, которая отображает и скрывает элементы на основе фильтров, то есть устанавливает элементы списка в display:block или display:none на основе критериев - и я хотел бы отобразить сообщение, когда нет товаров которые показываются (например, «извините, ни один из элементов не соответствуют вашим критериям».) Если мой список выглядит следующим образом:Функция изменения jQuery для скрытых дочерних элементов

<ul class="list"> 
    <li class="item">Item 1</li> 
    <li class="item">Item 2</li> 
    <li class="item">Item 3</li> 
</ul> 

Я пробовал функцию следующих change на основе этого SO thread:

$("body").on('change', function() { 
 
    if ($('.list').children(':visible').length == 0) { 
 
    console.log('none visible'); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<ul class="list"> 
 
    <li class="item">Item 1</li> 
 
    <li class="item">Item 2</li> 
 
    <li class="item">Item 3</li> 
 
</ul>

Но он, похоже, не работает? Любая помощь здесь очень ценится.

+1

Я думаю, что нет ничего, что запускает слушателя вашего мероприятия. Когда тело меняется? Я думаю, что вы хотите показать это, когда страница загружена, поэтому просто удалите '$ (" body "). On ('change', function() {' wrapper. – vaso123

+0

@karacsi_maci Я использую прослушиватель событий, потому что элементы в '.list' динамически фильтруются (устанавливаются на' display: none' или 'display: block') в разных вариантах выбора ... – nickpish

+0

как будет происходить событие изменения, если все параметры списка скрыты? –

ответ

0

Возможно, я что-то пропустил, но если звучит так, как всегда, вы можете просто сделать простой length при загрузке страницы.

if ($('.list li').length = 0) { 
console.log('none visible'); 
} 

http://codepen.io/justdan/pen/EggZQx

+0

спасибо за ответ; но мне нужно запустить проверку, когда фильтры были нажаты, что влияет на видимость элементов списка динамически - это только срабатывает при загрузке страницы. – nickpish

+0

Ах да, это правда. Вот быстрая скрипка с возможной идеей. Если вы можете совместить 'li's' вы отфильтровываете и' .remove() 'их, вы можете получить обновленную длину списка динамически. https: // jsfiddle.net/9hxazkoc/ –

1

Вы не показали нам фильтры, которые вызывают событие изменения, поэтому я составил примерный входной фильтр:

<ul class="list"> 
    <li class="item">Item 1</li> 
    <li class="item">Item 2</li> 
    <li class="item">Item 3</li> 
</ul> 
<input type="text" class="filter"> 

Чтобы вызвать событие и журнал когда нет элементов списка:

$(".filter").on("blur", function() { 
    if ($('.list').children(':visible').length == 0) { 
    console.log('none visible'); 
    } 
}); 

Here is a Fiddle Demo.

Конечно, вам может потребоваться настроить тип события - это зависит от того, какой тип элементов является фильтром. В моем примере я использовал элемент ввода, и поэтому blur является подходящим событием.

Если ваши фильтры являются элементами ссылок внутри div с классом filter, то click будет подходящим событием.

$(".filter a").on("click", function() { ... 
+0

@nickpish - Я вижу вырубку после щелчка по Москве. После нажатия «Управление персоналом» я вижу ошибку. Я бы порекомендовал вам использовать консольное ведение журнала в вашем событии, чтобы проверить, запускается событие (так что поставьте его как первую строку в функции), а затем проверите содержимое '$ ('. List'). Children() ', чтобы понять, почему условие не выполняется. –

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