Можете ли вы связать .click(), чтобы он срабатывал до onclick?

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

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

Ответ 1

В 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, затем вызовите приведенный выше код, чтобы удалить обработчики исходного текста inline onclick и перерегистрировать их, как если бы они добавили jQuery.

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

Ответ 2

Вы можете удалить событие 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/

Ответ 3

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

Ответ 4

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