wydarzenie.preventDefault () vs. return false

Gdy chcę uniemożliwić wykonywanie innych programów obsługi zdarzeń po wywołaniu określonego zdarzenia, mogę użyć jednej z dwóch technik. W przykładach użyję jQuery, ale dotyczy to również plain-JS:

1. event.preventDefault()

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

2. return false

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

Czy jest jakaś znacząca różnica między tymi dwoma metodami powstrzymywania propagacji zdarzeń?

Dla mnie, return false; jest prostsze, krótsze i prawdopodobnie mniej podatne na błędy niż wykonanie metody. Dzięki tej metodzie musisz pamiętaj o prawidłowej obudowie, nawiasie itp.

Również, muszę zdefiniować pierwszy parametr w callback, aby móc wywołać metodę. Być może są jakieś powody, dla których powinienem unikać tego w ten sposób i zamiast tego używać preventDefault? Co jest lepszym sposobem?

Author: Taryn, 2009-08-31

12 answers

return false z wewnątrz obsługi zdarzenia jQuery jest efektywnie takie samo jak wywołanie e.preventDefault i e.stopPropagationna przekazanym jQuery.Obiekt zdarzenia.

e.preventDefault() zapobiega wystąpieniu zdarzenia domyślnego, e.stopPropagation() zapobiega wystąpieniu zdarzenia bąbelkowego, a return false wykona oba te działania. Zauważ, że to zachowanie różni się od zwykłych procedur obsługi zdarzeń (nie-jQuery), w których, w szczególności, return false Nie zatrzymuje Zdarzenie przed bulgotaniem.

Źródło: John Resig

Wszelkie korzyści z korzystania z wydarzenia.preventDefault () nad "return false" aby anulować kliknięcie href?

 2631
Author: karim79,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-09 15:47:47

Z mojego doświadczenia wynika, że jest co najmniej jedna wyraźna przewaga podczas korzystania z eventu.preventDefault () zamiast zwracania false. Załóżmy, że rejestrujesz Zdarzenie kliknięcia na znaczniku zakotwiczenia, w przeciwnym razie byłoby to dużym problemem, gdyby użytkownik był nawigowany z dala od bieżącej strony. Jeśli program obsługi kliknięć używa return false, aby zapobiec nawigacji w przeglądarce, otwiera to możliwość, że interpreter nie dotrze do instrukcji return, a przeglądarka rozpocznie wykonywanie znacznika kotwicy domyślne zachowanie.

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

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

  return false;
});

Korzyści z używania zdarzenia.preventDefault() polega na tym, że można ją dodać jako pierwszą linię w funkcji obsługi, gwarantując tym samym, że domyślne zachowanie kotwicy nie zostanie uruchomione, niezależnie od tego, czy ostatnia linia funkcji nie zostanie osiągnięta (np. błąd runtime).

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

  // custom handling here

  // oops...runtime error, but at least the user isn't navigated away.
});
 399
Author: Jeff Poulton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-22 22:37:09

To nie jest, jak to nazwałeś, pytanie "JavaScript"; jest to pytanie dotyczące projektu jQuery.

JQuery i poprzednio linkowane cytaty z John Resig (w karim79 ' S message ) wydaje się być źródłem niezrozumienia sposobu działania programów obsługi zdarzeń w ogóle.

Fact: Obsługa zdarzenia, która zwraca false, zapobiega domyślnej akcji dla tego zdarzenia. Nie zatrzymuje propagacji zdarzenia. Obsługa zdarzeń zawsze działała w ten sposób, od dawnych czasów Netscape Navigator.

Dokumentacja z MDN wyjaśnia, w jaki sposób return false działa obsługa zdarzeń

To, co dzieje się w jQuery, nie jest tym samym, co dzieje się z programami obsługi zdarzeń. DOM event listeners i MSIE events "attached" to zupełnie inna sprawa.

Aby dowiedzieć się więcej, Zobacz attachEvent na MSDN i W3C DOM 2 Dokumentacja zdarzeń.

 92
Author: Garrett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:38

Ogólnie rzecz biorąc, pierwszą opcją (preventDefault()) jest ta, którą należy wziąć, ale musisz wiedzieć, w jakim kontekście się znajdujesz i jakie są Twoje cele.

Fuel Your Coding has a great article on return false; vs event.preventDefault() vs event.stopPropagation() vs event.stopImmediatePropagation().

Uwaga: powyższy link generuje błędy 5xx już od dłuższego czasu. Znalazłem jego kopię w Internet Archive , wydrukowałem do PDF i umieściłem w Dropbox: zarchiwizowane artykuł o return false; vs event.preventDefault() vs event.stopPropagation() vs event.stopImmediatePropagation() (PDF)

 58
Author: JAAulde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-02 15:44:32

Podczas korzystania z jQuery, return false robi 3 oddzielne rzeczy, gdy go wywołasz:

  1. event.preventDefault();
  2. event.stopPropagation();
  3. zatrzymuje wywołanie zwrotne i powraca natychmiast po wywołaniu.

Zobacz jQuery Events: Stop (Mis)Using Return False aby uzyskać więcej informacji i przykładów.

 51
Author: James Drinkard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-03 18:13:14

Można zawiesić wiele funkcji na zdarzeniu onClick dla jednego elementu. Skąd możesz mieć pewność, że ten[1]] będzie ostatnim, który strzeli? preventDefault z drugiej strony na pewno zapobiegnie tylko domyślnemu zachowaniu elementu.

 39
Author: Eldar Djafarov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-31 00:36:30

Myślę

event.preventDefault()

Jest określonym przez w3c sposobem anulowania zdarzeń.

Możesz to przeczytać w specyfikacji W3C na Event cancelation .

Nie można również używać return false w każdej sytuacji. Gdy podasz funkcję javascript w atrybutie href i jeśli zwrócisz false, użytkownik zostanie przekierowany do strony z napisanym false.

 17
Author: rahul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-31 00:39:39

Myślę, że najlepszym sposobem na to jest użycie event.preventDefault(), ponieważ jeśli jakiś wyjątek zostanie podniesiony w funkcji obsługi, wtedy Instrukcja return false zostanie pominięta i zachowanie będzie odwrotne do tego, co chcesz.

Ale jeśli jesteś pewien, że kod nie wywoła żadnych WYJĄTKÓW, możesz użyć dowolnej metody, którą chcesz.

Jeśli nadal chcesz przejść z return false, możesz umieścić cały kod obsługi w bloku try catch jak poniżej:

$('a').click(function (e) {
  try{
      your code here.........
  }
   catch(e){}
  return false;
});
 13
Author: Naga Srinu Kapusetti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-17 15:30:34

Moja opinia z mojego doświadczenia mówi, że zawsze lepiej jest używać

event.preventDefault() 

Praktycznie aby zatrzymać lub zapobiec zdarzeniu submit, gdy jest to wymagane, a nie return false Działa dobrze.

 0
Author: Dilip0165,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-21 06:10:30

Główna różnica pomiędzy return false i event.preventDefault() jest taka, że Twój kod poniżej return false nie zostanie wykonany, a w event.preventDefault() w przypadku, gdy twój kod zostanie wykonany po tej instrukcji.

Kiedy napiszesz return false, wykonaj następujące czynności za kulisami.

* Stops callback execution and returns immediately when called.
* event.stopPropagation();
* event.preventDefault();
 0
Author: Abdullah Shoaib,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-09 08:14:22

E. preventDefault();

Po prostu zatrzymuje domyślne działanie elementu.

Przykład Ex.:-

Zapobiega śledzeniu adresu URL przez hiperłącze, zapobiega wysyłaniu formularza przez przycisk submit. Gdy masz wiele procedur obsługi zdarzeń i chcesz po prostu zapobiec wystąpieniu zdarzenia domyślnego, i występowaniu od wielu razy, w tym celu musimy użyć w górnej części funkcji ().

Powód:-

Powodem użycia e.preventDefault(); jest że w naszym kodzie tak coś idzie nie tak w kodzie, to pozwoli na wykonanie linku lub formularza, aby uzyskać przesłane lub pozwalają na wykonanie lub zezwolić na jakąkolwiek akcję trzeba zrobić. przycisk & link lub submit zostanie przesłany i nadal pozwoli na dalszą propagację wydarzenia.

<!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;

Po prostu zatrzymuje wykonywanie funkcji ().

"return false;" zakończy całą realizację procesu.

Powód:-

Powodem użycia return false; Jest to, że nie chcesz już wykonywać funkcji w trybie ściśle określonym.

<!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>
 0
Author: Parth Raval,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-27 06:55:06

Zasadniczo, w ten sposób łączysz rzeczy, ponieważ jQuery jest frameworkiem, który głównie skupia się na elementach HTML, zasadniczo zapobiegasz domyślnemu, ale jednocześnie przestajesz propagować, aby zrobić bańkę.

Więc możemy po prostu powiedzieć, return false in {[2] } jest równe:

Return false to e. preventDefault oraz e. stopPropagation

Ale również nie zapominaj, że to wszystko jest w funkcjach związanych z jQuery lub DOM, gdy uruchomisz je na elemencie, zasadniczo zapobiega to wszystko od strzału włącznie z domyślnym zachowaniem i rozprzestrzenianiem się zdarzenia.

Zasadniczo przed rozpoczęciem używania return false;, najpierw zrozum, co robią e.preventDefault(); i e.stopPropagation();, a następnie, jeśli uważasz, że potrzebujesz obu w tym samym czasie, po prostu go użyj.

Więc w zasadzie ten kod poniżej:

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

Jest równe temu kodowi:

$('div').click(function (event) {
  event.preventDefault();
  event.stopPropagation();
});
 0
Author: Alireza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 11:07:57