我今天为此感到有点难:

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)在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中修复。

07-24 09:50
查看更多