我在stackoverflow中找到了这个脚本。
function showhide(id){
if (document.getElementById) {
var divid = document.getElementById(id);
var divs = document.getElementsByClassName("hideable");
for(var div in divs) {
div.style.display = "none";
}
divid.style.display = "block";
}
return false;
}
<a href="#" onclick="showhide('features');" >features</a>
<a href="#" onclick="showhide('design');" >design</a>
<a href="#" onclick="showhide('create');" >create</a>
<div class="hideable" id="features">Div 1</div>
<div class="hideable" id="design">Div 2</div>
<div class="hideable" id="create">Div 3</div>
但它说,div.style undefined。为什么? :)
答案 0 :(得分:6)
你永远不应该使用for-in循环。
document.getElementsByClassName('someClass')
返回NodeList,它不会从Array.prototype
继承,但在某些方面类似。这是一个节点列表,就像名字所说的那样。这意味着它具有length
属性,只能使用:
var myElements = document.getElementsByClassName('yourClass');
for (var i = 0, ii = myElements.length; i < ii; i++) {
console.dir(myElements[i].style);
};
以下是你应该如何隐藏元素。
/**
* Shows or hides an element from the page. Hiding the element is done by
* setting the display property to "none", removing the element from the
* rendering hierarchy so it takes up no space. To show the element, the default
* inherited display property is restored (defined either in stylesheets or by
* the browser's default style rules.)
*
* Caveat 1: if the inherited display property for the element is set to "none"
* by the stylesheets, that is the property that will be restored by a call to
* showElement(), effectively toggling the display between "none" and "none".
*
* Caveat 2: if the element display style is set inline (by setting either
* element.style.display or a style attribute in the HTML), a call to
* showElement will clear that setting and defer to the inherited style in the
* stylesheet.
* @param {Element} el Element to show or hide.
* @param {*} display True to render the element in its default style,
* false to disable rendering the element.
*/
var showElement = function(el, display) {
el.style.display = display ? '' : 'none';
};
var myElement = document.getElementById('someID');
showElement(myElement, false);// it should now be hidden.
答案 1 :(得分:3)
for(var i = 0; i < divs.length; i++) {
divs[i].style.display = "none";
}
编辑:for循环用于循环对象属性
答案 2 :(得分:1)
替换
for(var div in divs) {
与
for(var i=0; i<divs.length;i++) {
var div = divs[i];
divs
,getElementsByClassName的结果,实际上不是一个数组,而是一个NodeList,一个类似于数组的对象,你正在迭代它的属性,而不是它的元素。
答案 3 :(得分:0)
行为不像foreach。在这种情况下,“ div”是索引。因此元素应为:divs [div]
答案 4 :(得分:-2)
确保for-in
循环中的所有元素都是DOM元素。使用for-in
:
hasOwnProperty()
循环是一种很好的做法
for(var div in divs) {
if (divs.hasOwnProperty(div)) {
if (div && div.style) {
div.style.display = "none";
}
}
}