Моя основная цель - предотвратить функцию .click для определенного дочернего объекта. Чтобы добиться этого, я проверяю, является ли выбранный элемент НЕ тем конкретным дочерним элементом.
HTML:
<p class = "participate_session_red">
<input ...> <label> TEXT </label>
<span class = "participate_session_more">
</span>
</p>
jQuery:
$(".participate_session_red").click(function(e){
if (e.target != $(this).find(".participate_session_more").get())
{
$(this).find(".participate_session_more").slideToggle();
}
});
Поэтому, чтобы проверить, работает ли мой код, я просто использую предупреждение для получения текущего объекта.
alert(e.target); returns that element that was clicked. For example:
[object HTMLParagraphElement],[object HTMLLabelElement],[object HTMLSpanElement], ...
alert($(this).find(".participate_session_more").get()); returns only
[object HTMLSpanElement]
Так что теоретически оба могут возвращать [object HTMLSpanElement], и когда это происходит, мой код все еще выполняется, даже если этого не должно быть.
get()
без аргумента возвращает множество. Массив никогда не может быть равен элементу DOM.
Если вы хотите узнать, не является ли e.target
совпадающим элементом первый из вашего find
, передайте 0
в get
:
if (e.target != $(this).find(".participate_session_more").get(0))
В качестве альтернативы вы можете увидеть, содержит ли объект jQuery, возвращаемый find
, e.target
через index
:
if ($(this).find(".participate_session_more").index(e.target) == -1)
Более короткий тест для написания — использовать is()
или hasClass()
, которые возвращают логические значения.
$(".participate_session_red").click(function(e){
if (!$(e.target).is('.participate_session_more'))
{
$(this).find(".participate_session_more").slideToggle();
}
});
Результатом get() является массив, поэтому нет смысла напрямую сравнивать его со значением e.target. Вам нужно посмотреть, является ли массив содержит целевым элементом или нет