var Select=(function () { //自定义 select 方法的思路: //1> 定义一个 support 对象. 将需要使用的方法进行处理, 得到方法的能力 //2> 需要使用的可能有兼容性的方法, 定义一个可以完成该方法的函数来替代. 在函数内部进行兼容处理 //3> 定义 select 函数. 首先看是否支持 qsa, 如果支持直接使用. 如果不支持自己再来实现 //native code判断是否是内置方法 var rnative=/\[native code\]/ var support={} //是否支持querySelectorAll support.qsa=rnative.test(document.querySelectorAll) ; //是否支持 support.getElementsByClassName=rnative.test(document.getElementsByClassName) //因为document和node的继承关系不一样,所以要做二次判断 var div=document.createElement(‘div‘) support.getElementsByClassName2=rnative.test(div.getElementsByClassName) support.indexOf=rnative.test(Array.prototype.indexOf); support.trim=rnative.test(String.prototype.trim) // 在开始将需要的方法定义好 var push=[].push; //解决push的展开伪数组问题兼容性问题, //因为无法检测浏览器是否有push,所以只能先尝试判断 //先尝试是否可行,不行的话就使用自定义方式 try{ push.apply([],document.getElementsByTagName(‘*‘)); }catch(e){ push={ apply: function (a,b) { for(var i=0;i< b.length;i++){ a[a.length++]=b[i]; } return a.length; }, call: function (a) { for(var i=1;i<arguments.length;i++){ a[a.length++]=arguments[i]; } //var args=[].slice.call(arguments,1) //this.push.apply(a,args) } } } //解决indexOf浏览器的兼容的问题 function indexOf(array,search,starindex){ starindex=starindex||0; if(support.indexOf){ return array.indexOf(search,starindex) }else{ for(var i=starindex;i<array.length;i++){ if(array[i]==search){ return i; } } return -1; } } //解决byclassname的浏览器兼容问题 function byClassName(classname,node){ if(node==document&&support.getElementsByClassName|| node.nodeType==1&&support.getElementsByClassName2){ return node.getElementsByClassName(classname); }else{ var list=node.getElementsByTagName(‘*‘) var arr=[]; for(var i=0;i<list.length;i++){ // 先判断对象是否有class,如果有的话,则进行下一步 var cc=list[i].getAttribute(‘class‘) if(cc){ //因为可以有多个类名,所以要进行判断 if(indexOf(cc.split(‘ ‘),classname)!=-1){ arr.push(list[i]) } } } return arr; } } var Select= function (selector,results) { results=results||[]; if(support.qsa){ push.apply(results,document.querySelectorAll(selector)) return unique(results) }else{ return Select2(selector,results) } } //兼容trim的兼容问题 function trim(str){ if(support.trim){ return str.trim() }else{ return str.replace(/^\s|\s$/g,‘‘) } } //数组去重的方法 function unique(arr){ var newarr=[]; for(var i=0;i<arr.length;i++){ if(indexOf(newarr,arr[i])==-1){ newarr.push(arr[i]) } } return newarr; } // 常用的获取元素的方法 function t(tagname,results){ results=results||[]; push.apply(results,document.getElementsByTagName(tagname)); return results; }; function c(classname,results){ results=results||[]; push.apply(results,byClassName(classname,document)); return results; } function id(idname,results){ results=results||[]; //判断是否存在id var rid=document.getElementById(idname) if(rid){ push.call(results,rid); } return results; } //如果是组合选择器 function Select2(selector,results){ results=results||[]; //先将组合分割成数组 var list=selector.split(‘,‘); for(var i=0;i<list.length;i++){ //去除首位的空格 Select3(trim(list[i]),results); } return unique(results) } function Select3(selector,results){ results=results||[]; //实现四种选择器 var aa=selector.charAt(0) //基本选择器中不能有空格 if(selector.split(‘ ‘).length==1){ if(selector==‘*‘){ return t(selector,results) }else if(aa==‘#‘){ return id(selector.slice(1),results) }else if(aa==‘.‘){ return c(selector.slice(1),results) }else{ return t(selector,results) } }else{ throw new Error(‘不支持该选择器‘) } } return Select})()
时间: 2025-01-30 23:20:45