JSI是一個(gè)簡(jiǎn)單、無侵入(被管理的腳本無需考慮JSI的存在)的腳本管理框架, JSI的出現(xiàn),可以做到如下幾點(diǎn):
* 按需裝載。
* 管理依賴,避免依賴的保露、擴(kuò)散,提高類庫的易用性。
* 執(zhí)行環(huán)境的隔離,避免名稱沖突。
類庫裝載
動(dòng)態(tài)裝載類庫是按需裝載的基礎(chǔ),JSI的裝載方式有三種:即時(shí)同步裝載(可能阻塞)、延遲同步裝載(需要編譯)、異步裝載。這里先演示一下最簡(jiǎn)單的方式,即時(shí)同步導(dǎo)入:
示例:重寫一下jQuery的hello world。
….
<!-- 加入引導(dǎo)腳本 -->
<script src="../scripts/boot.js"></script>
….
<script>
//導(dǎo)入jQuery的$函數(shù)
$import("org.jquery.$");
//使用jQuery的$函數(shù)
$(document).ready(function(){
alert("Hello World");
});
</script>
….
這是默認(rèn)的導(dǎo)入方式,當(dāng)能,如果網(wǎng)絡(luò)環(huán)境不好,這可能產(chǎn)生阻塞問題。所以JSI2開始增加了仍外兩種導(dǎo)入模式。延遲同步導(dǎo)入,異步導(dǎo)入。具體用法請(qǐng)查看文章后面的導(dǎo)入函數(shù)參考。
依賴管理
Java可以隨意的使用第三方類庫,可是JavaScript卻沒那么幸運(yùn),隨著類庫的豐富,煩雜的依賴關(guān)系和可能的命名沖突將使得類庫的發(fā)展越來越困難。程序的易用性也將大打折扣。
命名沖突的危險(xiǎn)無形的增加你大腦的負(fù)擔(dān);隨著使用的類庫的增加,暴露的依賴也將隨之增加,這是復(fù)雜度陡增的極大禍根,將使得系統(tǒng)越來越復(fù)雜,越來越難以控制。潛在的問題越來越多,防不勝防。
所以,我們建議類庫的開發(fā)者將自己類庫的依賴終結(jié)在自己手中,避免依賴擴(kuò)散,以提高類庫的易用性。
為了演示一下JSI的依賴管理,我們編寫一個(gè)復(fù)雜一點(diǎn)的類庫:類似Windows XP文件瀏覽器左側(cè)的滑動(dòng)折疊面板(任務(wù)菜單)效果。
1.編寫我們的折疊面板函數(shù)(org/xidea/example/display/effect.js):
/**
* 滑動(dòng)面板實(shí)現(xiàn).
* 當(dāng)指定元素可見時(shí),將其第一個(gè)子元素向上滑動(dòng)至完全被遮掩(折疊)。
* 當(dāng)指定元素不可見時(shí),將其第一個(gè)子元素向下滑動(dòng)至完全顯示(展開)。
*/
function slidePanel(panel){
panel = $(panel);
if(panel.style.display=='none'){
//調(diào)用Scriptaculous Effect的具體滑動(dòng)展開實(shí)現(xiàn)
new Effect.SlideDown(panel);
}else{
//調(diào)用Scriptaculous Effect的具體滑動(dòng)閉合實(shí)現(xiàn)
new Effect.SlideUp(panel);
}
}
2.編寫包定義腳本,申明其內(nèi)容及依賴(org/xidea/example/display/__$package.js):
//添加slidePanel(滑動(dòng)面板控制)函數(shù)
this.addScript("effect.js","slidePanel",null);
//給effect.js腳本添加對(duì)us.aculo.script包中effects.js腳本的裝載后依賴this.addScriptDependence("effect.js",
"us/aculo/script/effects.js",false);
//給effect.js腳本添加對(duì)net.conio.prototype包中$函數(shù)的裝載后依賴this.addScriptObjectDependence("effect.js",
"net.conio.prototype.$",false);
3.HTML代碼:
<html>
<head>
<title>重用aculo Effect腳本實(shí)例</title>
<link rel="stylesheet" type="text/css" href="/styles/default.css" />
<script src="/scripts/boot.js"></script>
<script>
$import("org.xidea.display.slidePanel");
</script>
</head>
<body>
<div class="menu_header"
onclick="slidePanel('menu_block1')">
面板 1
</div>
<div class="menu_block" id="menu_block1">
<ul>
<li>text1</li>
<li>text2</li>
<li>text3</li>
</ul>
</div>
</body>
</html>
onclick="slidePanel('menu_block1')"這個(gè)事件函數(shù)將在我們點(diǎn)擊面板標(biāo)題時(shí)觸發(fā),能后會(huì)調(diào)用Scriptaculous Effect的具體實(shí)現(xiàn)去實(shí)現(xiàn)我們需要的滑動(dòng)折疊功能。
這個(gè)效果只是八行代碼,比較簡(jiǎn)單,但是它用到了Scriptaculous Effect類庫,Scriptaculous Effect又簡(jiǎn)接用到了Prototype類庫,所以,傳統(tǒng)方式使用起來還是比較復(fù)雜,有一堆腳本需要導(dǎo)入prototype.js,effects.js,builder.js,更加痛苦的是這些腳本的導(dǎo)入還要遵守一定的順序。
但是,如果我們使用JSI 明確申明了這些依賴,那么使用起來就簡(jiǎn)單多了,只一個(gè)import就可以完全搞定。
此外 這里還有一個(gè)額外的好處,我們類庫中依賴的那些腳本,并不會(huì)對(duì)外部保露,在頁面上是不可見的,也就是說,這些依賴完全終結(jié)在剛才編寫的類庫中,不必?fù)?dān)心使用這些類庫帶來的名稱污染問題。
環(huán)境隔離
眾所周知, Scriptaculous所依賴的Prototype庫與jQuery存在沖突。所以同時(shí)使用比較困難。
下面的例子,我們將在同一個(gè)頁面上同時(shí)使用Scriptaculous和 jQuery 類庫。示范一下JSI隔離沖突功能。
示例頁面(hello-jquery-aculo.html):
<html>
<head>
<title>Hello jQuery And Scriptaculous</title>
<!-- 加入引導(dǎo)腳本 -->
<script src="../scripts/boot.js"></script>
<script>
//導(dǎo)入jQuery
$import("org.jquery.$");
//導(dǎo)入Scriptaculous
$import("us.aculo.script.Effect");
$(document).ready(function(){
//使用jQuery添加一段問候語
$("<p id='helloBox' style='background:#0F0;text-align:center;font-size:40px;cursor:pointer;'>\
Hello jQuery And Scriptaculous</p>")
.appendTo('body');
$('#helloBox').ready(function(){
//使用Scriptaculous高亮顯示一下剛才添加的內(nèi)容
new Effect.Highlight('helloBox');
}).click(function(){
//當(dāng)用戶單擊該內(nèi)容后使用jQuery實(shí)現(xiàn)漸出
$('#helloBox').fadeOut();
});
});
</script>
</head>
<body>
<p>文檔裝載后,jQuery將在后面添加一段問候語;并使用Scriptaculous高亮顯示(Highlight);在鼠標(biāo)點(diǎn)擊后在使用jQuery漸出(fadeOut)。</p>
</body>
</html>
其他話題
JSI組件模型:
頁面裝飾引擎:用于裝飾樸素html元素的框架,實(shí)現(xiàn)零腳本代碼的web富客戶端編程,更多細(xì)節(jié)請(qǐng)?jiān)L問jsi官方網(wǎng)站。
參考:
腳本導(dǎo)入函數(shù)
腳本導(dǎo)入函數(shù)是JSI唯一的一個(gè)在頁面上使用的系統(tǒng)函數(shù)。
function $import(path, callbackOrLazyLoad, target )
path 類庫路徑
callbackOrLazyLoad 可選參數(shù),如果其值為函數(shù),表示異步導(dǎo)入模式;如果其值為真,表示延遲同步導(dǎo)入模式,否則為即時(shí)同步導(dǎo)入(默認(rèn)如此)。
Target 可選參數(shù)(默認(rèn)為全局變量,所以說,這種情況等價(jià)于直接聲明的全局變量),指定導(dǎo)入容器。
名詞解釋:
* 自由腳本
通過<script>標(biāo)記引入或直接編寫的腳本,我們不建議在使用JSIntegration之后,仍舊使用script src導(dǎo)入JSI啟動(dòng)腳本(boot.js)之外的腳本。
* 托管腳本
通過$import函數(shù)直接或間接加載的腳本。這些腳本將在一個(gè)獨(dú)立的執(zhí)行上下文裝載,不會(huì)污染全局環(huán)境。
* 腳本依賴
若要使用A,需要導(dǎo)入B,則A依賴B。
A、B可以是腳本文件,也可以是腳本文件中的某個(gè)腳本元素。
* 類庫使用者
類庫的使用者,您只需再頁面上書寫腳本,導(dǎo)入類庫,編寫自己的簡(jiǎn)單腳本,一般情況請(qǐng)不要編寫js文件,那是類庫開發(fā)者做的事.
* 類庫開發(fā)者
在此框架下開發(fā)出方便實(shí)用的腳本庫,您需要編寫一些通用腳本,同時(shí)設(shè)置腳本依賴,做到任何類/函數(shù),導(dǎo)入即可運(yùn)行。
posted on 2007-06-02 14:16
金大為 閱讀(1628)
評(píng)論(0) 編輯 收藏 所屬分類:
JSI