LINUX.ORG.RU

[js][jQuery] preventDefault() vs. return false

 ,


0

1

Сап, Лорчан.
Суть такова: сейчас я работаю над UI для текущего проекта. По ходу действий пришлось допиливать напильником один плагин, реализующий галерею (связывался с его автором, автор сказал «feel free to use it like you want :)»). Так вот, при обработке событый клика там используется конструкция вида:

$(link).click(function() {
    doWhatever();
    return false;
});
Я же использую обычно такую конструкцию:
$(link).click(function(e) {
    e.preventDefault();
    doWhatever();
});
С моей точки зрения менее костыльно выключить дефолтное поведение для события и делать что нужно, нежели возвращать false, тем более, иногда это ломает поведение. Кто прав? Зачем тогда preventDefault?


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

theos ★★★
()
return false;

делает следующее:

1. event.preventDefault();
2. event.stopPropagation();
3. Немедленно прекращает выполнение функции.
Таким образом если на этот элемент будут добавлены еще обработчики они никогда не сработают. Такой код менее очевиден нежели event.preventDefault(), легко забыть про вызов event.stopPropagation()

hidden_4003
()
Ответ на: комментарий от jessey

Не, меньше всего подводных камней будет если руками каждый раз писать и preventDefault и stopPropagation, предварительно подумав, нужны ли они. Но return false лучше чем твой вариант хотя бы потому что писать меньше.

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

Kalashnikov ★★★
()
Ответ на: комментарий от Kalashnikov

Ну, я с таким не сталкивался, у меня как часы всё работает.

jessey
() автор топика
Ответ на: комментарий от Kalashnikov

Кстати, вспомнил один из подводных камней.

$('a.navigation').on('click', function(event) {
	// тут ошибка
	
	return false;
});

$('a.navigation').on('click', function(event) {
	e.preventDefault();
	e.stopPropagation();
	
	// ошибка теперь тут
});

return приходится втыкать в конец кода, из-за чего в первом случае нативный обработчик таки запуститься (юзер уйдёт по hrefу), а во втором не произойдёт ничего. В зависимости от логики кода один из вариантов может быть неприемлим.

Kalashnikov ★★★
()
Ответ на: комментарий от jessey

1. Событие не всплывает из-за вызова event.stopPropagation()

2. Если ошибка в коде обработчика то обработчик по умолчанию срабатывает поскольку return false; не сработает

hidden_4003
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.