Можете ли вы связать .click () так, чтобы он срабатывал до onclick? - PullRequest
13 голосов
/ 14 июля 2011

Я пишу jQuery для приложения, которое создается в JSF. Компоненты JSF используют множество собственных JS для выполнения всего, что делает JSF, и для обработки всего этого используют множество атрибутов onclick.

Существует ли действительный / правильный способ привязать ваше собственное событие click к элементу и убедиться, что ваше событие срабатывает до события onclick по умолчанию? Похоже, что по умолчанию функция щелчка jQuery запускается после любого вызова встроенной функции onclick.

Ответы [ 4 ]

16 голосов
/ 14 июля 2011

В jQuery события запускаются строго в том порядке, в котором они были зарегистрированы.

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

Что-то вроде:

$('[onclick]').each(function() {
    var handler = $(this).prop('onclick');
    $(this).removeProp('onclick');
    $(this).click(handler);
});

См. http://jsfiddle.net/alnitak/2SCTK/

Итак, зарегистрируйтесьсначала ваши собственные обработчики с помощью jQuery, а затем вызовите приведенный выше код для удаления исходных встроенных обработчиков onclick и перерегистрации их, как если бы jQuery добавил их.

EDIT код упрощен доиспользуйте оригинальную функцию - jQuery гарантирует, что функция будет вызвана с правильным контекстом.Предыдущий код, который явно устанавливал контекст на window, был неверным.

7 голосов
/ 14 июля 2011

Вы можете удалить событие onClick из элемента DOM, а затем повторно связать его, используя jQuery.

<div id="click" onclick="alert('DOM')">CLICK ME</div>

$('#click').click(function(){
    alert('jQuery');
});

var clickFunc = $('#click').prop('onclick');
$('#click').removeProp('onclick');
$('#click').click(clickFunc);

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

Демо: http://jsfiddle.net/wYd5t/2/

1 голос
/ 14 июля 2011

Вы можете использовать onmousedown для элемента.

1 голос
/ 14 июля 2011

Невозможно назначить порядок запуска событий для одного и того же слушателя на одном и том же элементе. Каждый браузер может запускать события в любом порядке по своему выбору.

...