2015-08-06 2 views
0

Скажем, у меня есть простая кнопка, какВызов функции зарегистрированного обратного вызова события в зависимости от условий

<button id='test'>ClickME</button> 

, на котором через некоторое скриптом (если какой-то другой парень), событие нажмите зарегистрирован, как этот

$('#test').on('click', function(){ 
     alert('click 1'); //Some lines of code 
}); 

Позже на загрузке страницы я запустил мой скрипт поверх него, в котором я хотел выполнить некоторые действия одним и тем же нажатием кнопки. В сценарии, я написал что-то вроде

$('#test').on('click', function(){ 
     alert('click 2'); //Some lines of code 
}); 

В этом случае, когда я нажимаю на кнопку, я получаю два предупреждения, которые понятно.

То, что я хотел достичь, Первый «щелчок 2» должен быть предупрежден и в том же коде, в зависимости от какого-либо условия, я могу или не могу вызвать ранее зарегистрированную функцию, то есть «нажать 1». Я не знаю, можем ли мы достичь таких вещей, и если да, то как я могу предотвратить выполнение уже зарегистрированного события.

Любая помощь приветствуется.

ответ

1

Вы можете отвязать все предыдущие обработчик событий из элемента. До этого вы можете хранить то, что было. Это позволяет писать код, как:

// not your code 
$('#test').on('click', function(){ 
     alert('click 1'); //Some lines of code 
}); 

// your code 
var prevHandler = $._data($("#test")[0], "events").click[0].handler; 

$('#test').off('click'); 

$('#test').on('click', function(){ 
     alert('click 2'); //Some lines of code 
     if (Math.random() > 0.5) 
      prevHandler(); 
}); 

jsfiddle: https://jsfiddle.net/ugefofLs/

+0

Удивительный! Одна вещь, чтобы уточнить, возможно ли это только с помощью jquery или может быть выполнена с помощью простого javascript. –

+0

Рад, что я могу помочь! jQuery в конечном счете написан на javascript, так что да, это возможно; однако он, вероятно, будет еще более запутанным и менее портативным. Одна из лучших вещей в jQuery заключается в том, что это сообщество тестируется для разных браузеров, поэтому вы в значительной степени гарантируете, что он будет работать. Если вы хотите найти реализацию jQuery, то я думаю, что она находится в https://github.com/jquery/jquery/blob/master/src/event.js в строке 857. –

+0

Ты Боже ... Я буду отмечать как принятый. Большое спасибо! –

1

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

The handlers will execute in the order in which they were bound.

Я предлагаю вам объединить два кода блока что-то вроде этого:

$('#test').on('click', function(){ 
     alert('click 2'); //Some lines of code 
    if (some condition){ 
    alert('click 1'); //Some lines of code 
    } 

}); 
+0

Мне не разрешено вносить изменения в скрипт, предоставленные другими! –

1

Если вы не знаете, есть ли не были зарегистрированы другие события, и все еще хотите, чтобы убедиться, что только ваши огни событий, вы можете использовать jQuerys event.stopImmediatePropagation(), чтобы разрешить запуск вашего мероприятия.

event.stopImmediatePropagation()

Сохраняет остальную часть обработчиков от быть выполнена и предотвращает событие из барботажных вверх по DOM tree.Keeps остальных обработчиков от

См код и фрагмент кода ниже

//Change this to false to let both registrered events run 
 
var preventOtherClickEvents = true; 
 

 
var onClick = function(event) { 
 
    if (preventOtherClickEvents) { 
 
    event.stopImmediatePropagation(); 
 
    } 
 

 
    alert('First event handler'); 
 
}; 
 

 
var onClickSecond = function() { 
 
    alert('Second event handler'); 
 
}; 
 

 
$('#button').on('click', onClick); 
 

 
$('#button').on('click', onClickSecond);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="button" id="button" value="Click Me" />

+0

Это хорошо знать о 'stopImmediatePropagation()', но мне не разрешено вносить изменения в скрипт, предоставленный другими. Все, что я могу сделать, это сделать некоторое обходное решение в моем скрипте. anyways thanks! .. :) –

+0

Точка этого сценария, вам не нужно менять никаких других, так как вы можете написать свой собственный код и остановить запуск другого кода, не меняя его! знак равно –

Смежные вопросы