Javascript 如何在输入id等于';提交';
我一直在使用jQuery将提交事件绑定到表单,并确保它们不会破坏表单,如下所示:Javascript 如何在输入id等于';提交';,javascript,jquery,forms,namespaces,Javascript,Jquery,Forms,Namespaces,我一直在使用jQuery将提交事件绑定到表单,并确保它们不会破坏表单,如下所示: jQuery('form').submit(function(e){ var form = this; e.preventDefault(); alert('1'); setTimeout(function() { alert('2'); form.submit(); }, 1000); }); 这一切都很好,除了,
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中,“uncaughtTypeError:object的属性“submit”不是函数)
您可以在这里看到这样一个例子:(以下是没有
时的行为:
现在,我知道我可以通过jQuery('form')阻止将此绑定到具有子id为'submit'的表单上。而不是(:has('#submit'))。submit()
,表单将处理得很好,但我的绑定永远不会触发这些表单
因此,问题是:如何将这个jQuery函数安全地绑定到所有表单,包括带有
的表单
编辑:值得注意的是,如果我解除提交处理程序的绑定,然后在
jQuery(form)
上触发jQuery提交,这个问题不会消失。如果表单元素的名称或id为“submit”,则会发生错误。这看起来是jQuery的问题。而不是form.submit();
,您需要
$(form).submit();
这是因为
form
只是裸DOM元素,而$(form)
是jQuery对象正在尝试访问表单的submit
属性。由于它没有属性,因此它默认为获取其id
为submit
的子元素的旧式行为(因此“不是函数”错误)。我能想到的唯一方法是:
(function () {
var method;
window.submit = function (theForm) {
if (!method) {
method = document.createElement("form").submit;
}
method.call(theForm);
};
}());
然后调用submit(theFormYouWantToSubmit)
你可以在这里看到它的作用:
编辑:提供一些关于此功能的解释……
此方法创建一个新表单元素(document.createElement(“表单”)
),并存储对其“submit”属性的引用(method=document.createElement(“表单”).submit
)。因为这是一个新创建的表单元素,没有子节点,所以我们可以保证“submit”属性实际上就是“submit”方法,而不是id/名称为“submit”的子节点
然后,我们使用方法(Function.prototype的一部分),该方法将submit
方法的上下文设置为我们要提交的表单,而不是窗口
对象,否则该对象将处于启用状态
代码段中其余的gubbins缓存submit
方法,因此所有这些(尽管很小)并非每次提交表单时都会发生开销,并在本地范围内捕获缓存的方法,而不是将其保留在全局范围内并污染全局命名空间。由于这实际上是一个非jQuery问题,因此这里有一个非jQuery解决方案:
HTMLFormElement.prototype.submit.call(form);
参考:
更新:(这可能就是jQuery不使用它的原因)
相反,它应该在任何浏览器中都能工作除了我在中发现的问题之外,还有一个开放的jQuery错误加剧了这个问题:
.SUBMIT()如果有ID=“SUBMIT”的内容,则可能会失败
如果ID为submit的元素
存在于表单中,.submit()可能会失败。
重要的是,此功能(在
(特别)工作正常
我知道一个理想的世界,我永远不应该在输入表单上创建id=“submit”
,但我不能保证它不会存在。@ys,你知道这段代码会导致无休止的循环,对吧?@Gaby不,form.submit()
触发提交的是DOM元素,而不是jQuery元素。如果是$(form)。submit();
你是对的,我需要解除jQuery处理程序的绑定,如下所示:jsfiddle.net/LKUhV。此外,正如你在原始的jsfiddle上看到的,它不会导致触发无限循环的alert()
。与jQuery无关。问题是,.notation会找到id为submit的元素(因为它是表单的属性)代替方法..Clean,我喜欢它。更广泛地使用它有什么缺点吗?而且,为什么jQuery不将它用于submit()
?@yc:嗯,我总是不确定IE是如何实现所有这些东西的。但是我这里没有IE来测试…方法本身(从原型中获取原始方法)被广泛用于避免这种情况(覆盖属性)。“我这里没有要测试的IE…”这是什么天堂?我该怎么做?@ScottSEA:get-Mac;)(或任何UNIX/Linux发行版,永远不要再安装Windows!)@Emmett你能编辑这个答案来反映你的心意吗?:)@yc这并不是真的改变主意。有两个问题。我在回答中描述的第一个错误导致“不是函数”错误。第二个问题是jQuery错误。如果您正在寻找一个被接受的答案,请允许我谦虚地建议我的另一个答案;)显然,jQuery提交者尝试了这一点,但它产生了一些IE6问题。他们已将此切换为“无法修复”。