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