用原生js实现jquery的一些方法
1.显示/隐藏
1 2 3 4 5 6 7 8 9 10 |
//hide()
Object.prototype.hide = function (){
this .style.display= "none" ;
return this ;
}
//show()
Object.prototype.show = function (){
this .style.display= "block" ;
return this ;
}
|
return this的好处在于链式调用。
2.滑动 省略speed和callback的传入,因为要加一串判断和处理回调,代码量大
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//slideDown()
Object.prototype.slideDown = function (){
this .style.display = 'block' ;
if ( this .clientHeight< this .scrollHeight){
this .style.height=10+ this .clientHeight+ "px" ;
var _this = this ;
setTimeout( function (){_this.slideDown()},10)
} else {
this .style.height= this .scrollHeight+ "px" ;
}
}
//slideUp()
Object.prototype.slideUp = function (){
if ( this .clientHeight>0){
this .style.height= this .clientHeight-10+ "px" ;
var _this = this ;
setTimeout( function (){_this.slideUp()},10)
} else {
this .style.height=0;
this .style.display = 'none' ;
}
}
|
3.捕获/设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
//attr()
Object.prototype.attr = function (){
if (arguments.length==1){
return eval( "this." +arguments[0]);
} else if (arguments.length==2){
eval( "this." +arguments[0]+ "=" +arguments[1]);
return this ;
}
}
//val()
Object.prototype.val = function (){
if (arguments.length==0){
return this .value;
} else if (arguments.length==1){
this .value = arguments[0];
return this ;
}
}
//html()
Object.prototype.html = function (){
if (arguments.length==0){
return this .innerHTML;
} else if (arguments.length==1){
this .innerHTML = arguments[0];
return this ;
}
}
//text()需要在html()结果基础上排除标签,会很长,省略
|
4.CSS方法
1 2 3 4 5 6 7 8 9 |
//css()
Object.prototype.css = function (){
if (arguments.length==1){
return eval( "this.style." +arguments[0]);
} else if (arguments.length==2){
eval( "this.style." +arguments[0]+ "='" +arguments[1]+ "'" );
return this ;
}
}
|
5.添加元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//append()
Object.prototype.append = function (newElem){
this .innerHTML += newElem;
return this ;
}
//prepend()
Object.prototype.prepend = function (newElem){
this .innerHTML = arguments[0] + this .innerHTML;
return this ;
}
//after()
Object.prototype.after = function (newElem){
this .outerHTML += arguments[0];
return this ;
}
//before()
Object.prototype.before = function (newElem){
this .outerHTML = arguments[0] + this .outerHTML;
return this ;
}
|
6.删除/替换元素
1 2 3 4 5 6 7 8 9 10 11 |
//empty()
Object.prototype.empty = function (){
this .innerHTML = "" ;
return this ;
}
//replaceWith()
Object.prototype.replaceWith = function (newElem){
this .outerHTML = arguments[0];
return this ;
}
//remove() js自带,省略。
|
7.设置css类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//hasClass()
Object.prototype.hasClass = function (cName){
return !! this .className.match( new RegExp( "(\\s|^)" + cName + "(\\s|$)" ) );
}
//addClass()
Object.prototype.addClass = function (cName){
if ( ! this .hasClass( cName ) ){
this .className += " " + cName;
}
return this ;
}
//removeClass()
Object.prototype.removeClass = function (cName){
if ( this .hasClass( cName ) ){
this .className = this .className.replace( new RegExp( "(\\s|^)" + cName + "(\\s|$)" ), " " );
}
return this ;
}
|
上面的设置CSS类也可以利用html5新API classList及contains实现 但不兼容IE8以下及部分火狐浏览器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Object.prototype.hasClass = function (cName){
return this .classList.contains(cName)
}
Object.prototype.addClass = function (cName){
if ( ! this .hasClass( cName ) ){
this .classList.add(cName);
}
return this ;
}
Object.prototype.removeClass = function (cName){
if ( this .hasClass( cName ) ){
this .classList.remove(cName);
}
return this ;
}
|
9.选择器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//id或class选择器$("elem")
function $(strExpr){
var idExpr = /^(?:\s*(<[\w\W]+>)[^>]*| #([\w-]*))$/;
var classExpr = /^(?:\s*(<[\w\W]+>)[^>]*|.([\w-]*))$/;
if (idExpr.test(strExpr)){
var idMatch = idExpr.exec(strExpr);
return document.getElementById(idMatch[2]);
} else if (classExpr.test(strExpr)){
var classMatch = classExpr.exec(strExpr);
var allElement = document.getElementsByTagName( "*" );
var ClassMatch = [];
for ( var i=0,l=allElement.length; i |
需要强调的是,选择器返回的结果或结果集包含的是htmlDOM,并非jquery的对象。大多数人都知道,document.getElementById("id")等价于jquery$("#id")[0],另外上面class选择器选择的结果如需使用,需要利用forEach遍历:
1 2 3 |
$( ".cls" ).forEach( function (e){
e.css( "background" , "#f6f6f6" )
})
|
10.遍历 siblings()和children()获取的结果也需要结合forEach使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
//siblings()
Object.prototype.siblings = function (){
var chid= this .parentNode.children;
var eleMatch = [];
for ( var i=0,l=chid.length;i |