设置DOM创建的元素的名称在IE中失败 - 解决方法?

时间:2009-10-30 16:13:35

标签: javascript jquery dom internet-explorer

今天我有点难过:

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完全类似的东西,但也许我错过了一些东西。

2 个答案:

答案 0 :(得分:5)

只是为了重新解决问题:在IE中,以编程方式设置通过name创建的元素的document.createElement('input')属性不会反映在getElementsByNameform.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'>")