js写了个tab选项卡老报错,求大神指点迷津
html部分:
<!DOCTYPE html>
<html>
<head>
<meta name="description" content="选项卡制作">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>选项卡</title>
</head>
<body>
<div class="wrap">
<ul class="panel-title clearfix">
<li class="item">选项1</li>
<li class="item">选项2</li>
<li class="item">选项3</li>
</ul>
<div class="panel-content active">选项内容1</div>
<div class="panel-content ">选项内容2</div>
<div class="panel-content">选项内容3</div>
</div>
</body>
</html>
css部分:
div,ul,li{
padding: 0;
margin: 0;
}
.clearfix:after{
content: ' ';
display: block;
clear: both;
}
ul,li{
list-style: none;
}
.panel-title{
background:#ccc;
padding: 10px
}
.item{
float:left;
margin: 0 10px;
cursor: pointer;
}
.item.active{
color:#fff;
}
.panel-content{
display: none;
background:#cdc;
height: 50px;
padding: 10px;
border: 1px solid #ccc;
}
.panel-content.active{
display: block;
}
js部分:
function trim(str){
var newStr = str.replace(/(^\s*)|(\s*$)/g,'');
return newStr;
}
function hasClass(ele, cls){
return !!ele.className.match(new RegExp('\\b' +cls+ '\\b'));
}
function addClass(ele, cls){
if(!hasClass(ele, cls)){
ele.className += ' '+cls;
}
}
function removeClass(ele, cls){
if(hasClass(ele, cls)){
ele.className = ele.className.replace(new RegExp('\\b' +cls+ '\\b'),'');
return trim(ele.className);
}
}
function removeAll(els, cls){
for(var i=0;i<els.length;i++){
removeClass(els[i], cls);
}
}
var titleArr = document.getElementsByClassName("item");
var ctArr = document.getElementsByClassName("panel-content");
var ul = document.getElementsByClassName('panel-title')[0];
ul.onclick = function(e){
if(hasClass(e.target), "item"){
var idx = e.target.getAttribute('data-idx');
removeAll(ctArr, "active");
addClass(ctArr[idx], "active");
}
}
报错部分:
代码链接:
jsbin演示
1.
hasClass(e.target), "item")
:item
写在了括号外2. 报错为
hasClass
方法内部ele
获取classname
出错,所以肯定是调用hasClass
方法传参ele
有问题,你的代码有三处调用了
hasClass
,可以先将removeAll
和addClass
注释然后逐一排查,可以发现是addClass
的时候出问题了,传的参数是undefined
,也就是ctArr[idx]
这个参数undefined
,再看var idx = e.target.getAttribute('data-idx');
,你这个应该是想获取html
对应li
的data-idx
,但是你没写啊,所以取得时候undefined
,我加了几行代码,猜测你的想法应该是这样的,然后就不报错了3. 你的
click
方法写的不好,不应该绑定在ul
上面,以至于我只要不点在li
上,点在li
之外的ul
上也会报错取不到classname
,所以你应该更改click
方法到li
上