【问题标题】:What is wrong with document.forms[0].submit()?document.forms[0].submit() 有什么问题?
【发布时间】:2014-08-18 21:45:49
【问题描述】:

我正在帮助某人处理他们遇到问题的网页,我整理了验证部分,但提交过程的行为与您预期的不同。

为了捕捉和停止默认事件,我在函数头部使用了以下内容

var evt = event ? event:window.event;
if (evt.preventDefault) evt.preventDefault();
evt.returnValue = false;
evt.cancelBubble = true;

如果我更改其中的任何部分,默认操作的预防将不起作用,并且 MSIE 中的页面将提交,即使验证错误存在或持续存在。在 Chrome 下,浏览器不提交但抛出错误,在 MSIE 下使用阻止例程,调试会在同一行显示错误。

Chrome: Uncaught TypeError: object is not a function

MSIE : 对象不支持该属性或方法

有问题的行:

document.forms[0].submit();

尝试

document.forms.form1.submit();
// or
document.forms['form1'].submit();

不过没用

document.forms.form1.reset();

或任何寻址变体,包括 .getEmelentsById("...");方法效果很好,我只是对这个问题感到困惑,我的 JS 解释器被塞满的想法确实在我脑海中闪过......

请任何人有任何不使用 JQuery 的想法。

【问题讨论】:

    标签: javascript forms submit


    【解决方案1】:

    由于form.reset() 确实有效,但form.submit() 无效,因此某些东西正在覆盖表单上的submit 方法。我敢打赌,你有一个 id 或名称为“submit”的表单元素:

    <input id="submit" />
    

    或者:

    <input name="submit" />
    

    这样form.submit 将解析为输入元素,而不是表单的submit() 方法。

    Quick jsFiddle demo

    简单的解决方法是更改​​元素的 id。更难、更不明智的解决方法是获取对原型 submit 方法的引用并在表单的上下文中调用它:

    var f = document.forms.form1;
    Object.getPrototypeOf(f).submit.call(f);
    

    document.createElement("form").submit.call(document.forms.form1);
    

    【讨论】:

    • 如果网络表单必须有一个提交按钮,并且它必须是一个类似提交的名称,输入提交,我正在帮助的人报告 Firefox 运行正常而其他浏览器 MSIE 和 Chrome 没有' t,我不明白为什么突然之间,当它已被接受为 HTML 中的标准名称约定和 JavaScript 中的方法时,就我所记得的时间的迷雾,它会突然以这种方式工作
    • 它在 FireFox 中对我不起作用 - 在我的回答中通过 jsFiddle 进行了测试。我不认为将表单元素命名为“提交”已被接受为标准命名约定。
    • 我更改了提交按钮的名称,这有助于发送,之后出现的问题是表单在发送到 firefox 之前没有验证,而是在 chrome、opera 和 MSIE 中。最终通过添加一个带有使用 evt.preventDefault() 的函数的提交事件侦听器来解决它;在其中,WTF firefox 现在必须成为 IDK 包中的怪人。自从 MS 开始变得明智以来,FF 似乎已经离开并做了自己的事情,只希望 W3C 有一些权力可以给 Mozilla 扇耳光,让他们停止胡闹。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 2020-06-12
    • 2011-07-10
    相关资源
    最近更新 更多