在开发过程中,遇到了个有趣的现象
function siblings( elem , cls ) {
var r = [];
var n = elem.parentNode.firstChild;
for ( ; n; n = n.nextSibling ) {
if ( n.nodeType === 1 && n !== elem && getClass(n,cls)) {
r.push( n );
}
}
return r;
}
function getClass(ele,cls){
if(!ele.getAttribute('class')){
return false;
}
var clss = ele.getAttribute('class').trim().split(' ');
if(clss.hasItem(cls)){
return true;
}
}
Array.prototype.hasItem = function(item){
for(var i = 0,len = this.length;i<len;i++){
if(this[i] == item){
return true;
}
}
return false;
}
通过siblings获取当前元素所有同类class的兄弟节点,将它们压入数组中。
var sib = siblings($$('.page'+options.currentPage),'page');
for(var i in sib){
console.log(sib[i])
sib[i].style.display = 'none';
}
然后利用for..in去遍历数组,会把原型链的方法hasItem() 一并遍历出来
而原生的原型方法并不会被一并遍历出来,引起了我这个小白的注意。并且好奇,为什么原生的不会被遍历出来,后妈生的就被择出来了。如果有知道的大神,请不吝赐教~~
Hasownproperty()了解一下,利用这个方法判断属性或方法是否是自身拥有的。可以去除原型链的干扰,取到想要的结果。
var sib = siblings($$('.page'+options.currentPage),'page');
for(var i in sib){
if(sib.hasOwnProperty(i)){
sib[i].style.display = 'none';
}
}
除此之外,可以利用forEach()和Map()遍历数组,且不会获取原型链上的属性和方法
forEach():
var sib = siblings($$('.page'+options.currentPage),'page');
sib.forEach(function(value,index,array){
array[index].style.display = 'none';
})
Map():
var sib = siblings($$('.page'+options.currentPage),'page');
sib.map(function(value, index, array){
array[index].style.display = 'none';
})