Отмена всплытия событий на определенных элементах – javascript

По сути, я хочу щелкнуть в любом месте страницы, кроме поля ввода, и на одном элементе уровня блока (по расширению все дочерние элементы) стереть указанное поле ввода. Поэтому я добавляю событие onclick ко всему документу. Чтобы сохранить вышеуказанные условия, я поставил условия перед четкими инструкциями, чтобы делать это только в том случае, если событие не возникло из-за определенных элементов.

clearSearch = function (e){
 e ? e : e = window.event;
 e.target ? target = e.target : target = e.srcElement;
 if (target.nodeName != "INPUT" && document.getElementById('ul'))
 document.getElementById('input').value = "";
}

С помощью этого метода, если я хочу продолжать нажимать на ul, чтобы не вызывать действие, я должен явно указать это в этом операторе if. Затем я должен сделать то же самое для элементов li под ul. Затем я создаю любых других детей.

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


person sobertillnoon    schedule 26.02.2010    source источник


Ответы (1)


Вы можете удалить сложную логику из clearSearch и просто очистить окно поиска. Затем добавьте несколько новых обработчиков onClick к элементам, которые вы не хотите вызывать этим методом. В этих обработчиках установите event.cancelBubble в значение true, чтобы предотвратить вызов функции clearSearch.

Из quirksmode:

For a complete cross-browser experience do:

function doSomething(e)
{
    if (!e) var e = window.event;
    e.cancelBubble = true;
    if (e.stopPropagation) e.stopPropagation();
}
person Mark Byers    schedule 26.02.2010
comment
Верно, но нужно ли мне делать это для каждого элемента или отмена пузырька на ul позаботится обо всех его дочерних элементах? - person sobertillnoon; 27.02.2010
comment
@sobertilnoon: если вы остановите всплывающую подсказку событий на ‹ul›, она также будет работать для всех элементов списка. - person Mark Byers; 27.02.2010
comment
да, мне просто нужно убедиться, что событие находится в режиме пузыря, а не в режиме захвата. сработало, как только я понял, что поставил true, а не false. Спасибо. - person sobertillnoon; 27.02.2010