AP2*_*257 9 html javascript css
我想使用Javascript(而不是jquery)来访问<ul>
列表中的所有项目,并从除我选择的菜单项之外的所有内容中删除活动类.
这是清单:
<ul id='flash-menu'>
<li id="menu1" class='something active'>item 1</li>
<li id="menu2" class='somethingelse'>item 2</li>
<li id="menu3" class='somethingelse'>item 3</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
这是我的javascript:
function updateMenu(view_name) {
var list_items = document.getElementById('flash-menu').childNodes;
for (var i=0 ; i<list_items.length ; i++){
list_items[i].className = list_items[i].className.replace('/\bactive\b/','');
}
document.getElementById(view_name).className += " active";
}
Run Code Online (Sandbox Code Playgroud)
Javascript的最后一行(添加活动类)有效,但我不认为我正在访问列表项以从其他项中删除类.有什么建议?- 谢谢!
首先,你的正则表达式是错误的:
list_items[i].className.replace(/\bactive\b/, '');
Run Code Online (Sandbox Code Playgroud)
注意:JavaScript中的正则表达式没有引号.JsFiddle上有一个稍微改动的工作版本.
此外,我得到了一些HTMLTextElement
s 实例list_items
.在尝试访问不存在的className
属性时,它们打破了循环(Fx3.6/Win7).你可以通过以下方式避免这种情况:
var list_items = document.getElementById('flash-menu').getElementsByTagName('li');
// Selecting _all_ descendant <li> elements
Run Code Online (Sandbox Code Playgroud)
或者通过.className
在循环体内检查读/写之前是否存在(例子).后者可能是最干净的选择,因为它仍然只影响直接的孩子(你可能有几个级别的<ul>
s <li>
).
也就是说,
function updateMenu(view_name) {
var list_items = document.getElementById('flash-menu').childNodes;
for (var i=0, j=list_items.length; i<j; i++){
var elm = list_items[i];
if (elm.className) {
elm.className = elm.className.replace(/\bactive\b/, '');
}
}
document.getElementById(view_name).className += ' active';
}
Run Code Online (Sandbox Code Playgroud)