【发布时间】:2011-09-07 09:51:35
【问题描述】:
此代码旨在将样式“显示:无”添加到每个不具有“ShowThis”类或该类的后代的元素:
var x = document.getElementsByTagName('*');
for(var i = x.length; i--;){
x[i].style.display = 'none';
if((' '+x[i].className+' ').indexOf(' ShowThis ') >= 0){
var y = x[i];
while(y){
if(y.nodeType === 1){
console.log(y.style.cssText); // Outputs: "display: none;"
console.log(y.style.display); // Outputs: "none"
y.style.display = 'block';
console.log(y.style.display); // Outputs: "block"
console.log(y.style.cssText); // Outputs: "display: block;"
// ERROR here:
// Outputs the elements HTML (Chrome Console),
// But the style attribute isn't changed
// EX. <div style="display: none;">...</div>
console.log(y);
}
y = y.parentNode;
}
}
}
这是一个 JSFiddle:http://jsfiddle.net/Paulpro/wEq8X/
如果您注释掉 if(y.nodeType === 1){ 和匹配的 } (http://jsfiddle.net/Paulpro/wEq8X/1/),或者如果我将 if 语句更改为 if(y.nodeType) 或 if(true),它工作正常我,因为程序流程正在进入该 if 语句(所有console.log 都已执行)。
我已尝试将 if 语句更改为 if(typeof y.style !== 'undefined'),但它的行为也不正确。 (完全一样的问题)
我需要测试 nodeType 或 style 以防止在尝试访问文档的 style 属性时出现错误,但是测试它们中的任何一个都会给我这种奇怪的行为。
我可以在 Chrome、Firefox 和 IE 中重现此内容。
【问题讨论】:
-
当删除删除
style.display = 'none'时,它应该设置为''(空字符串),因为有很多元素的默认显示属性不是block(@ 987654323@ 在 CSS 2.1 中有 16 个不同的值)。设置为空字符串允许元素采用其默认或继承的样式,而无需您明确地这样做。 -
我已经更新了答案。您的代码取决于返回页面元素的顺序。如果在内部元素之后看到容器元素,并且容器没有“ShowThis”,那么它将不起作用。
-
@RobG 我不知道空字符串会将其重置为默认值。很方便,谢谢。
-
哈哈——又更新了。我需要多睡觉什么的;我不知道我怎么错过了那个明显的细节。
标签: javascript html css dom