1 // attr()方法 2 lquery.prototype.attr = function(attr,value){ 3 4 if(arguments.length == 2){ //设置 5 for(var i=0;i<this.elements.length;i++){ 6 this.elements[i].setAttribute(attr,value); 7 } 8 } 9 else if(arguments.length == 1){ //获取 10 return this.elements[0].getAttribute(attr); 11 } 12 return this; 13 };
▓▓▓▓▓▓ eq()方法的实现
实现$('div').eq(1)
由于eq()方法返回的对象要操作许多lQuery的方法,所以返回的对象必须是lQuery对象
1 lQuery.prototype.eq = function(num){ 2 return lQ(this.elements[num]); 3 };
▓▓▓▓▓▓ index()方法的实现
实现$('div').index() 返回这个元素在同辈元素中的位置
1 lQuery.prototype.index = function(){ 2 3 var elems = this.elements[0].parentNode.children; 4 5 for(var i=0;i<elems.length;i++){ 6 if( elems[i] == this.elements[0] ){ 7 return i; 8 } 9 } 10 };
▓▓▓▓▓▓ 阻止默认事件和阻止事件冒泡
在jQuery中 return false 是阻止默认事件和事件冒泡,所以我们要对lQbind函数进行修改,通过判断绑定的函数的返回值是否为false来判断是否要进行阻止默认事件和阻止事件冒泡
1 function lQbind(obj,events,fn){ 2 if(obj.addEventListener){ 3 obj.addEventListener(events,function(ev){ 4 5 if( fn() == false ){ 6 ev.preventDefault(); 7 ev.cancelBubble = true; 8 } 9 10 },false); 11 } 12 else{ 13 obj.attachEvent('on'+events,function(){ 14 15 if( fn() == false ){ 16 window.event.cancelBubble = true; 17 return false; 18 } 19 20 }); 21 } 22 }
▓▓▓▓▓▓ find()方法的实现
仿写$('div').find('.box')和$('div').find('#box')方法
这里涉及到通过判断find()参数第一个字符的方法来进行不同的操作和$()方法差不多,在循环时要使用concat()方法来连接数组,最后返回一个lQuery对象
1 lQuery.prototype.find = function(sel){ 2 3 var arr = []; 4 5 if( sel.charAt(0) == '.' ){ 6 for(var i=0;i<this.elements.length;i++){ 7 arr = arr.concat(getClass( this.elements[i] , sel.substring(1) )); 8 } 9 } 10 else{ 11 for(var i=0;i<this.elements.length;i++){ 12 arr = arr.concat(toArray(this.elements[i].getElementsByTagName(sel))); 13 } 14 } 15 return lQ(arr); 16 };