程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> [dojo]dojo.ready(dojo.addOnLoad) “前傳”

[dojo]dojo.ready(dojo.addOnLoad) “前傳”

編輯:C#入門知識

最近的項目中使用了dojo框架,每個頁面中大量使用了 dojo.ready 來完成頁面初始化的工作。但因為某種原因,需要在所有的 dojo.ready 之前做一些事。
對於 dojo 1.6 以前(包括1.6) 來說,這稍微有點麻煩。看源碼:
[csharp]
dojo.ready = dojo.addOnLoad = function(/*Object*/obj, /*String|Function?*/functionName){ 
        d._onto(d._loaders, obj, functionName); 
 
        if(d._postLoad && d._inFlightCount == 0 && !d._loadNotifying){ 
            d._callLoaded(); 
        } 
    } 

dojo.ready = dojo.addOnLoad = function(/*Object*/obj, /*String|Function?*/functionName){
  d._onto(d._loaders, obj, functionName);

  if(d._postLoad && d._inFlightCount == 0 && !d._loadNotifying){
   d._callLoaded();
  }
 }真正執行初始化方法的是 dojo.loaded:
[csharp]
dojo.loaded = function(){ 
 
    d._loadNotifying = true; 
    d._postLoad = true; 
    var mll = d._loaders; 
 
    //Clear listeners so new ones can be added  
    //For other xdomain package loads after the initial load.  
    d._loaders = []; 
 
    for(var x = 0; x < mll.length; x++){ 
        mll[x](); 
    } 
 
    d._loadNotifying = false; 
     
    if(d._postLoad && d._inFlightCount == 0 && mll.length){ 
        d._callLoaded(); 
    } 

dojo.loaded = function(){

 d._loadNotifying = true;
 d._postLoad = true;
 var mll = d._loaders;

 //Clear listeners so new ones can be added
 //For other xdomain package loads after the initial load.
 d._loaders = [];

 for(var x = 0; x < mll.length; x++){
  mll[x]();
 }

 d._loadNotifying = false;
 
 if(d._postLoad && d._inFlightCount == 0 && mll.length){
  d._callLoaded();
 }
}通過 dojo.ready(addOnLoad) 加入的 function, 都保存在 dojo._loaders 的數組中。
那麼,只好重寫 loaded 方法了:
[csharp]
dojo._inits = []; 
dojo.addInit = function(obj) { 
   dojo._inits.push(obj); 
}; 
 
dojo.loaded = function(){ 
    var d = dojo; 
    d._loadNotifying = true; 
    d._postLoad = true; 
 
    var mll = []; 
    for(var i=0; i<d._loaders.length; i++) { 
        console.log(d._loaders[i]); 
        mll.push(d._loaders[i]); 
        if (d._loaders[i].toString().indexOf('registerWin') > -1) 
            for(var j=0; j<d._inits.length; j++) 
                mll.push(d._inits[j]); 
        } 
    } 
 
    d._loaders = []; 
    d._inits = []; 
 
    for(var x = 0; x < mll.length; x++){ 
        mll[x](); 
    } 
 
    d._loadNotifying = false; 
    if(d._postLoad && d._inFlightCount == 0 && mll.length){ 
        d._callLoaded(); 
    } 

dojo._inits = [];
dojo.addInit = function(obj) {
   dojo._inits.push(obj);
};

dojo.loaded = function(){
 var d = dojo;
 d._loadNotifying = true;
 d._postLoad = true;

    var mll = [];
    for(var i=0; i<d._loaders.length; i++) {
        console.log(d._loaders[i]);
     mll.push(d._loaders[i]);
     if (d._loaders[i].toString().indexOf('registerWin') > -1)
         for(var j=0; j<d._inits.length; j++)
          mll.push(d._inits[j]);
     }
    }

 d._loaders = [];
 d._inits = [];

 for(var x = 0; x < mll.length; x++){
  mll[x]();
 }

 d._loadNotifying = false;
 if(d._postLoad && d._inFlightCount == 0 && mll.length){
  d._callLoaded();
 }
}我在 dojo 中加入了 _inits 數組,保存通過 addInit 注冊的方法。然後檢查所有通過 dojo.ready /  addOnLoad 加入的方法,在dijit 完成注冊(這時候 dojo parse 已經結束)後,把 _inits 裡的方法插入。這樣我就可以通過 dojo.addInit 在框架中加入一些處理,讓它們始終在 dojo.ready / addOnLoad 加入的方法之前被執行。

測試:
[javascript]
dojo.ready(function() { console.log(1); }); 
dojo.ready(function() { console.log(2); }); 
dojo.addInit(function() { console.log('init'); }); 

dojo.ready(function() { console.log(1); });
dojo.ready(function() { console.log(2); });
dojo.addInit(function() { console.log('init'); });
結果:
[html] view plaincopyprint?日志: init 
日志: 1 
日志: 2 

日志: init
日志: 1
日志: 2
從 dojo 1.7 開始,dojo.js 就大部分重寫了。 dojo.ready 的接口也變了:
[csharp] view plaincopyprint?var ready = dojo.ready = dojo.addOnLoad = function(priority, context, callback) 

var ready = dojo.ready = dojo.addOnLoad = function(priority, context, callback)加入了 priority 優先級參數,上面的實現可以大大簡化。當默認通過 dojo.ready(function() {...}) 加入的方法,默認的 priority = 1000。
這樣下面的代碼就可以輕松搞定:
[csharp]
dojo.addInit = function(obj) { dojo.ready(1, obj); }; 

dojo.addInit = function(obj) { dojo.ready(1, obj); };


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved