Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在输入id等于';提交';_Javascript_Jquery_Forms_Namespaces - Fatal编程技术网

Javascript 如何在输入id等于';提交';

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将提交事件绑定到表单,并确保它们不会破坏表单,如下所示:

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问题。他们已将此切换为“无法修复”。