setAttribute在IE6中不起作用

时间:2010-07-02 04:14:52

标签: javascript

如何在IE6中用javascript设置元素属性..?似乎setAttribute不起作用。我真的需要动态地做。感谢。

代码

<script type="text/javascript" language="javascript"> 
    menuItems = document.getElementById("menu").childNodes; 
    for (i = 0; i < menuItems.length; i++)
    { 
        if (menuItems[i].className != "blue") 
            menuItems[i].setAttribute('onmouseover', 'HoverMenu(this)'); 
    } 
</script>

2 个答案:

答案 0 :(得分:9)

(以下大部分是在OP澄清他们正在设置事件处理程序之前;留下其他问题列表以防其他人发现它们有用)

IE6弄乱了setAttribute的几个方面。在不知道您正在处理的确切问题的情况下(这是在编辑之前它是一个事件处理程序),很难确定这是否真的是问题,但这里有几个已知问题:

您无法使用setAttribute设置事件处理程序

最好使用反射属性或addEventListener [标准] / attachEvent [IE]设置事件处理程序,而不是setAttribute(并且不能在IE上使用setAttribute

所以,其中任何一个都可行:

// Using reflected property
theElement.onclick = yourFunction;

// Using DOM2 standard addEventListener; note it's "click", not "onclick"
theElement.addEventListener("click", yourFunction, false);

// IE's non-standard alternative to addEventListener
theElement.attachEvent("onclick", yourFunction);

...不

// This doesn't work on IE (at least)
theElement.setAttribute("onclick", "yourFunction();");

执行此操作的addEventListener / attachEvent方式很酷,原因如下:您可以在元素的同一事件上拥有多个事件侦听器。你不能使用反射属性来做到这一点。

所以针对您的具体情况:

menuItems = document.getElementById("menu").childNodes; 
for (i = 0; i < menuItems.length; i++)
{ 
    if (menuItems[i].className != "blue") {
        menuItems[i].onmouseover = function() {
            HoverMenu(this);
        }
    }
}

某些属性需要修改后的名称

<强> class

设置class属性的正确方法是使用反射属性className

// Correct, cross-browser way. Works on IE6+, all versions of
// Chrome, etc. Completely reliable.
theElement.className = "new set of classes";

或在现代浏览器上(因此,不是IE6!),您可以使用classList

IE6的许多setAttribute错误之一是这不起作用:

// Should also work, but fails on IE6 (and probably some other old versions)
theElement.setAttribute("class", "new set of classes");

相反,IE6(可能还有其他几个版本)会让你使用"className"代替"class",即使这没有任何意义。反映的属性的名称为className,因为它曾经是JavaScript中的,您无法使用保留字(例如classfor或{{ 1}})作为属性文字(if无效)。暂时不是这样(ECMAScript 5修复了它),但这就是为什么反射属性是obj.class,而不是className

但由于class.采用字符串,因此它应接受该属性的正确名称。事实上它并不只是一个IE错误(如果他们不在[兼容]模式下,他们已经在IE的现代版本中修复了这个错误。)

<强> setAttribute

同样,要设置for属性(例如,在for s上),可以使用label反射属性:

htmlFor

在任何未损坏的浏览器上,您也可以使用// Correct, cross-browser way. Works on IE6+, all versions of // Chrome, etc. Completely reliable. theLabel.htmlFor = "id-of-field";

setAttribute

...但不是在IE6上,它需要// Should also work, but fails on IE6 (and probably some other old versions) theLabel.setAttribute("for", "id-of-field"); 而不是"htmlFor",原因与"for"而不是"className"相同(例如,因为它已被破坏)

This page有很多属于IE的属性列表。

"class"不能用于设置setAttribute属性

...您必须使用style属性;但公平地说,这通常是一种更方便的方式。示例:这不适用于IE:

style

......但这会:

theElement.setAttribute("style", "color: blue"); // Doesn't work on IE

稍微OT:看看图书馆

PrototypejQueryClosureany of several others之类的JavaScript库,如果您通过他们的浏览器,将使上述大部分工作变得更轻松,并使浏览器之间的差异更加平滑的API。

答案 1 :(得分:1)

我真的会看看jquery。它具有适用于IE6的所有功能,这将比您在此处的代码更容易。它看起来像这样:

menuItems = $("#menu")[0].childNodes; 
$.each(menuItems, function()
{
    var item = $(this);
    if (item.attr("className") != "blue")
        item.mouseover(HoverMenu);
} 

这段代码可能需要稍微调整一下,因为我只是从内存中写字。

我说更容易,因为您在设置此类事件时尝试做的事情因浏览器而异,因此设置起来很麻烦。但是有了jquery,这一切都为你完成了。