javascript - IE 不提交动态添加的表单元素

标签 javascript internet-explorer webforms dhtml

我编写了一些 JavaScript 来允许在 HTML 表单中编辑项目列表,包括添加和删除项目。让它在 Firefox 中工作。在 Internet Explorer 中尝试时,我发现任何添加的项目都没有随表单一起提交。

长话短说...大量的简化、调试,弄清楚是哪一行触发 IE 忽略新的表单输入。这样行为问题就解决了。

但现在我必须问:为什么?这是 IE 错误吗?

这是简化的代码:

<html>
<head>
    <title>Test</title>
    <script type="text/javascript">
        function add() {
            div = document.getElementById("mylist");

            // *** Adding text here works perfectly fine. ***
            div.innerHTML += " ";

            e = document.createElement("input");
            e.setAttribute("type", "text");
            e.setAttribute("name", "field3");
            e.setAttribute("value", "--NEWVALUE--");
            div.appendChild(e);

            // *** Adding text here works perfectly fine in Firefox, but for
            //     Internet Explorer it causes field3 to not be submitted. ***
            //div.innerHTML += " ";
        }
    </script>
</head>
<body>
    <form action="" method="get">
        <div id="mylist">
            <input type="text" name="field1" value="value1" />
            <input type="text" name="field2" value="value2" />
        </div>
        <a href="javascript:" onclick="add()" />Add</a>
        <input type="submit" value="Submit" />
    </form>
</body>
</html>

要试用它,请执行以下操作:加载 IE,单击“添加”,单击“提交”,查看地址栏中的内容。如果您取消注释 add() 中的最后一行,IE 将突然停止报告 field3。无论哪种方式在 Firefox 中都可以正常工作。

有什么想法吗?一颗好奇的心想知道。 (如果需要,我将如何以可移植的方式在其中添加文本,以便 IE 满意?)

最佳答案

Is this an IE bug?

似乎是这样。当您通过 DOM 方法创建 <input> 元素时,IE 不会完全获取“名称”属性。元素确实会提交,但如果您尝试获取该元素的“innerHTML”表示,它就会神秘地消失。如果您通过直接写入 innerHTML 来创建元素,则不会发生这种情况。

此外,如果您使用 DOM Level 0 表单导航方法,如“myform.elements.x.value”,通过“elements”数组访问可能无法正常工作(类似地,有些人错误地使用直接“myform.x”访问) .无论如何,现在您可能更喜欢 getElementById()。

所以或者使用innerHTML 或者使用DOM方法;创建表单字段时最好不要混合使用它们。

这是 documented (see ‘Remarks’)并最终在 IE8 中修复。

无论如何,永远不要这样做:

div.innerHTML+= '...';

这只是语法糖:

div.innerHTML= div.innerHTML+'...';

换句话说,它必须序列化元素的整个子 HTML 内容,然后进行字符串连接,然后将新字符串重新解析回元素中,丢弃所有原始内容。这意味着您将丢失任何无法序列化的内容:以及 IE 的伪造的“名称”属性,这也意味着您附加到每个子元素的任何 JavaScript 事件处理程序、DOM 监听器或其他自定义属性。此外,不必要的序列化/解析周期很慢。

关于javascript - IE 不提交动态添加的表单元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/611932/

相关文章:

javascript - jQuery UI 对话框在 Enter KeyPress 上更改 URL

javascript - grunt 服务删除了 yeoman 生成器 Angular 应用程序依赖项

html - CSS 格式在 IE 中显示,但在 Chrome 或 Firefox 中不显示

javascript - 在不同的浏览器中打开链接

c# - ASP.NET 向导获取文本框的值

javascript - 如何以编程方式确定某些 JavaScript 代码是否失败或生成错误

javascript - 使用 gmail.js 创建元素

html - 防止 Internet Explorer 10 移动版创建电话和地址链接

mysql - _POST 字段中的某些特殊字符导致 INSERT 到 MySQL 时出错

jquery - 使用 jQuery 将文本添加到 asp.net 文本框控件