ExtJS 4.1 TabPanel動態加載頁面並執行腳本


知道extjs是很久以前的事情,但是一直沒有機會用到。不怕大家笑話,直到上個星期准備用它了,這才開始接觸,沒想到一開始就碰到難題。TablePanel動態加載頁面很簡單的,官方有示例,但是我加載的頁面需要執行腳本,為了這個功能,研究了足足4天。看來我把extjs想的太簡單了,還是需要對它深入了解下。

第一天,按照官方示例,可以動態加載頁面,可是腳本不執行,於是查SDK、google,發現scripts需要設置為true,於是設置該屬性,整個代碼如下

tabPanel.add({

title: 'dynamic page',

closable: true,

loader: { 'test.htm', loadMask: 'loading...', autoLoad: true, scripts: true }

});

剛開始以為加載頁面的腳本寫的有問題,因為查了很多資料,有人說要寫在<body>里面,有人說只能寫在頁面上,不能用src引用js文件,但無論怎么試也不行,我的加載頁面很簡單,只要頁面被加載就出彈窗

<script type="text/javascript">

alert("addd");

</script>

后來想,是不是需要在tab被激活的事件手工load,而不是autoLoad,於是再次實驗,終於成功了,興奮!

tabPanel.add({

title: 'dynamic page',

closable: true,

loader: { 'test.htm', loadMask: 'loading...', autoLoad: true, scripts: true }

listeners: {
activate: function(tab){
tab.loader.load();
}
}

});

本來想着到此為止,一天時間總算搞定這個tab,但是興奮之余發現,該做法是有問題的,每次點擊tab,都會觸發激活事件,去讀取后台頁面一次,而我想要的效果是,前台加載一次之后,切換tab也不要再訪問后台。於是查SDK、google,想在activate事件里,判斷tab已經load,但是未果

第二天,去掉了listeners,然后莫名其妙想測試加載頁面的loading效果,特意將頁面線程阻止,加入以下代碼

System.Threading.Thread.Sleep(5000);

這次是無心插柳,發現隔了5秒加載的頁面,居然能正常執行腳本了!

我的操作步驟如下:點了加載按鈕,然后點擊動態加載的tab,該tab無內容,隔了5秒,內容出現,腳本執行

但是被加載的頁面不能總是被sleep,於是繼續查資料繼續試,甚至開始調試extjs的源代碼,這里說下如何調試,頁面切換以下腳本

<script type="text/javascript" src="/Scripts/ext/ext-all.js"></script>改為

<script type="text/javascript" src="/Scripts/ext/ext-debug.js"></script>

如何調試就不解釋了,google多的是,調試了一天,無果。不過對extjs的代碼算是有了第一次親密接觸

而且還發現一個奇怪的事情,在調試的時候,就算加入了Sleep(5000),加載的頁面腳本也無法執行,越來越納悶

第三天,狂加QQ群,各論壇網站發帖,繼續google,無果

第四天,算是我點幸,用微軟的bing搜索autoload:true, scripts:true,出來的第條,就有這樣的介紹,不過是講extjs 4.0的panel如何加載頁面執行腳本的,於是按照它的代碼測試

Ext.onReady(function () {

  var panel = Ext.create('Ext.Panel', {

  title: 'Anchor Layout',  

  renderTo:Ext.getBody(),  

  loader:{ url: "test.htm",autoLoad:true, scripts:true}//加載1.htm頁面

  });

  });

該代碼居然能成功執行!這下徹底興奮了,因為tab可以加載任意的component,當然也可以加載panel,於是修改我的代碼

var panel = Ext.create('Ext.Panel',{

title: 'dynamic page',

renderTo:Ext.getBody(),

closable: true,

loader: { 'test.htm', loadMask: 'loading...', autoLoad: true, scripts: true }

});

tabPanel.add(panel);

成功了!真的狂喜,花費4天下來,總算是有個好的結果,這種喜悅,只有我們技術人員才能理解到

比較代碼差異,發現就少了這么一個配置,就是我上面黃色標出來的,renderTo:Ext.getBody(),居然,居然要被render一下,才能正常顯示腳本,為什么SDK沒有!!

但是,但是……這也不是一個完美的解決辦法,細心的朋友就知道,該腳本會把加載頁面首先加載到主頁面上,切換tab才會消失,這么嚴重的問題,因為當時太興奮,居然沒有發現,唉。

不得不停下敲鍵盤的手,仔細思考起來,我有3次加載頁面執行腳本成功,這3次分別是

1、tab被activate的事件中

2、sleep之后點擊tab等待頁面加載好

3、加入renderTo配置

經過長時間思考,終於發現這3次成功的時候,都有個共同點,加載的頁面被顯示出來了,也就說,如果tab先load頁面,然后再“被看見”,那腳本就不執行了

為了驗證我的想法,於是馬上動手測試,把sleep設為100毫秒,點擊加載按鈕,隔了1秒再去看加載出來的tab,果然腳本不執行了!!!

總算找到原因:tab必須先“展現”出來,然后再去load,那這就簡單了,馬上查SDK,不難發現show這個方法,於是修改代碼

tabs.add({

title: 'dynamic page',

//renderTo: Ext.getBody(),

loader: {

url: 'test.htm',

loadMask: 'loading...',

autoLoad: true,

scripts: true

}

}).show();

OK,腳本正常執行,到此我的問題“完美”解決

之所以打引號,因為還有一個小小的問題,一直沒有解決,想請教各位,為什么loadMask這個配置沒有效果,只有在activate事件中才有效果呢?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM