当前位置: 首页 > 面试题库 >

如何使用Javascript的addEventListener()覆盖HTML表单的默认commit()行为

宰父浩漫
2023-03-14
问题内容

如何使用addEventListener()将处理程序分配给HTML表单的Submit按钮,类似于分配按钮的’onclick’属性,而不触发表单的默认commit()行为?

将自定义函数分配给“提交”按钮的“
onclick”属性没有问题。定制函数执行各种步骤,然后创建一个Ajax请求对象,并使用该对象将数据发送到服务器。默认的commit()行为不会触发。

submitButton.onclick = function() {
    mySubmit();
    return false;
};

function mySubmit() {
   //do stuff
   notTheDefaultUrl = generateNonStandardUrl();
   request = GetStandardAjaxRequestThingamabob();
   request.open("POST", notTheDefaultUrl, true);
   request.onreadystatechange = myHandler;
   request.send(formData);
   return false;
}

但是使用addEventListener(),浏览器两次提交请求-
一次是在Ajax请求对象下,另一次是使用默认的HTML表单commit()行为。(我可以告诉b / c
mySubmit函数将数据发送到与默认URL不同的URL上,但是默认和Ajax url都出现在服务器日志中。)

var func = window['mySubmit'];
submitButton.addEventListener('click', func, false);

我知道分配给按钮的函数必须返回’false’,以防止触发默认的commit()行为。我以为mySubmit()做到了这一点,并且我尝试编写通过addEventListener传入的函数以更明确地返回false(而不是’func’,’function(){mySubmit();
return false}’),但是这些dosn也不行。

那么我该怎么做呢?

更新

对Peter的评论提出了一些浏览器兼容性问题。另外,IE不支持addEventListener()。这段代码解决了这些问题。我已经在Firefox和IE
8中对其进行了html" target="_blank">html" target="_blank">测试。

function func( event ) {
    if ( event.preventDefault ) { event.preventDefault()};  
    event.returnValue = false;  
    // do whatever
}

if (submitButton.addEventListener) {
    submitButton.addEventListener('click', func, false);
}
else {
    submitButton.attachEvent('onclick', func);
}

不好意思的新手格式化。


问题答案:

您需要在处理函数中接收该事件,并阻止该事件执行其默认行为。这适用于click事件,submit事件-实际上是任何可取消的事件。

// using your example
submitButton.addEventListener('click', func, false);

// here's what func should look like    
function func( event )
{
  if ( event.preventDefault ) event.preventDefault();
  event.returnValue = false;
  // do whatever
}


 类似资料:
  • 我有一个RESTAPI,我不想强迫客户端发送请求参数。我有将近400个api方法,我不想将所有参数设置为“required=false” 我想覆盖Spring RequestParam的默认行为。我想将RequestParam接口的“required”属性的默认值设置为“false”。 有什么方法可以覆盖它吗?如果我不能或这不是最佳实践,有什么方法可以解决上述问题。

  • 我需要定制的工件安装,不知道如何覆盖默认的(从默认的maven生命周期)。所以我的问题是: 如何在我的pom.xml中配置maven install插件,使其不进行默认安装并执行我的自定义安装文件目标? 我尝试了没有id和默认安装id,但没有帮助。 更新:从提供的答案 - 这对我不起作用(我在日志中看到两次安装尝试)。

  • 问题内容: 我已经在现有的mysql数据库中反映了表的负载。我想表示的是,任何表中具有特定名称的任何列默认为datetime.now()。但是,天真地遍历表和列,仅对那些我发现具有特定名称的表和列设置默认设置是行不通的。session.flush()我收到以下错误: 这似乎与对_set_parent的调用(以及在sqlalchemy.schema的第721行中的调用)有关。 有谁知道是否有办法做到

  • 问题内容: 我已经能够覆盖所有名称以“ android:”为前缀的主题,但是Android themes.xml还定义了似乎无法被覆盖的属性。例如: colorTheground是在Theme.Light xml中定义的,但是在此处添加它可以使我 错误。如何为整个应用程序覆盖该样式? 问题答案: 您可以用修改属性(如)的方式覆盖标准属性,只是不要忘记添加如下前缀:

  • 问题内容: 我想覆盖Java外观。我只想显示不同的按钮。 我想要Windows Look and Feel的所有功能,但仅按钮有所不同。希望你明白我的意思。 还告诉我如何制作圆形的JtabbedPane ??? 问题答案: 自定义GUI类 调用您的自定义GUI类

  • 问题内容: 我有一个模板与此: Django自动将此翻译为Terminarsesión西班牙语。但是,我想将其翻译为Cerrarsesión。 我试图将此文字添加到.po文件中,但是在编译消息时出现错误,指出该文字重复。 有没有一种方法可以更改/覆盖默认的Django翻译? 谢谢。 问题答案: 最简单的方法是收集在django.contrib.admin语言环境文件夹中找到的.po文件,然后重新编