Yah*_*hel 5 javascript forms jquery namespaces
我已经将提交事件绑定到表单,并确保它们不会破坏表单,使用这样的jQuery:
jQuery('form').submit(function(e){
var form = this;
e.preventDefault();
alert('1');
setTimeout(function() {
alert('2');
form.submit();
}, 1000);
});
Run Code Online (Sandbox Code Playgroud)
这一切都很好,但是,如果由于某种原因,前端开发人员给这个表单的子输入id ="submit",这会form.submit()
导致JavaScript错误(在Chrome中,'Uncaught TypeError:Property'提交'对象#不是一个函数').
你可以看到这里发生的一个例子:http://jsfiddle.net/q68ky/(如果没有,这是行为<input id="submit">
:http://jsfiddle.net/JpXzL/
现在,我知道我可以阻止它绑定具有id为'submit'的子节点jQuery('form').not(:has('#submit')).submit()
的表单,并且表单将处理得很好,但我的绑定永远不会触发这些表单.
所以,问题是:我如何安全地将这个jQuery函数绑定到所有表单,包括那些<input id="submit">
?
编辑:值得注意的是,如果我取消绑定提交处理程序然后触发jQuery提交,这个问题不会消失jQuery(form)
.
我能想到的唯一方法:
(function () {
var method;
window.submit = function (theForm) {
if (!method) {
method = document.createElement("form").submit;
}
method.call(theForm);
};
}());
Run Code Online (Sandbox Code Playgroud)
然后打电话submit(theFormYouWantToSubmit)
。
您可以在这里看到它的实际效果:http ://jsfiddle.net/q68ky/2/
编辑:提供一些关于其作用的解释......
此方法创建一个新的表单元素 ( document.createElement("form")
),并存储对其“提交”属性的引用 ( method = document.createElement("form").submit
)。因为这是一个新创建的表单元素,没有子节点,所以我们可以保证“submit”属性实际上是我们需要的“submit”方法,而不是id/name为“submit”的子节点。
然后,我们使用该call
方法( 的一部分Function.prototype
),该方法将方法的上下文设置submit
为我们要提交的表单,而不是window
对象,否则它将位于该对象上。
代码片段中的其余 gubbin 会缓存该submit
方法,以便每次您想要提交表单时都不会发生所有这些(尽管很小)开销,并在本地范围内捕获缓存的方法,而不是将其保存在全局范围并污染全局名称空间。
归档时间: |
|
查看次数: |
1232 次 |
最近记录: |