2013-08-21 6 views
-1

У меня есть привязка в элементе списка. Оба элемента имеют событие. Я бы не хотел, чтобы щелкнуть элемент списка, щелкнув якорь внутри.jQuery: неотъемлемое событие ребенка?

Хотелось бы избежать хаоса. Я нашел эти функции, но я не был в состоянии использовать их, как я хотел:

Это код:

// HTML 
<ul> 
    <li id="1">Item #1 <a href="" class="delete">[DEL]</a></li> 
    <li id="2">Item #2 <a href="" class="delete">[DEL]</a></li> 
    <li id="3">Item #3 <a href="" class="delete">[DEL]</a></li> 
    <li id="4">Item #4 <a href="" class="delete">[DEL]</a></li>  
</ul> 

// JS 
$("ul").sortable(); 

$(document).on("click", "li", function() { 
    alert("list-item clicked."); 
}); 

$(document).on("click", "a.delete", function(e) { 
    e.preventDefault(); 
    if (confirm("Del?")) { 
     alert("list-item clicked."); 
    } 
    // do nothing 
}); 

Вот скрипка: http://jsfiddle.net/UtE87/1/

Каков наилучший способ? Заранее большое спасибо!

ответ

2

Именно из-за распространения события вам необходимо остановить распространение события. Это может быть сделано путем вызова e.stopPropagation(), но так как вы предотвращения действия по умолчанию, кроме того, вы можете сделать так, возвращая ложное из обработчика события

$(document).on("click", "a.delete", function(e) { 
    if (confirm("Del?")) { 
     console.log("list-item a clicked."); 
    } 
    // do nothing 

    return false; //prevent default and stop propagation 
}); 

Демо: Fiddle

+0

Это просто, ничего себе. Мне стыдно. Спасибо, я приму свой ответ, как только мне позволено! –

+2

@ Mr.Bombastic: Обратите внимание, что это работает только потому, что jQuery делает магию в фоновом режиме. Вы используете * событие делегирование *, поэтому оба обработчика привязаны к одному элементу. Без jQuery 'e.stopPropagation()' не будет работать здесь (к сожалению, документация не объясняет, что именно происходит). –

1

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

Демо: http://jsfiddle.net/k5sdC/1/

JQuery:

$(document).on("click", "li", function(e) { 
    if (!$(e.target).is('a.delete')){ 
     alert("list-item clicked."); 
    } 
}); 
Смежные вопросы