代码之家  ›  专栏  ›  技术社区  ›  friedo

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

  •  3
  • friedo  · 技术社区  · 15 年前

    今天我有点为难:

    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中,但可能我错过了一些东西。

    2 回复  |  直到 13 年前
        1
  •  5
  •   Crescent Fresh    15 年前

    只是为了重复这个问题:在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在hood下执行您在问题中描述的操作:它创建了一个虚拟对象 <div> 并设置其 innerHTML <input type="... 字符串在上面传递)。

    正如@jeffamaphone指出的,这个bug已经在IE8中修复。

        2
  •  2
  •   i_am_jorf    15 年前

    他们在IE8中修复了这个。在以前的版本中,调用CreateElement时需要包含名称。从 MSDN :

    可以设置Internet Explorer 8及更高版本 运行时的name属性 使用动态创建的元素 IHTMLDocument2::CreateElement方法。 创建具有名称的元素 的早期版本中的属性 Internet Explorer,包括 使用时的属性及其值 IHTMLDocument2::CreateElement方法。

    以下是示例 MSDN :

    var newRadioButton = document.createElement("<INPUT TYPE='RADIO' NAME='RADIOTEST' VALUE='First Choice'>")