我今天为此感到有点难:
function mk_input( name, val ) {
var inp = document.createElement( 'input' );
inp.name = name;
inp.value = val;
inp.type = 'hidden';
return inp;
}
事实证明,设置通过
name
创建的元素的createElement
在IE中不起作用。它不会导致任何错误或其他任何事情,它只是默默地失败,导致人们思考为什么未正确填充其隐藏字段。据我所知,没有解决方法。您只需咬一下子弹,然后通过字符串操作创建
<input>
标记,然后将其粘贴在.innerHTML
中即可。有没有更好的办法?也许有类似jQuery的东西?我进行了粗略的搜索,没有找到与JQuery中的
createElement
完全相似的任何内容,但也许我错过了一些东西。 最佳答案
只是要重申一下这个问题:在IE中,以编程方式在通过name
创建的元素上设置document.createElement('input')
属性不会反射(reflect)在getElementsByName
和form.elements
中(如果附加到表单中),并且不会与form
一起提交(同样,如果附加到表格)[Reference]。
这是我过去使用的变通方法(适应于您的问题from here):
function mk_input( name, val ) {
var inp;
try {
inp = document.createElement('<input type="hidden" name="' + name + '" />');
} catch(e) {
inp = document.createElement("input");
inp.type = "hidden";
inp.name = name;
}
inp.value = val;
return inp
}
这类似于特征检测(与浏览器检测相反)。第一个
createElement
将在IE中成功,而后者将在符合标准的浏览器中成功。当然是jQuery的等效物,因为您这样标记了问题:
function mk_input( name, val ) {
return $('<input type="hidden" name="' + name + '" />')
.val(val)
.get(0)
}
(作为一个旁注,jQuery在做您在问题中描述的事情:它创建一个虚拟
<div>
并将其innerHTML
设置为上面传递的<input type="...
字符串)。正如@jeffamaphone指出的那样,此错误已在IE8中修复。