知道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事件中才有效果呢?