漫长的故事短…许多简化,调试,弄清楚什么行触发IE忽略新的表单输入.所以行为问题解决了.
但现在我必须问:为什么?这是IE的bug吗?
以下是简化代码:
<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将突然停止报告字段3.它在Firefox中可以正常工作.
有任何想法吗?好奇心想知道. (如果需要,如何在便携式的方式添加文本,所以IE是快乐的?)
解决方法
Is this an IE bug?
似乎如此.创建< input>元素通过DOM方法,IE不会很好的拿起’name’属性.它是一种类型的,因为元素确实提交,但如果你试图获得一个’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侦听器或其他每个子元素附加的自定义属性.此外,不必要的序列/解析周期很慢.