我需要使一个与IE7兼容的exisitng Web应用程序。

该代码广泛使用element.hasAttribute,而IE7对此方法存在问题。



我正在尝试检查代码中是否input元素已定义hasAttribute方法,如果没有,则尝试将其添加到所有input元素中。

//create an input element variable << works fine
var myInput = document.createElement("input");

//see if it has the 'hasAttribute' method << condition works fine
if (('hasAttribute' in myInput)==false)
{

    //get all input elements into objInputElements <<works fine
    var objInputElements=document.getElementsByTagName("input");

    // MORE CODE NEEDED - To implement a hasAttribute function for all
    // elements in the array probably using something
    // like: !!element[attributeName] which works in IE7. See link and notes below.
}

This article描述了如何定义一个单独的函数来做到这一点。但是,我想将hasattribute方法添加到未定义的元素中。 (这样一来,我无需更改当前编写的所有代码)

重要说明:表单中有> 1000个隐藏的输入字段,因此,需要以非常有效的方式将“hasattribute”方法添加到元素中。

请让我知道如何实现此目标。谢谢!

最佳答案

由于IE Element.prototype,因此没有有效的方法来填充hasAttribute。效率低下的方式(如果您想避免匀场)将是这样的(在所有输入均已加载之后放置):

<input data-abc="" />
<script>

if (!window.Element || !window.Element.prototype || !window.Element.prototype.hasAttribute) {

(function () {
    function hasAttribute (attrName) {
        return typeof this[attrName] !== 'undefined'; // You may also be able to check getAttribute() against null, though it is possible this could cause problems for any older browsers (if any) which followed the old DOM3 way of returning the empty string for an empty string (yet did not possess hasAttribute as per our checks above). See https://developer.mozilla.org/en-US/docs/Web/API/Element.getAttribute
    }
    var inputs = document.getElementsByTagName('input');
    for (var i = 0; i < inputs.length; i++) {
        inputs[i].hasAttribute = hasAttribute;
    }
}());

}

var inputs = document.getElementsByTagName('input');
document.write(
    'has?' + inputs[0].hasAttribute('abc') // false
);
document.write(
    'has?' + inputs[0].hasAttribute('data-abc') // true
);

</script>

07-24 09:15