如何在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>
答案 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中的,您无法使用保留字(例如class
或for
或{{ 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
Prototype,jQuery,Closure或any 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,这一切都为你完成了。