event.preventDefault () vs. return false


2959

Коли я хочу запобігти виконанню інших обробників подій після запуску певної події, я можу використовувати одну з двох методик. Я буду використовувати jQuery у прикладах, але це стосується і звичайного JS:

1. event.preventDefault()

$('a').click(function (e) {
    // custom handling here
    e.preventDefault();
});

2. return false

$('a').click(function () {
    // custom handling here
    return false;
});

Чи є якась істотна різниця між цими двома методами зупинки поширення подій?

Для мене return false;простіший, коротший і, ймовірно, менш схильний до помилок, ніж виконання методу. За допомогою методу ви повинні пам’ятати про правильний кожух, дужки тощо.

Крім того, я повинен визначити перший параметр у зворотному дзвінку, щоб мати можливість викликати метод. Можливо, є деякі причини, чому я повинен уникати цього робити і використовувати preventDefaultзамість цього? Який кращий спосіб?


172
Зверніть увагу , що Jquery - х preventDefaultце НЕ заважає іншим лівшів від виконання. Ось для чого stopImmediatePropagation.
Crescent Fresh

19
@CrescentFresh, це перешкоджає виконанню інших (згодом пов'язаних) обробників ... на вузлі DOM подія запускається. Це просто не перешкоджає розмноженню.
безглазність

37
Це не "два способи зупинки поширення подій?" e.preventDefault (); запобігає дії за замовчуванням, не припиняє розповсюдження подій, що робиться e.stopPropagation ().
Тімо Тіхоф

24
Це питання та його відповіді стосуються jQuery. Якщо ви прийшли сюди, шукаючи просту відповідь на javascript, див. Event.preventDefault () vs. return false (no jQuery)
Oriol

5
У цій відповіді є таблиця, в якій пояснюється все stackoverflow.com/a/5302939/759452
Adrien Be

Відповіді:


2817

return falseз обробника подій JQuery фактично те ж саме , як виклик , як e.preventDefaultі e.stopPropagationна пройдений об'єкт jQuery.Event.

e.preventDefault()запобіжить виникненню події за замовчуванням, e.stopPropagation()запобіжить виникненню подій, а return falseтакож обидва. Зверніть увагу , що це поведінка відрізняється від нормальних (НЕ JQuery) обробників подій, в яких, в зокрема, return falseніяк НЕ зупинити подія від вирує.

Джерело: Джон Резиг

Будь-яка вигода від використання event.preventDefault () над "return false" для скасування натискання href?


126
return falseвід обробника DOM2 ( addEventListener) взагалі нічого не робить (ні заважає за замовчуванням, ні зупиняє барботаж; від обробника Microsoft DOM2-ish ( attachEvent), він запобігає замовчуванню, але не бульбашки; від обробника DOM0 ( onclick="return ..."), запобігає замовчуванню (за умови ви включаєте returnв атрибут), але не булькає, від обробника подій jQuery він робить і те, і інше, тому що це jQuery. Деталі та живі тести тут
TJ Crowder

12
Тут було б корисно визначити "Поширення" та "За замовчуванням". Я, наприклад, їх плутаю. Це правильно? Розширення = мій код (обробники подій JavaScript для батьківських елементів). За замовчуванням = код браузера (посилання, вибір тексту тощо)
Боб Штейн

5
що насправді означає булінг? приклад?
Говінда Сахаре

5
+1 За відзначити , що return falseце НЕ зупинити поширення події в обробниках подій , НЕ JQuery. тобто <a href="#" onclick="return false">Test</a>ніяк НЕ зупинити подія від вирує.
Doug S

424

З мого досвіду, принаймні одна явна перевага при використанні event.preventDefault () над використанням return false. Припустимо, ви фіксуєте подію натискання на якорний тег, інакше це буде великою проблемою, якщо користувач повинен переходити подалі від поточної сторінки. Якщо обробник натискань використовує функцію return false для запобігання навігації в браузері, він відкриває можливість, що інтерпретатор не дійде до оператора return і браузер приступить до виконання поведінки тегу якоря за замовчуванням.

$('a').click(function (e) {
  // custom handling here

  // oops...runtime error...where oh where will the href take me?

  return false;
});

Перевага від використання event.preventDefault () полягає в тому, що ви можете додати це як перший рядок у оброблювачі, гарантуючи тим самим, що поведінка за замовчуванням якоря не буде спрацьовувати, незалежно від того, чи не буде досягнуто останнього рядка функції (наприклад, помилка виконання часу). ).

$('a').click(function (e) {
  e.preventDefault();

  // custom handling here

  // oops...runtime error, but at least the user isn't navigated away.
});

68
Хоча правда, протилежна поведінка часто краща, коли робите прогресивне вдосконалення (на мою думку, це, мабуть, найвірогідніша причина для того, щоб перекрити дію за замовчуванням)
meandmycode

Обидва способи блокувати поведінку події за замовчуванням, це лише питання, яку проблему ви намагаєтеся вирішити.
Феркзе

102

Це не так, як ви його назвали, питання "JavaScript"; це питання щодо дизайну jQuery.

jQuery і раніше пов'язане цитування з Джона Резігаповідомленні karim79 ) здаються джерелом нерозуміння того, як працюють обробники подій взагалі.

Факт: Обробник подій, який повертає значення false, запобігає дії за замовчуванням для цієї події. Це не зупиняє поширення події. Обробники подій завжди працювали так, ще з давніх часів Netscape Navigator.

Документація від MDN пояснює , як return falseв обробник подій працює

Те, що відбувається в jQuery, не те саме, що відбувається з обробниками подій. Слухачі подій DOM та "приєднані" події MSIE - це зовсім інша справа.

Для подальшого читання див. ДодатокEvent про MSDN та документацію W3C DOM 2 події .


6
@rds Це говорить, що "prevenDefault не зупиняє подальше розповсюдження події через DOM. event.stopPropagation слід використовувати для цього".
Гаррет

Відповідь на тісно пов'язаний з цим питання стверджує , що до HTML 5, повертаючи FALSE з обробника події не specced як робити що - або взагалі. Тепер, може бути, це неправильна інтерпретація (важко зрозуміти) специфікації, або , може бути , не дивлячись на це не specced буквально все браузери інтерпретувати return falseтак само , як event.preventDefault(). Але я не знаю; досить змусити мене взяти це з дрібкою солі.
Марк Амері

9
Я ненавиджу, як насправді кожен результат пошуку JavaScript у google - це jQuery, +1
Alexander Derck

Він позначив це як JavaScript і jQuery, і обидва є правильними. jQueryце лише підмножина JavaScript, а не її власна мова.
ПрофК

67

Як правило, ваш перший варіант ( preventDefault()) - це той, який потрібно взяти, але ви повинні знати, в якому контексті ви знаходитесь і які цілі.

Паливо Ваш Coding має велику статтю про return false;проти event.preventDefault()проти event.stopPropagation()протиevent.stopImmediatePropagation() .


@VisruthCV Дивіться мою додану примітку із посиланням на архівну версію
JAAulde

57

Коли ви використовуєте jQuery, return falseвиконуючи 3 окремі речі, коли ви його називаєте:

  1. event.preventDefault();
  2. event.stopPropagation();
  3. Зупиняє виконання зворотного дзвінка і повертається негайно при виклику.

Див. Події jQuery: Стоп (Міс) Використання Return False для отримання додаткової інформації та прикладів.


Якщо інші частини коду слухають цю подію, event.stopPropagation (); скасує зворотний дзвінок?
Феркзе

41

Ви можете повісити безліч функцій на onClickподію для одного елемента. Як ти можеш бути впевнений, що той, falseхто буде вогнем останній? preventDefaultз іншого боку, безумовно, запобігає лише поведінка елемента за замовчуванням.


20

я думаю

event.preventDefault()

є вказаний w3c спосіб скасування подій.

Ви можете прочитати це в специфікації W3C про скасування подій .

Також ви не можете використовувати false false у будь-якій ситуації. Якщо ви надаєте функцію javascript в атрибуті href і якщо ви повернете false, користувач буде перенаправлений на сторінку з написаним помилковим рядком.


4
Не в жодному браузері, якого я ніколи не зустрічав. Можливо, ви плутаєте це <a href="javascript:return false"чи щось?
mplungjan

10
-1; твердження, що href, який повертає false, генерує текстову сторінку зі словом "false", написаним на ній, є повною нісенітницею.
Марк Амері

1
(мінус) 1; зламане посилання + повна дурниця
Філ

15

Я думаю, що найкращий спосіб зробити це - використовувати, event.preventDefault()тому що якщо в обробнику буде зроблено якийсь виняток, тоді falseвиписка повернення буде пропущена і поведінка буде протилежною тому, що ви хочете.

Але якщо ви впевнені, що код не спричинить жодних винятків, тоді ви можете скористатися будь-яким із бажаних методів.

Якщо ви все ще хочете йти з поверненням false, тоді ви можете помістити весь код обробника в блок спробу лову, як показано нижче:

$('a').click(function (e) {
  try{
      your code here.........
  }
   catch(e){}
  return false;
});

1

Моя думка з мого досвіду говорить про те, що завжди краще використовувати

event.preventDefault() 

Практично для припинення або запобігання надсилання події, коли нам потрібно, а не return false event.preventDefault()добре.


11
Краще чому? Ви буквально давали нульове обґрунтування, що б там не було. -1.
Марк Амері

У випадку, якщо є декілька прив'язок подій, e.preventDefault () є більш націленим, ніж повернення false.
Тайгер

preventDefaultце деякі англійські слова, я розумію, що це "заважає дефолту". return falseце декілька англійських слів, я розумію, що це "повертає помилкове", але я не маю поняття, чому доти, доки я не надішлю Google цей крипто-код. І бонус, я можу контролювати окремо stopPropagationі preventDefault .
Джоан

1

Основна відмінність між return falseі в event.preventDefault()тому, що ваш код нижче return falseне буде виконаний і вevent.preventDefault() випадку, якщо ваш код буде після цього твердження.

Коли ви пишете повернення помилкового, він робить для вас наступні речі поза кадром.

* Stops callback execution and returns immediately when called.
* event.stopPropagation();
* event.preventDefault();

1

e.preventDefault ();

Він просто зупиняє дію елемента за замовчуванням.

Екземпляр Ex.:-

заважає гіперпосиланню слідувати URL-адресі, заважає кнопці "Надіслати" надіслати форму. Коли у вас є багато обробників подій, і ви просто хочете запобігти виникненню подій за замовчуванням і виникненню у багатьох випадках, для цього нам потрібно використовувати у верхній частині функції ().

Причина: -

Причина використання e.preventDefault();полягає в тому, що в нашому коді щось не виходить в коді, то це дозволить виконати посилання або форму, щоб надіслати або дозволити виконати або дозволити будь-які дії, які вам потрібно зробити. & кнопка "Посилання" або "Надіслати" буде надіслана та все ще дозволить подальше поширення події.

<!DOCTYPE html>
<html lang="en" dir="ltr">
   <head>
      <meta charset="utf-8">
      <title></title>
   </head>
   <body>
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      <a href="https://www.google.com" onclick="doSomethingElse()">Preventsss page from redirect</a>
      <script type="text/javascript">
         function doSomethingElse(){
           console.log("This is Test...");
         }
         $("a").click(function(e){
          e.preventDefault(); 
         });
      </script>
   </body>
</html>

повернути Неправдиво;

Він просто зупиняє виконання функції ().

" return false;" завершить все виконання процесу.

Причина: -

Причина використовувати return false; полягає в тому, що ви більше не хочете виконувати функцію в строгому режимі.

<!DOCTYPE html>
<html lang="en" dir="ltr">
   <head>
      <meta charset="utf-8">
      <title></title>
   </head>
   <body>
      <a href="#" onclick="returnFalse();">Blah</a>
      <script type="text/javascript">
         function returnFalse(){
         console.log("returns false without location redirection....")
             return false;
             location.href = "http://www.google.com/";
         
         }
      </script>
   </body>
</html>


1

В основному, таким чином ви комбінуєте речі, тому що jQuery - це рамка, яка в основному зосереджена на елементах HTML, ви в основному запобігаєте замовчуванню, але в той же час ви припиняєте розповсюдження, щоб переповнюватися.

Тож ми можемо просто сказати, що повернення false у jQueryдорівнює:

return false є e.preventDefault AND e.stopPropagation

Але також не забувайте, що це все в jQuery або DOM-функціях, коли ви запускаєте його на елементі, в основному це запобігає запусканню всього, включаючи поведінку за замовчуванням та поширення події.

Перш за все return false;, перш ніж почати користуватися , спочатку зрозумійте, що e.preventDefault();і e.stopPropagation();робити, а потім, якщо ви думаєте, що вам потрібно одночасно і те, і інше, а потім просто використовуйте.

Тому в основному цей код нижче:

$('div').click(function () {
  return false;
});

є рівним цим кодом:

$('div').click(function (event) {
  event.preventDefault();
  event.stopPropagation();
});

1

З мого досвіду event.stopPropagation () використовується в основному в CSS-ефекті або анімаційних роботах, наприклад, коли у вас є ефект наведення як для елемента картки, так і для кнопки, коли вказівник наводить на кнопку, і в цьому випадку ефект наведення курсора та кнопки буде викликаний. , ви можете використовувати event.stopPropagation () припинити дії бульбашок, а event.preventDefault () призначений для запобігання поведінки браузера за замовчуванням. Наприклад, у вас є форма, але ви визначили лише подію клацання для дії надсилання, якщо користувач подає форму натисканням клавіші Enter, браузер, що викликається подією клавіші, а не подія клацання тут, ви повинні використовувати event.preventDefault (), щоб уникнути невідповідності поведінка. Я не знаю, що за чорт повертається помилково; Вибачте.Для додаткових роз'яснень перейдіть за цим посиланням та пограйте з рядком №33https://www.codecademy.com/courses/introduction-to-javascript/lessons/requests-i/exercises/xhr-get-request-iv

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.