如何在输入id等于’submit’的情况下提交javascript

我已经将提交事件绑定到表单,并确保它们不会破坏表单,使用这样的jQuery:

jQuery('form').submit(function(e){ var form = this; e.preventDefault(); alert('1'); setTimeout(function() { alert('2'); form.submit(); }, 1000); }); 

这一切都很好,除非,如果由于某种原因,前端开发人员给这个表单的子输入id =“submit”,这会中断,因为form.submit()会抛出一个JavaScript错误(在Chrome中,’未捕获的TypeError:对象#的属性’submit’不是函数’)。

你可以看到这里发生的一个例子: http : //jsfiddle.net/q68ky/ (如果没有这是行为: http : //jsfiddle.net/JpXzL/

现在,我知道我可以通过jQuery('form').not(:has('#submit')).submit()来阻止这个带有id为’submit’ jQuery('form').not(:has('#submit')).submit() ,表单将过程很好,但我的绑定永远不会触发那些forms。

所以,问题是:我如何安全地将这个jQuery函数绑定到所有表单,包括那些带有

编辑:值得注意的是,如果我取消绑定提交处理程序然后在jQuery(form)上触发jQuery提交,这个问题不会消失。

我能想到的唯一方法:

 (function () { var method; window.submit = function (theForm) { if (!method) { method = document.createElement("form").submit; } method.call(theForm); }; }()); 

然后调用submit(theFormYouWantToSubmit)

你可以在这里看到它: http : //jsfiddle.net/q68ky/2/

编辑:提供一些解释,这是做什么….

此方法创建一个新的表单元素( document.createElement("form") ),并存储对其“submit”属性的引用( method = document.createElement("form").submit )。 因为这是一个新创建的表单元素,没有子节点,我们可以保证“submit”属性实际上是我们需要的“submit”方法,而不是id / name为“submit”的子节点。

然后我们使用call方法( Function.prototype一部分),它将submit方法的上下文设置为我们想要提交的表单,而不是window对象,否则它就是它所处的位置。

代码段中的其余gubbins缓存了submit方法,因此每次要提交表单时都不会发生所有这些(虽然很小)开销,并在本地范围内捕获缓存的方法,而不是保留它在全局范围内并污染全局命名空间。

由于这实际上是一个非jQuery问题,这里是一个非jQuery解决方案:

 HTMLFormElement.prototype.submit.call(form); 

DEMO

参考: HTMLFormElement

更新: 只能在IE8 +中访问DOM原型。 (这可能是jQuery不使用它的原因)。

@Mat的答案应该适用于任何浏览器

另外我在其他答案中发现的问题是,有一个开放的jQuery错误加剧了这个问题:

.SUBMIT()如果有ID =“提交”则可能失败

如果表单中存在ID为submit的元素,则.submit()可能会失败。 这个function(特别是)正常工作非常重要。

http://bugs.jquery.com/ticket/1414

而不是form.submit(); , 你需要

 $(form).submit(); 

这是因为form只是裸DOM元素,而$(form)是jQuery对象。 调用form.submit()试图访问formsubmit属性。 由于它没有一个,它默认为获得idsubmit的子元素的老派行为(因此“不是函数”错误)。

如果表单元素的名称或标识为“提交”,则会发生错误。 看起来这是jQuery的一个问题。