0

В следующем примере http://jsfiddle.net/anu4nits/449d5j8e/как остановить выполнение события щелчка от обработчика события OnChange

<input type="text" id="in" /> <input type="button" value="click" id="button" /> $('#in').change(function() { console.log('change event'); dialog.dialog("open"); }); $('#button').on('click', function (e) { console.log('click event'); });

Я прилагаю два события, одно событие OnChange на текст и другой нажмите на кнопку событие. Если я пишу что-то в текстовом поле и нажимаю на кнопку, тогда обработчик события изменения и обработчик события click должен быть выполнен соответственно. Но поскольку я вызываю модальный диалог в обработчике события изменения, обработчик события click не выполняется, что ожидается, поскольку модальное диалоговое окно не позволит выполнять фоновые действия. Но это только с хром и мозилла. В обработчике IE оба события выполняются.

Я хочу, чтобы последовательное поведение для всех браузеров желательно, я не хочу, чтобы выполнение обработчика кликов в IE. Я также не хочу помещать флаг на глобальном уровне для проверки состояния. Также я не могу отделить событие от кнопки, как в моем ID кнопки приложения, и его обработчик генерируется во время выполнения. Есть ли другой способ остановить выполнение события click от обработчика события изменения.

ответ

0

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

0

использование stopPropagation, но проще решение идти с флагом

$('#in').change(function(e) { 
    console.log('change event'); 
    dialog.dialog("open"); 
    e.stopPropagation(); 
}); 
+0

щелчок и изменение обоих являются отдельными событиями, и поэтому невозможно остановить распространение одного из другого таким образом. Ваш код остановит распространение только в событии обмена в дереве dom – Ninja

+0

попробуйте этот скрипт. Это предотвратит запуск события клика по мере возникновения события изменения. – shaN

+0

В каком браузере вы выполнили это? – Ninja

0

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

<input onchange="Dont(this);Work()">link</input> 

Здесь я нуждался в Dont() условно остановить все другие функции, как работа(). Я просто бросил исключение, потому что ничего другого не получилось.

function Dont(button){ 
    if($(button).data("somecondition")){ 
     throw "NeedToStopEveryFurtherCodeExecution!"; 
    } 
} 

Event.stopImmediatePropagation(); не помогло. Я не уверен, почему, но я думаю, что есть проблема при использовании внешнего .js-файла.

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

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