如何在输入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(特别是)正常工作非常重要。
而不是form.submit();
, 你需要
$(form).submit();
这是因为form
只是裸DOM元素,而$(form)
是jQuery对象。 调用form.submit()
试图访问form
的submit
属性。 由于它没有一个,它默认为获得id
为submit
的子元素的老派行为(因此“不是函数”错误)。
如果表单元素的名称或标识为“提交”,则会发生错误。 看起来这是jQuery的一个问题。