何时使用 preventDefault() 与 Return false?

IT技术 javascript preventdefault
2021-01-28 12:13:08

首先,在 JavaScript 的事件模型中,您会遇到一个称为事件冒泡的概念(它使事件从子元素传播到父元素)。为了避免这种冒泡效应,许多开发人员使用了一种名为 的事件方法stopPropagation( )或者,开发人员已经开始使用 return false语句来阻止这种传播。现在,还有另一个术语称为 preventDefault( )顾名思义,此方法可防止触发元素的任何默认行为。最佳用例是防止锚标签打开链接。

您可能会遇到这样一种情况,您希望阻止锚标记打开链接(默认行为)以及阻止事件上升到父级。在这种情况下,您可以在一行中完成,而不是编写两行代码,即;return false

1个回答

返回假;


return false; 当你调用它时,它会做 3 件不同的事情:

  1. event.preventDefault() – 它停止浏览器的默认行为。
  2. event.stopPropagation() – 它可以防止事件传播(或“冒泡”)DOM。
  3. 停止回调执行并在调用时立即返回。

请注意,此行为与普通(非 jQuery)事件处理程序不同,在普通(非 jQuery)事件处理程序中,值得注意的是,return false它不会阻止事件冒泡。

防止默认();


preventDefault(); 做一件事:它停止浏览器的默认行为。

什么时候使用它们?


我们知道它们做什么,但什么时候使用它们?简单地说,这取决于你想要完成什么。使用preventDefault();,如果你想“只是”防止默认浏览器的行为。使用 return false; 当您想要阻止默认浏览器行为并阻止事件传播 DOM 时。在大多数情况下,您将使用 return false;你真正想要的是preventDefault()

例子:


让我们试着用例子来理解:

我们将看到纯 JAVASCRIPT 示例

示例 1:

<div onclick='executeParent()'>
  <a href='http://stackoverflow.com' onclick='executeChild()'>Click here to visit stackoverflow.com</a>
</div>
<script>
  function executeChild() {
    alert('Link Clicked');
  }

  function executeParent() {
    alert('div Clicked');
  }
</script>

运行上面的代码,您现在将看到“单击此处访问 stackoverflow.com”的超链接,如果您首先单击该链接,您将获得 javascript 警报链接 单击下一步您将获得 javascript 警报div 单击,然后您将立即被重定向到stackoverflow.com。

示例 2:

<div onclick='executeParent()'>
  <a href='http://stackoverflow.com' onclick='executeChild()'>Click here to visit stackoverflow.com</a>
</div>
<script>
  function executeChild() {
    event.preventDefault();
    event.currentTarget.innerHTML = 'Click event prevented'
    alert('Link Clicked');
  }

  function executeParent() {
    alert('div Clicked');
  }
</script>

运行上面的代码,您现在将看到“单击此处访问 stackoverflow.com”的超链接,如果您先单击该链接,您将获得 javascript 警报链接,单击下一步,您将获得 javascript 警报div 单击下一步,您将看到超链接“单击此处访问 stackoverflow.com' 替换为文本“阻止的单击事件”,您将不会被重定向到 stackoverflow.com。这是由于 > 我们用来防止触发默认点击操作的 event.preventDefault() 方法。

示例 3:

<div onclick='executeParent()'>
  <a href='http://stackoverflow.com' onclick='executeChild()'>Click here to visit stackoverflow.com</a>
</div>
<script>
  function executeChild() {
    event.stopPropagation();
    event.currentTarget.innerHTML = 'Click event is going to be executed'
    alert('Link Clicked');
  }

  function executeParent() {
    alert('div Clicked');
  }
</script>

这次如果您点击链接,函数 executeParent() 将不会被调用,您将不会获得 javascript 警报div Clicked 这次。这是因为我们使用 event.stopPropagation() 方法阻止了传播到父 div。接下来,您将看到超链接“单击此处访问 stackoverflow.com”被文本“将要执行单击事件”替换,并且您将立即被重定向到 stackoverflow.com。这是因为我们没有使用 event.preventDefault() 方法阻止默认点击操作这次触发。

示例 4:

<div onclick='executeParent()'>
  <a href='http://stackoverflow.com' onclick='executeChild()'>Click here to visit stackoverflow.com</a>
</div>
<script>
  function executeChild() {
    event.preventDefault();
    event.stopPropagation();
    event.currentTarget.innerHTML = 'Click event prevented'
    alert('Link Clicked');
  }

  function executeParent() {
    alert('Div Clicked');
  }
</script>

如果您单击链接,则不会调用函数 executeParent() 并且您不会收到 javascript 警报。这是因为我们使用 event.stopPropagation() 方法阻止了传播到父 div。接下来,您将看到“单击此处访问 stackoverflow.com”的超链接被文本“阻止的单击事件”替换,并且您不会被重定向到 stackoverflow.com。这是因为我们使用 event.preventDefault() 方法阻止了这次触发默认点击操作。

示例 5:

对于 return false,我有三个示例,它们似乎都在做完全相同的事情(只是返回 false),但实际上结果却大不相同。以下是上述每一项中实际发生的情况。

案例:

  1. 从内联事件处理程序返回false 会阻止浏览器导航到链接地址,但不会阻止事件通过 DOM 传播。
  2. 从 jQuery 事件处理程序返回false 会阻止浏览器导航到链接地址,并阻止事件通过 DOM 传播。
  3. 从常规 DOM 事件处理程序返回false绝对没有任何作用。

将看到所有三个示例。

  1. 内联返回假。

<div onclick='executeParent()'>
  <a href='http://stackoverflow.com' onclick='return false'>Click here to visit stackoverflow.com</a>
</div>
<script>
  var link = document.querySelector('a');

  link.addEventListener('click', function() {
    event.currentTarget.innerHTML = 'Click event prevented using inline html'
    alert('Link Clicked');
  });


  function executeParent() {
    alert('Div Clicked');
  }
</script>

  1. 从 jQuery 事件处理程序返回false

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
  <a href='http://stackoverflow.com'>Click here to visit stackoverflow.com</a>
</div>
<script>
  $('a').click(function(event) {
    alert('Link Clicked');
    $('a').text('Click event prevented using return FALSE');
    $('a').contents().unwrap();
    return false;
  });
  $('div').click(function(event) {
    alert('Div clicked');
  });
</script>

  1. 从常规 DOM 事件处理程序返回 false。

<div onclick='executeParent()'>
  <a href='http://stackoverflow.com' onclick='executeChild()'>Click here to visit stackoverflow.com</a>
</div>
<script>
  function executeChild() {
    event.currentTarget.innerHTML = 'Click event prevented'
    alert('Link Clicked');
    return false
  }

  function executeParent() {
    alert('Div Clicked');
  }
</script>

希望这些例子是清楚的。尝试在一个 html 文件中执行所有这些示例,看看它们是如何工作的。

-1,return false似乎没有做(在 FF51、Chrome 56 和 IE11 中,我尝试过)你提到的那些事情。请添加参考以支持它。
2021-03-18 12:13:08
这个答案不再正确:jsfiddle.net/ts0t9yLa
2021-03-22 12:13:08
在第一个例子中,为什么父函数在子函数之前先运行?如果事件必须向上传播,难道它不应该首先击中孩子的功能吗?或者事件是否作为堆栈的一部分上升并向下解析,导致首先运行父函数然后是子函数?
2021-03-26 12:13:08
是的,5.1 和 5.3 不再工作(这就是小提琴)。绝对记得他们在工作或对此感到困惑:)
2021-03-31 12:13:08
从事件处理程序返回 false 不执行 event.stopPropagation() 显然来自这里的代码笔 @keval-bhatt
2021-04-09 12:13:08