假设有如下js代码,用于修改html元素一些方法var $=function(o){
var _o=document.getElementById(o);
return {
setAttr:function(a,b){
_o[a]=b
},
setCss:function(a,b){
_o.style[a]=b;
}
};
};这样通过$("div1").css("..","..")可以修改元素的css,
但如果我想在$中扩展一个新的方法html(),目的是修改元素的innerHTML属性,
如:$("div1").html("123");
在不改动原来的$函数的情况下如何通过prototype、extend或其他方式扩展?
var _o=document.getElementById(o);
return {
setAttr:function(a,b){
_o[a]=b
},
setCss:function(a,b){
_o.style[a]=b;
}
};
};这样通过$("div1").css("..","..")可以修改元素的css,
但如果我想在$中扩展一个新的方法html(),目的是修改元素的innerHTML属性,
如:$("div1").html("123");
在不改动原来的$函数的情况下如何通过prototype、extend或其他方式扩展?
_o=document.getElementById(o);
return {
self:_o;
setAttr:function(a,b){
_o[a]=b
},
setCss:function(a,b){
_o.style[a]=b;
}
};
};$函数的设计可以改变,但一旦定下来后,$函数便不能修改,而且在$函数不能预知扩充的方法的情况下怎么扩展其中的方法;
var el = function(dom){
this.dom = dom;
};
el.prototype = {
destroy: function(){this.dom = null},
setAttr: function(a, b){this.dom[a] = b},
setCss: function(a, b){this.dom.style[a] = b}
};
var $ = function(o){
return new el(document.getElementById(o));
};
$('xxx').setAttr('x', 'y');要扩展的话只要扩展el类就OK。比如
el.prototype.html = function(x){this.dom.innerHTML = x}这些只提供一个参考,它的缺点:
1.每次$都会生成一个el对象,可能会消耗内存。
2.el的每个方法中没对dom检查,可能会抛出异常。你可以自行设计。
var $=function(o){
_o=document.getElementById(o);
var fn = {};
for(var i in $.fn) {
fn[i]= function(){
$.fn[i].call(_o);//更改调用者为html标签
}
}
return fn;
};
$.fn = {
setAttr:function(a,b){
this[a]=b
},
setCss:function(a,b){
this.style[a]=b;
}
}$.fn.html = function(a){//扩展html方法
this.innerHTML = a;
}
var _o = document.getElementById(o);
var fn = {};
for(var i in $.fn) {
(function(i){
fn[i]= function(){
var argArr = [],parArr = "";;
for(var j=0;j<arguments.length;j++) {
argArr.push(arguments[j]);
parArr += "argArr["+j+"]";
if(j!=arguments.length-1) parArr+=",";
}
eval("$.fn[i].call(_o,"+parArr+");")//更改调用者为html标签
};
})(i);
}
return fn;
};
customHtml:function(){},
customText:function(){}
......
});
(function($){
$.fn.extend({
customHtml:function(){},
customText:function(){}
......
});
})(jQuery)
//页面追加:
$.extend($.fn,{test:function(p){alert(p);}});
$('body').test('test!');