【问题标题】:Preventing a specific default action防止特定的默认操作
【发布时间】:2020-03-16 13:55:45
【问题描述】:

我正在尝试创建一个简单的网络应用程序。 该应用程序包含一个简单的 Html 界面:

<form>
  <label for="number">You are welcome to enter a Number:</label>
  <input type="number" id="number" min="1" max="20">

  <button>Submit</button>
</form>

有一个附加到 Html 的脚本,该脚本在单击按钮时运行。为了防止发送表单和重新加载页面,我使用了preventDefault()。它很好地防止了这种情况,但它也阻止了 minmax 属性的发生。

我的问题是:是否有一个选项可以仅阻止事件的一个(或部分)默认操作?

【问题讨论】:

  • minmax 不是“动作”。当您说“防止 min 和 max 属性发生”时,您能否更明确地说明您的意思?
  • 请向我们展示脚本,因为它可能对您更有帮助。
  • 如果您包含一些 javascript 可能会有所帮助,这样我们就可以准确地看到您的脚本是如何“附加”到“html”的。即,它是表单的OnSubmit 处理程序,还是按钮本身的OnClick 处理程序?
  • @WoodrowBarlow — &lt;button&gt;Submit&lt;/button&gt; 实际上是一个提交按钮。您链接到的页面是这样说的。
  • @Quentin 你说得对,这是我的疏忽。我已经从我的评论中编辑了它。

标签: javascript html preventdefault


【解决方案1】:

浏览器中的事件倾向于形成“链”。即,按钮引发“点击”事件,浏览器通过执行验证来响应该事件,这会根据结果引发自己的事件,这可能导致浏览器执行提交操作,这再次引发自己的事件。

我相信您所做的是向按钮本身添加了一个事件侦听器,并阻止了会触发表单验证的“点击”事件。作为副作用,您还阻止了表单提交。

换句话说,你只“阻止”了一个事件——但由于它们是在一个链条中发生的,你已经打破了链条的其余部分。

在我看来,您想要做的是保留浏览器的内置表单验证行为(即强制执行您的 minmax 属性的部分),但阻止浏览器的内置“提交”功能(即导致页面重新加载的部分)。

您想要做的是为表单的“提交”事件添加一个事件侦听器。这发生在验证之后,您可以“阻止”该事件,以便浏览器不会执行其正常的提交操作。这样,浏览器仍然会进行表单验证,并且您的代码只有在验证通过时才会运行。

function onSubmit(event)
{
  event.preventDefault();
  console.log('submit event prevented');
  // do other stuff here
  // this code only runs if form validation passed successfully
}

document.getElementById('form').addEventListener('submit', onSubmit);
<form id="form">
  <label for="number">You are welcome to enter a Number:</label>
  <input type="number" id="number" min="1" max="20">

  <button>Submit</button>
</form>

【讨论】:

  • 感谢您的解释和解决方案。成功了,谢谢。
  • @אלחנןבעל-שם 很高兴听到。如果您不介意点击绿色复选标记,这给了我一些分数,并向在谷歌搜索中找到这个问题的未来人们发出信号,表明这个答案就是解决方案。
【解决方案2】:

这就是你想要的:

See code here

var submitButton = document.querySelector('button');
submitButton.onclick = function(e) {
  e.preventDefault();
  let data = document.querySelector('#number');

  let min = parseInt(data.getAttribute('min'));
  let max = parseInt(data.getAttribute('max'));
  let number = parseInt(data.value) || false;
  if (number > min &&  number < max) {
    alert("validation passed");
  }
}

【讨论】:

  • 原帖有一些歧义,但我认为这不是作者想要的。我相信他们试图保留浏览器的内置表单验证,但覆盖浏览器的内置“提交”行为。
猜你喜欢
  • 2011-06-29
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 2012-08-30
  • 2011-12-14
  • 2012-12-26
相关资源
最近更新 更多