自分で書いた軽量級javascriptフレームワークの設計モード
4326 ワード
jQuery
, jQuery , 。 js , js ,
javascript
PHP ,
javascript
, 、 、 ……, , jQuery 。
自分で書いたフレームも名前が分からず、書き始めたばかりの頃にW(姓ピンイン、前にjQueryポップアッププラグインwBoxと書いたことがあります)を手当たり次第に書きましたが、今この文章を書いて考え直してYQ(名前ピンイン、わかります~)に変えました.
コアコード
フレームワークの設計時にできるだけチェーン式の書き方をサポートして、つまり
this
を返して、$(selector)できます.handler1().handler 2()・・・無限書きで、戻り値があるものでなければ続けられます.event,dom,css,そしてfadeIn,fadeOutアニメーション(愛壁[html 5+css 3]版を再構築したため、すべてのついでにこの機能を加えた).sizzleセレクタを合わせるともっとすごい!以下、フレームワークのコアコードについて説明します.完備したら、新版html 5の愛壁と一緒に放出します.主なコードは以下の通りです.
(function(window,document){
var DOC = document,YQ = window.$ = function(selector){
if(!selector){
return YQ.elems
}
typeof selector === 'string' && (selector = getElements(selector));// dom , ,
return superElems(selector);
}
function superElems(elems){
if(elems){
if(elems.nodeType){// DOM
if(typeof elems.getAttribute !=="unknown"){
var temp = elems;
elems = [];
elems[0] = temp;// ,
for(var i in YQ.elems){
// ,
typeof elems[i] === "undefined" && (elems[i] = YQ.elems[i])
}
}
}else{// ,
elems = YQ.extend(elems,YQ.elems);
}
}
return elems;
}
function getElements(selector){
// , sizzle
var dom = DOC.getElementById(selector);//……
return dom;
}
YQ.tool = {
isFunction:function(obj){//
return obj && typeof obj ==="function";
}
}
//
YQ.elems = {
each:function(dom,callback){// each
if(YQ.tool.isFunction(dom)){
arguments.callee.call(this,this,dom);
}else{
for (var i = 0, len = dom.length; i < len; i++) {
callback.call(dom, i, dom[i]);
}
}
return this;
},
find:function(selector){
var doms = [];
this.each(function(i,dom){
doms.push(YQ.DOM.find(selector,dom));
})
return superElems(doms);
}
}
YQ.each = window.Array.prototype.each = YQ.elems.each;// Array
YQ.extend = function(subClass,baseClass){
for(var i in baseClass){
subClass[i] = baseClass[i];
}
return subClass;
}
YQ.AJAX = {}
YQ.CSS = {
names:{
'float':'cssFloat',// cssFloat or styleFloat
opacity:'opacity'
//……
}
}
YQ.browser = {
isIE:'',
isFirefox:'',
version:'3.6'
//……
}
YQ.event = {
names:{
mousewheel:YQ.browser?"DOMMouseScroll":"mousewheel"
},
fix:function(e){
if(e && e.clone) return e;// ,
e = window.event || e;//event
var fixE = {
clone:true,
stop:function(){//
if(e&&e.stopPropagation){
e.stopPropagation();
}else{
e.cancleBubble = true
}
},
prevent:function(){//
if(e && e.preventDefault){
e.preventDefault();
}else{
e.returnValue = false;
}
},
target:e.target || e.srcElement,
x:e.clientX || e.pageX,
Y:e.clientY || e.pageY,
//
wheel:e.wheelDelta/120 || -e.detail/3
}
return fixE;
}
}
YQ.DOM = {
find:function(selector,parentDom){
//do something
}
}})(window,document);
簡単な分析
コードの中の注釈はまだ详しくて、注釈を结び付けて理解することができて、下で私は更にいくつかの言叶を言って、达人は漂って、レンガを撮ることを歓迎します......いずれも匿名の関数で、グローバル変数$(すべてドルが好きなようで、もし好きな人民元があれば、次回加えます)を定义して、関数の中にYQの対象があって、多くのfunctionがあって、いくつかの私有を含みます.
$をセレクタとして使用し、空の場合はYQを返します.Elemsオブジェクト、選択したDOMはYQ.elemsを拡張して、最後に得たのは注釈の中で言うsuperElems(ここでsuperElemsを作成する方法は以下のjRaiserを参考にした)で、jQueryのsuperElemsと似ていて、多くの方法をバインドして、便利に操作することができて、YQの方法はYQ.Elemsはセレクタが選択するオブジェクトに拡張され、セレクタの主な関数getElementsはsizzleを使用することができ、dom操作を便利にすることができるが、sizzleもコードが多すぎるようで、ここでは将来簡単なラベル、#IDをサポートする.class、ラベル+classセレクタ.
また、フレームワークの中には、上のようなArray,stringを拡張するものもある.eachメソッド、YQ.elems.eachは重量級の関数法であり,superElemsの遍歴(自身を返す)をサポートしたり,単純な配列の遍歴をサポートしたりすることができる.
フレームワークでは、YQなどの互換性も処理する.event.fix処理イベント、cssでfloatを処理
基本的にはこれだけですが、今日はコアの部分についてお話ししますが、実はこのコードでこのフレームワークの思想がはっきりと理解できました.その後、力を与えるcodingを続け、拡張を補充します.これまでフレームワークは800行未満で、よく見られるjQueryメソッドが含まれていました.圧縮後9 k未満、gzip 4.5 K~
詳細:
http://www.gwdang.com/app/extension
http://www.gwdang.com