2012-08-17 2 views
3

У меня есть страница, которая восстанавливает данные из json и генерирует список продуктов. Пользователь может переключаться между двумя разными стилями при нажатии кнопки, которая изменяет родительский ul на ul.fullview. При просмотре продуктов с использованием ul.fullview продукты, получившие класс. Highlight, должны отображаться с большим уменьшенным изображением, в то время как другие продукты получают абсолютное положение, чтобы вписаться в макет. Все это делается с помощью CSS и простого tooggleClass(). Проблема заключается в событии mouseenter/mouseleave в этих двух разных представлениях. При просмотре с использованием представления по умолчанию все продукты должны иметь одинаковую анимацию. Когда родительский ul является .fullview, продукты .highlighted должны иметь другую анимацию. Поскольку я работаю с динамически добавленными элементами, мне пришлось использовать .on() вместо .hover(). Как я могу заставить эти селекторы работать с .on()?jQuery - on() проблема с динамически добавленными элементами

$('div.products ul:not(.fullview) li:not(.highlighted)').hover(
    function() { 
    $(this).find($('div.tooltip')).show(); 
    $(this).find($('div.fb-like')).fadeIn(150); 
    }, 
    function() { 
    $(this).find($('div.tooltip')).fadeOut(150); 
    $(this).find($('div.fb-like')).fadeOut(150); 
    } 
); 

$('li.highlighted').hover(
    function() { 
    $(this).find($('div.description')).show(); 
    $(this).find($('div.fb-like')).fadeIn(150); 
    }, 
    function() { 
    $(this).find($('div.description')).fadeOut(150); 
    $(this).find($('div.fb-like')).fadeOut(150); 
    } 
); 

Код выше должен работать, если элементы не были добавлены javascript. Я был в состоянии сделать работу по умолчанию вида с ниже сценарием:

$('div.products ul').on({ 
    mouseenter: function() { 
    $(this).find($('div.tooltip')).show(); 
    $(this).find($('div.fb-like')).fadeIn(150); 
    }, 
    mouseleave: function() { 
    $(this).find($('div.tooltip')).fadeOut(150); 
    $(this).find($('div.fb-like')).fadeOut(150); 
    } 
}, 'li'); 

Но когда я добавляю эти строки, он останавливает загрузку данных JSon:

$('div.products ul.fullview').on({ 
    mouseenter: function() { 
    $(this).find($('div.description')).show(); 
    $(this).find($('div.fb-like')).fadeIn(150); 
    }, 

    mouseleave: function() { 
    $(this).find($('div.description')).fadeOut(150); 
    $(this).find($('div.fb-like')).fadeOut(150); 
    } 
}, 'li.highlighted'); 

Что я делаю неправильно?

+0

+1 хороший вопрос – Nope

+0

у вас есть 'facebook-like' в одной строке, а все остальные относятся к' fb-like'. –

+0

В старом коде у вас есть селектор 'div.products: not (.fullview)' - указав, что класс fullview находился в 'div.products', а в новом коде ваш селектор говорит' div.products ul.fullview' - который указывает, что класс fullview больше не находится в div, но он переместился в ul. –

ответ

2

Вы говорите:

меняет родительскую ул к ul.fullview

Я предположил бы, что делает ul.fullview динамичным, как в момент его связывания просто ul без «fullview ', но затем динамически изменился, чтобы иметь класс.

Попробуйте это:

$('div.products').on({ 
    mouseenter: function() { 
     $(this).find($('div.description')).show(); 
     $(this).find($('div.facebook-like')).fadeIn(150); 
    }, 

    mouseleave: function() { 
     $(this).find($('div.description')).fadeOut(150); 
     $(this).find($('div.fb-like')).fadeOut(150); 
    } 
}, 'ul.fullview li.highlighted');​ 
+1

+1, удивительно, что этот вопрос возникает в разных формах десять раз в день, когда поиск или просто чтение DOCS сделают его довольно понятным, в чем проблема. – adeneo

+0

@adeno: +1, я думаю, что с полными элементами HTML это всегда более очевидно, но когда классы динамически добавляются и используются в селекторе для привязки события, которое я понимаю, это не всегда очевидно. Тем не менее, вы абсолютно на 100% прав, чтение документации jQuery очень и очень полезно. – Nope

1

Я объединил два ответы на JSFiddle для вашего удобства. Скобки и селектора были скорректированы в соответствии с другими ответами.

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