今天我有点难过:
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
完全类似的东西,但也许我错过了一些东西。
答案 0 :(得分:5)
只是为了重新解决问题:在IE中,以编程方式设置通过name
创建的元素的document.createElement('input')
属性不会反映在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中得到修复。
答案 1 :(得分:2)
他们在IE8中解决了这个问题。在以前的版本中,您需要在调用createElement时包含该名称。来自MSDN:
Internet Explorer 8及更高版本可以设置 运行时的NAME属性 使用动态创建的元素 IHTMLDocument2 :: createElement方法。 使用NAME创建元素 早期版本中的属性 Internet Explorer,包括 使用时的属性及其值 IHTMLDocument2 :: createElement方法。
以下是MSDN的示例:
var newRadioButton = document.createElement("<INPUT TYPE='RADIO' NAME='RADIOTEST' VALUE='First Choice'>")