Jump to content
  • 0

Глюк jQuery или я чего-то не понимаю?


VJiK
 Share

Question

HTML:

<ul class="b-sideMenu>
<li class="cur"><span>1</span></li>
<li><span>2</span></li>
<li><span>3</span></li>
</ul>

JS #1:

$('#menu :not(.cur) SPAN').each(function(){
console.log($(this).text())
});
$('#menu').on('click', ':not(.cur) SPAN', function(){
console.log($(this).text())
});

В консоль выводится "2" и "3" (логично).

События click работает для всех SPAN. Почему? Должно работать для 2 и 3.

JS #2:

$('#menu >:not(.cur) SPAN').each(function(){
console.log($(this).text())
});
$('#menu').on('click', '>:not(.cur) SPAN', function(){
console.log($(this).text())
});

В консоль выводится "2" и "3" (логично).

События click не работает ни для одного SPAN. Почему? Должно работать для 2 и 3.

JS #3:

$('#menu LI:not(.cur) SPAN').each(function(){
console.log($(this).text())
});
$('#menu').on('click', 'LI:not(.cur) SPAN', function(){
console.log($(this).text())
});

В консоль выводится "2" и "3" (логично).

События click работает для SPAN "2" и "3" (логично).

Собственно, не могу понять почему в JS #1 и JS #2 некорректно вешаются события на SPAN?

PS jQuery версии 1.7.1

Link to comment
Share on other sites

9 answers to this question

Recommended Posts

  • 0

':not(.cur) SPAN'

Если перед :not() не указан селектор, то берется *. Это значит, что будет найден любой элемент, у которого нет класса cur, внутри которого на любой глубине есть SPAN. Так вот UL подпадает под данное правило.

>:not(.cur) SPAN'

Найти любой элемент, у которого в прямом подчинении нет ни одного элемента с классом .cur, а у него найти потомка SPAN. Так вот UL содержит один элемент, значит ожидаемое условие не будет выполнено

Собственно, не могу понять почему в JS #1 и JS #2 некорректно вешаются события на SPAN?

Все работает так, как и написано, но вы имеете свое представление о том, как это должно работать. Посему лучше всего поизучать матчасть.

  • Like 1
Link to comment
Share on other sites

  • 0

Понял в чём тупил. Я думал поиск начинается внутри #menu и не включает в себя сам #menu.

Спасибо за объяснения!

Приведенный селектор, если не ошибаюсь, работает вообще внутри всего документа.

Link to comment
Share on other sites

  • 0

$('#menu').on('click', 'LI:not(.cur) SPAN', function(){
console.log($(this).text())
});

Нет, тут как раз событие вешается на #menu, а потом в этом блоке уже ищется селектор 'LI:not(.cur) SPAN', и если найдено - выполняется функция.

Link to comment
Share on other sites

  • 0

Нет, тут как раз событие вешается на #menu, а потом в этом блоке уже ищется селектор 'LI:not(.cur) SPAN', и если найдено - выполняется функция.

Проверь, на всякий случай.. Создай клон всего блока меню, с другой id, и посмотри как все получится

Link to comment
Share on other sites

  • 0

ну вообще нельзя же несколько id использовать))

А если создать клон - то будет действовать и внутри клона, но не на всём документе.

Внимательно прочитай, я же написал, что с другим id

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy