IE9错误:对象不支持属性或方法'setAttribute'

时间:2013-01-30 22:23:29

标签: javascript internet-explorer-9

功能:

function disable_hidden_flip_questions(option, value){
    var first_q = document.getElementById('hidden_auto_questions');
    var second_q = document.getElementById('hidden_include_auto');
    var inputs_list = [];
    if(option == 'all'){
        inputs_list.push(first_q.getElementsByTagName("input"));
        inputs_list.push(second_q.getElementsByTagName("input"));
    }else if (option == 'first'){
        inputs_list.push(first_q.getElementsByTagName("input"));
    }else if(option == 'second'){
        inputs_list.push(second_q.getElementsByTagName("input"));
    }

    for (var inputs in inputs_list){
        for(var input in inputs_list[inputs]){
            if(inputs_list[inputs].hasOwnProperty(input) && input != 'length'){
                if(!value){
                    inputs_list[inputs][input].removeAttribute('disabled');
                }else{
                    inputs_list[inputs][input].setAttribute("disabled", "disabled");
                }
            }
        }
    }
}

在Chrome和Firefox中完美运行,但在IE9中,控制台在这一行上给我一个错误:

inputs_list[inputs][input].setAttribute("disabled", "disabled")

如果我console.log(inputs_list[inputs][input])我在Chrome中看到了这个:

(输入由RoR生成,这就是nameid如此长的原因

<input class="radio_buttons optional" id="custom_attributes_trailer_insurance_endorsement_false" name="custom_attributes[trailer_insurance_endorsement]" type="radio" value="false" disabled="disabled"> 

是的,这就是我想要的(也是预期的)......但是在IE9的控制台中,我得到了这个:

[object HTMLCollection]

这完全没用....

所以问题:我在IE的崇高观点中哪里出错了?我知道IE9支持setAttribute,所以我假设它与我的for...in循环有关。

修改:由于评论,问题可能出在对象类型上(HTMLCollection存储在Array中)。如果确实如此,我该如何制作所有兼容的数据类型?

2 个答案:

答案 0 :(得分:0)

HTMLCollections不是真正的数组,因此您可能会以不一致的方式处理它们。虽然所有浏览器都会从getElementsByTagName返回HTMLCollection,但它们允许您处理它们的方式可能存在重大差异。最好的方法是使用DOM方法从HTMLCollection访问东西 - 所以你要使用.item(0)来确保你引用一个dom节点而不是集合本身(参见https://developer.mozilla.org/en-US/docs/DOM/HTMLCollection)。此外,您不会尝试操作集合列表,因此如果您确实使用数组来推送数据,请确保它们分离数据而不是HTMLCollection。

答案 1 :(得分:0)

jquery中的解决方案:

  $("input[name=trailer_use]").click(function(event){
        if(event.target.id == "trailer_use_yes"){
            $("#hidden_auto_questions").removeClass('hide_auto').addClass('show_auto');
            $("input[name=trailer_insured]").removeAttr("disabled");
            show_trailer_warning(null, "remove");
        }else {
            $("#hidden_auto_questions").removeClass('show_auto').addClass('hide_auto');
            $("input[name=trailer_insured]").attr("disabled", "disabled");
            if($("#hidden_include_auto").hasClass("show_auto")){
                $("#hidden_include_auto").removeClass('show_auto').addClass('hide_auto');
                $('input[name="custom_attributes[trailer_insurance_endorsement]"]').attr("disabled", "disabled");
            }
            show_trailer_warning(null, "disclaimer");
        }
  });