Сказано, что то, когда мы обрабатываем "событие щелчка", возвращая false или звоня event.preventDefault () имеет значение, в который
различие - то, что preventDefault только предотвратит действие стандартного события для появления, т.е. перенаправление страницы при щелчке ссылки, представление формы, и т.д. и возвращать false также остановит поток события.
Делает это означает, если событие щелчка несколько раз регистрируется для нескольких действий, с помощью
$('#clickme').click(function() { … })
возвращение false будет мешать другим обработчикам работать?
Я нахожусь на Mac теперь и так могу только использовать Firefox и Chrome, но не IE, который имеет другую модель событий и протестировал ее на FF и Chrome путем добавления 3 обработчиков, и все 3 обработчика работали без любой остановки …. таким образом, какова реальная разница, или, там ситуация, где "остановка потока события" не желательна?
это связано с
Используя анимационный jQuery (), если элемент, на который нажимают, является"
и
Что является различием между e.preventDefault (); и возвратите false?
надеется, что этот код может вам это объяснить ...
html
<div>
<a href="index.html" class="a1">click me</a>
<a href="index.html" class="a2">click me</a>
</div>
jquery
$('div').click(function(){
alert('I am from <div>');
});
$('a.a1').click(function(){
alert('I am from <a>');
return false; // this will produce one alert
});
$('a.a2').click(function(e){
alert('I am from <a>');
e.preventDefault(); // this will produce two alerts
});
или
$('div').click(function(){
alert('I am from <div>');
});
$('a').click(function(){
alert('I am from <a>');
});
$('a.a1').click(function(){
alert('I am from <a class="a1">');
return false;
});
$('a.a2').click(function(e){
alert('I am from <a class="a2">');
e.preventDefault();
});
Запись return false
или e.preventDefault ()
не предотвратит запуск других обработчиков.
Скорее, они предотвратят реакцию браузера по умолчанию, такую как переход по ссылке.
В jQuery вы можете написать e.stopImmediatePropagation ()
, чтобы предотвратить запуск других обработчиков.
return false
и preventDefault ()
предназначены для предотвращения действия браузера по умолчанию, связанного с событием (например, переход по ссылке при нажатии). Для каждого из трех сценариев существует свой метод:
1. Обработчик событий добавлен с помощью addEventListener ()
(браузеры, отличные от IE) . В этом случае используйте метод preventDefault ()
объекта Event
. Остальные обработчики события по-прежнему будут вызываться.
function handleEvent(evt) {
evt.preventDefault();
}
2. Обработчик событий добавлен с помощью attachEvent ()
(IE) . В этом случае установите для свойства returnValue
объекта window.event
значение true
. Другие обработчики события по-прежнему будут вызываться, и они также могут изменить это свойство.
function handleEvent() {
window.event.returnValue = false;
}
3. Обработчик событий добавлен с помощью атрибута или свойства обработчика событий .
<input type="button" value="Do stuff!" onclick="return handleEvent(event)">
или
button.onclick = handleEvent;
В этом случае return false
выполнит задание. Любые другие обработчики событий, добавленные через addEventListener ()
или attachEvent ()
, по-прежнему будут вызываться.
function handleEvent() {
return false;
}
Иногда слушатель событий хочет отменить побочные эффекты события, которое интересует. Представьте себе текстовое поле, в котором вы хотите разрешить только числа. Поскольку текстовые поля могут принимать все, что угодно, становится необходимым указать браузеру игнорировать не набранные числа. Это достигается путем прослушивания ключевых событий и возврата false, если введен неправильный ключ.
Это не полностью отвечает на ваш вопрос, но на днях я использовал e.preventDefault()
в YUI для элемента, чтобы подавить действие
href
, поскольку я хотел, чтобы только JavaScript onclick
событие имело контроль (если JS не обнаружено). В этой ситуации остановка всей цепочки событий не повлияла бы на меня.
Но за пару дней до этого у меня был , вложенный в
элемент, и мне пришлось использовать условие в обработчике событий, чтобы определить, является ли щелкнутая цель меткой, поскольку ни
e. preventDefault()
, ни e.stopEvent()
не остановили событие 'click' от (легитимного) срабатывания дважды (кроме IE6).
Что было бы неплохо, так это возможность подавить целую цепочку связанных событий, поскольку я уже пробовал распространение и return false ;
, но я всегда собирался получить срабатывание второго события благодаря моему элементу label.
Edit: Я был бы не против узнать, как jquery обработал бы мою ситуацию с двойным событием, если кто-то хочет прокомментировать это.