表单元素的submit()方法和onsubmit事件(转)

摘要:
3、动态创建表单时遇到的问题经常使用的一种方法如下,他会在表单submit前调用,根据validate()函数的返回值决定是否需要提交表单。

表单元素拥有submit方法,同时也具有onsubmit事件句柄,用于监听表单提交。可以使用elemForm.submit();方法触发表单提交。

1、表单元素中出现了name="submit"的元素

这种情况下elemForm.submit();将不会触发表单提交,因为表单原始的submit方法将会被覆盖(formElem.submit就是对该元素的引用)。

2、elemForm.submit();不会触发表单的onsubmit事件

没有为什么,标准中就是这么规定的。

与此有些类似的是onfocus、onblur和focus()、blur()之间的关系却不同,调用elem.blur()或elem.focus()却会触发onblur和onfocus事件。

这些为我们提供了一个思路,在设计一些UI组件时,需要考虑一些事件在内部调用时是否要触发相关事件。 例如Dialog组件,它具有onopen事件,同时返回的对象也会有open()方法,我们这时就必须考虑下open()方法是否需要触发onopen()事件。

3、动态创建表单时遇到的问题

经常使用的一种方法如下,他会在表单submit前调用,根据validate()函数的返回值决定是否需要提交表单。

<form onsubmit="return validate();"></form>

然而,如果要动态地为一个表单添加验证,即HTML代码中没有写onsubmit,而在页面加载后用javascript给这个form加一个handler,问题就 来了。假设我们已经得到了表单的DOM节点,保存在变量elemForm中,一般这样来给它加上handler:

var check = function() {
    if ('OK') {
        return true;
    } else {
        return false;
    }
};
if (elemForm.addEventListener) {
    elemForm.addEventListener("submit", check, false);
} else if (elemForm.attachEvent) {
    elemForm.attachEvent("onsubmit", check);
}

问题就出现了:在Firefox和Chrome中"return false;"是不能阻止表单的提交的(在IE中可以),这就是为什么大家在onsubmit属性中要写"return check()",而不仅仅是"check()"。

原因是什么呢?请看ECMAScript Language Binding,其中明确地写着,"Object EventListener: This is an ECMAScript function reference. This method has no return value. The parameter is a Event object",意思就是event listener没有返回值。 换一种理解,addEventListener可以为元素绑定多个监听函数,某一个事件监听函数的返回值,不可以作为整个事件的返回值。可以使用下面的方法解决

function check(ev) {
    ev = ev || window.event; // Event对象
    if (ev.preventDefault) { // 标准浏览器
        e.preventDefault();
    } else { // IE浏览器
        window.event.returnValue = false;
    }
}

其实一切的根本都因为IE不支持DOM Level 2。

转自:http://www.cnblogs.com/rainman/archive/2011/09/05/2168162.html

免责声明:文章转载自《表单元素的submit()方法和onsubmit事件(转)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇jquery.autocomplete.js用法及示例,小白进WebSocket实现前后端通讯下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

form表单提交的几种方式

表单提交方式一:直接利用form表单提交(主线程提交) html页面代码: 1.提交普通内容: 1 <body> 2 <form action="http://localhost:8080/user" method="post"> 3 username:<input type="text" name="username...

html5表单验证(Bootstrap)

html5表单验证(Bootstrap) 邮箱验证: <input name="email" type="text" placeholder="必填项"   required pattern="^w+((-w+)|(.w+))*@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+)*.[A-Za-z0-9]+$" title="邮箱正确格式...

Django组件-forms组件

form组件和 ModelForm 和auth模块 和中介模型  form组件 form组件出现的原因 当我们用普通的form表单提交时会刷新页面,如果这个我们表单中的某项填错了,刷新后我们正确的选项也没有了. 传统的form表单需要我们自己亲自校验每一项.工作量太大 Django 中form组件的2大功能:       1 验证(在前端页面显示我们...

防止Web表单重复提交的方法总结

在Web开发中,对于处理表单重复提交是经常要面对的事情。那么,存在哪些场景会导致表单重复提交呢?表单重复提交会带来什么问题?有哪些方法可以避免表单重复提交? 表单重复提交的场景 1.场景一:服务端未能及时响应结果(网络延迟,并发排队等因素),导致前端页面没有及时刷新,用户有机会多次提交表单 2.场景二:提交表单成功之后用户再次点击刷新按钮导致表单重复提交...

03- web表单测试

软件分为 b/s c/s两种架构 表单测试 1.用户注册,登录,信息提交。 2.用户查询商品。 3.用户订购商品。 4.用户查询订单等。 表单测试实例   表单数据添加测试(一) 添加按钮可用,测试点击添加按钮,能够进入响应的添加页面; 进入添加页面,验证输入字段和需求描述一致; 所有的输入字段输入合法数据;  表单数据添加测试(二) 重复提交信息,如一...

linux入门系列19--数据库管理系统(DBMS)之MariaDB

前面讲完Linux下一系列服务的配置和使用之后,本文简单介绍一款数据库管理系统(MySQL的兄弟)MariaDB。 如果你有MySQL或其他数据的使用经验,MariaDB使用起来将非常轻松。 本文讲解Centos7默认的数据MariaDB,由于是入门系列文章因此不会深入讲解,后面有机会在单独深入。 一、MariaDB产生背景 数据处理是软件的核心,软件的本...