【发布时间】:2011-05-26 18:54:11
【问题描述】:
我一直在将提交事件绑定到表单,并确保它们不会破坏表单,使用这样的 jQuery:
jQuery('form').submit(function(e){
var form = this;
e.preventDefault();
alert('1');
setTimeout(function() {
alert('2');
form.submit();
}, 1000);
});
这一切都很好,除了,如果由于某种原因前端开发人员为此表单的子输入提供了 ="submit" 的 id,这会中断,因为form.submit() 会引发 JavaScript 错误(在 Chrome 中, '未捕获的类型错误:对象#的属性'提交'不是函数')。
您可以在此处看到发生这种情况的示例:http://jsfiddle.net/q68ky/(如果没有 <input id="submit">,则为以下行为:http://jsfiddle.net/JpXzL/
现在,我知道我可以阻止它绑定到具有jQuery('form').not(:has('#submit')).submit() 的 id 为 'submit' 的子级的表单上,并且表单可以正常处理,但我的绑定永远不会为这些表单触发。
那么,问题来了:如何安全地将这个 jQuery 函数绑定到所有表单,包括带有<input id="submit"> 的表单?
编辑:值得注意的是,如果我取消绑定提交处理程序,然后在 jQuery(form) 上触发 jQuery 提交,这个问题不会消失。
【问题讨论】:
-
我知道一个理想的世界,我不应该在输入表单上创建
id="submit",但我不能保证它不会存在。 -
@ys,你明白这段代码会导致死循环吧?
-
@Gaby 不,
form.submit()在 DOM 元素上触发提交,而不是 jQuery 元素。如果它是$(form).submit();你是对的,我需要取消绑定 jQuery 处理程序,就像这里:jsfiddle.net/LKUhV。此外,正如您在原始 jsfiddle 上看到的,它不会导致触发alert()的无限循环。
标签: javascript jquery forms namespaces