表单Form的submit事件不响应的解决方法

一、问题描述
类比一下,我用input.select()做了测试,却能响应select事件。这个原因先放一边,我们看看先怎么把眼下的问题解决了。
不响应事件的代码示例:

var form = document.getElementById('form1');
form.onsubmit = function() {
alert(1);
};
form.submit();

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

实际运行,不会有alert出来。
虽然用submit方法来提交表单有违Unobtrustive Javascript的原则,但有时候不得不用,比如做搜索提示(auto-complete)选中Item之后就需要用JS来提交搜索表单。
二、问题分析
既然本身不响应事件,那只有手工触发这些事件了,确定手工触发方案之前先回顾一下事件的注册方式:
“原始”的注册方式有两种,看代码示例:

document.getElementById('form1').onsubmit = function() {
alert(1);
}

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

这样的注册事件,会给form增加了一个方法onsubmit。所以,可以通过直接执行这个方法,等同于手工触发了事件。
看代码示例:

form.onsubmit();

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

这样可以得到一个alert。
但是在如今“先进”的DOM2标准注册方式以及IE的注册方式attachEvent已经很常用。这些注册方式,onsubmit方法是不存在的,如果使用form.onsubmit()会直接报错。
三、解决方案
当然“先进”的注册方式本身也提供了手工触发事件的解决方案,只是要针对DOM2标准和IE写不同的程序,另外这个程序,对“原始”的注册方式也一样有效。请看代码示例:

//IE fire event
if (form.fireEvent) {
form.fireEvent('onsubmit');
form.submit();
//DOM2 fire event
} else if (document.createEvent) {
var ev = document.createEvent('HTMLEvents');
ev.initEvent('submit', false, true);
form.dispatchEvent(ev);
}

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

四、代码总结
这里不再对各细节方法做说明,不熟悉的朋友请自行查阅相关资料。我们把整个代码串起来:

submit

var form = document.getElementById('form1');
//YUI register event
YAHOO.util.Event.on('form1', 'submit', function() {
alert('yui');
});
//DOM0 register event
form.onsubmit = function() {
alert(1);
};
//DOM2 register event
if (form.addEventListener) {
form.addEventListener('submit', function() {
alert(2);
}, false);
//IE register event
} else if (form.attachEvent) {
form.attachEvent('onsubmit', function() {
alert(2);
});
}
//IE fire event
if (form.fireEvent) {
form.fireEvent('onsubmit');
form.submit();
//DOM2 fire event
} else if (document.createEvent) {
var ev = document.createEvent('HTMLEvents');
ev.initEvent('submit', false, true);
form.dispatchEvent(ev);
}

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

整个跑下来有个小问题,FX下,不需要form.submit(),直接把表单给提交出去了,所以这句也省掉了,原因知道的请回复。
这个demo在IE6/IE7/FX下测试通过。

(0)

相关推荐

  • onsubmit阻止form表单提交与onclick的相关操作

    1. return 的返回值问题,函数中return一旦有返回值,就不在执行下面的语句,直接跳到函数调用的地方.如下PHP函数代码,第一个if条件符合则函数值返回布尔型false,可以返回一个函数的值,并且跳出这个函数:只要遇到return语句,程序就在那一行代码停止执行,执行控制将立刻返回到调用该程序的代码处.function 复制代码 代码如下: function chkinput(form) { if(form.title.value=="") { alert("请输入

  • ajaxForm和ajaxSubmit 粘贴就可用示例代码

    复制代码 代码如下: <!-- To change this template, choose Tools | Templates and open the template in the editor. --> <!DOCTYPE html> <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/ht

  • form.submit()不能提交表单的错误原因及解决方法

    直接上代码把: <div id="register"> <h4>会员注册</h4> <div class="formdiv"> <form method="post" action="register.php?action=register" name="register" id="registerForm"> <dl&g

  • form.submit()不能提交表单的原因分析

    直接上代码把: 复制代码 代码如下: <div id="register"> <h4>会员注册</h4> <div class="formdiv"> <form method="post" action="register.php?action=register" name="register" id="registerForm"&g

  • chrome不支持form.submit的解决方案

    最近看到Q群里有人说chrome(谷歌浏览器)不支持form.submit方法,求解决办法.闲的时候亲自测试了一番,发现chrome竟然真的不支持form.submit,测试的时候用的是Jquery的,也不支持,于是乎研究了半天,终于找到了一个解决办法. //获取form表单的id var form=$('#myform').val(); //获取浏览器参数 var browserName=navigator.userAgent.toLowerCase(); if(/chrome/i.test(

  • document.forms[].submit()使用介绍

    document.forms['exportServlet'].submit(); (1)document.forms:表示获取当前页面的所有表单 (2)document.forms[0]:表示获取当前页面的第一个表单 (3)document.forms['exportServlet']:表示获取当前页面的name="exportServlet"的表单 (4)submit()表示提交函数

  • jquery中使用$(#form).submit()重写提交表单无效原因分析及解决

    问题:最近使用 jqeury 的 validationEngine 做ajax校验,当表单中的最后一个字段需要做ajax验证时,此时在字段输入完毕后点击回车提交表单时不起作用,必须再按一次/点击submit按钮. 分析:通过个跟踪其源代码,最终发现ajax验证成功后也再次submit了表单,但还是不能真正提交表单. 原因:很诡异,因为我的提交表单按钮名字是submit.改掉就好了. 复制代码 代码如下: <input id="submit" type="submit&q

  • JS中的form.submit()不能提交表单的错误原因

    直接上代码把: 复制代码 代码如下: <div id="register">      <h4>会员注册</h4>      <div class="formdiv">          <form method="post" action="register.php?action=register" name="register" id="r

  • 在一个form用一个SUBMIT(或button)分别提交到两个处理表单页面的代码

    复制代码 代码如下: <form onsubmit="aa(this);"> <input type="text" name="" value="test" /><input type="submit" value="提交" /> </form> <iframe src="" name="fA"

  • 表单Form的submit事件不响应的解决方法

    一.问题描述 类比一下,我用input.select()做了测试,却能响应select事件.这个原因先放一边,我们看看先怎么把眼下的问题解决了. 不响应事件的代码示例: var form = document.getElementById('form1'); form.onsubmit = function() { alert(1); }; form.submit(); [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] 实际运行,不会有alert出来. 虽然用submit方法来提交表单

  • 阻止表单提交按钮多次提交的完美解决方法

    如果表单是通过onsubmit进行Ajax提交,注意将表单提交按钮input type属性设为button,尽量不要设置为submit类型. 另外,在提交事件发出后,最好将提交按钮设置为disabled,防止由于网络延时问题,让用户有机会进行多次点击重复提交. onclick事件里面执行 $(this).attr('disabled','disabled'); 在点击一次后立马将按钮设置为不可使用. 或者向如下方法另行定义一个jQuery函数来进行控制: $("form").submi

  • 详谈表单重复提交的三种情况及解决方法

    第一种情况:提交完表单以后,不做其他操作,直接刷新页面,表单会提交多次. - 在servlet中写一句输出,用来判断是否提交多次 System.out.println("已经插入"); request.getRequestDispatcher("/login_success.jsp").forward(request, response); - 这样的话,刷新多少次,就会在控制器显示多少个"已经插入". - 根本原因:Servlet处理完请求以后

  • Django表单外键选项初始化的问题及解决方法

    问题描述 先说明一下问题的由来: Django的模型中经常会用ForeignKey来关联其他表格数据 class MeasureTask(models.Model): taskname = models.CharField(max_length=LEN_FULLNAME, verbose_name="任务名称") road = models.ForeignKey(Road, on_delete=models.CASCADE, verbose_name="设计路段")

  • 点击表单提交时出现jQuery没有权限的解决方法

    今天遇到个问题 我点击表单提交的时候会出现 jQuery 没有权限 : 百度了一堆都是说 jquery跨域之类的原因,比对项目,发现没有这样的原因:但是还是受到其中的启发,使用json可以防止这类问题,但是他们提供的办法都比较复杂,需要改前台和后台. 试了一下jquery自带的json方式提交成功! $.post("actionName.action",{"id":值,"name":值}, function(data){ if(data==&qu

  • 表单元素的submit()方法和onsubmit事件应用概述

    表单元素拥有submit方法,同时也具有onsubmit事件句柄,用于监听表单提交.可以使用elemForm.submit();方法触发表单提交.1.表单元素中出现了name="submit"的元素这种情况下elemForm.submit();将不会触发表单提交,因为表单原始的submit方法将会被覆盖(formElem.submit就是对该元素的引用).2.elemForm.submit();不会触发表单的onsubmit事件没有为什么,标准中就是这么规定的.与此有些类似的是onfo

  • js表单提交和submit提交的区别实例分析

    本文实例分析了js表单提交和submit提交的区别.分享给大家供大家参考,具体如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <

  • 微信小程序 表单Form实例详解(附源码)

    微信小程序 表单Form实例 表单Form的应用很广泛,我们可以利用form设计登录注册,也可以设计一种答题问卷的形式,今天主要讲一下form的使用 form表单,将组件内输入的"switch","input","checkbox","slider","radio","picker"的值进行提交,数据的格式为:name:value,所以表单中控件都需要添加name属性,否则找不到对应控件

  • Vue表单提交点击事件只允许点击一次的实例

    常用出现场景:商城点击订单提交 1.使用Vue封装事件 body: <template> <div> <el-button @click.once="submitOrder()">提交订单</el-button> </div> </template> 方法: methods: { submitOrder() { // 处理逻辑 } } 2.使用原生JS事件 在数据data里面声明一个flag属性 data() {

  • Jquery基于Ajax方法自定义无刷新提交表单Form实例

    本文实例讲述了Jquery基于Ajax方法自定义无刷新提交表单Form的方法.分享给大家供大家参考.具体实现方法如下: Jquery的$.ajax方法可以实现ajax调用,要设置url,post,参数等. 如果要提交现有Form需要写很多代码,何不直接将Form的提交直接转移到ajax中呢. 以前的处理方法: 如Form代码如下: 复制代码 代码如下: <form id="Form1" action="action.aspx" method="pos

随机推荐