<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-9  評論-168  文章-266  trackbacks-0

    Omar AL Zabir這位MVP總是喜歡搞些稀奇古怪同時又很實用的小東西,并且還十分值得參考。最近他就做了一個叫做ensure的小工具用于動態(tài)加載JavaScript、CSS與HTML,而且IE、Firefox、Opera、Safari都支持了,那么我們就來看看ensure是如何做到動態(tài)加載JavaScript與CSS的。

    在介紹ensure內(nèi)部的實現(xiàn)之前,讓我們先來看看其功能:

    ensure({
        html: "popup.html",
        javascript: "popup.js",
        css: "popup.css"
      }, function() {
        Popup.show("hello world");
      }
    );

    在這段代碼中,ensure首先會確保popup.html、popup.js、popup.css這3個文件的加載,如果都沒加載過ensure 就會動態(tài)加載它們;如果已經(jīng)加載過了,ensure不會再次加載。在確保這3個文件都加載后,ensure會調(diào)用后面的匿名函數(shù),也就是執(zhí)行 Popup.show("hello world");。

    接下來,就讓我們看看ensure是如何動態(tài)加載JavaScript與CSS的。

    加載JavaScript

    在ensure當中,加載JavaScript分兩種情況來執(zhí)行,也就是Safari與非Safari這兩種情況。

    在IE、Firefox、Opera中加載JavaScript

    在這三款瀏覽器中加載JavaScript,其實只需要創(chuàng)建一個script元素,把src指向要加載的URL,最后把script元素追加到head元素上,那就搞掂了。此項工作是在HttpLibrary.createScriptTag()中完成的。不過我們不僅僅要加載JavaScript,同時還需要知道它什么時候完成加載,這可以通過script元素的onload事件或onreadystatechange事件來實現(xiàn)。

    在Safari中加載JavaScript

    因為Safari 2不支持onload或者onreadystatechange,所以只能手動通過XHR把URL讀去過來,然后再手動eval這段代碼,這就帶來了一個限制──只能加載本域的JavaScript文件。在ensure當中,eval的工作是通過HttpLibrary.globalEval()來完成的。為了讓JavaScript代碼在全局(global)上下文中eval,ensure還是使用了創(chuàng)建script元素的方法,并將要eval的JavaScript置于其內(nèi),最后把script元素追加到head元素內(nèi)。

    細心的人肯定要問,為什么HttpLibrary.globalEval()要如此設計,而非直接window.eval或者eval.call。這是因為,window.evaleval.call都無法在IE6中實現(xiàn)和script標簽加載JavaScript代碼一模一樣的效果,這兩種做法的eval在IE6下仍然不是在全局上下文中執(zhí)行的。搜索一下你就會發(fā)現(xiàn)一些相關(guān)的討論,例如jQuery就曾經(jīng)使用window.execScript()來完成此項任務。不過最終大家都發(fā)現(xiàn)添加script元素才是最好的跨瀏覽器解決方案,所以現(xiàn)在的jQuery和ensure都是如此實現(xiàn)的了。

    加載CSS

    相對于加載JavaScript而言,加載CSS就簡單多了,而且方法也是類似的:在head元素內(nèi)直接加入link元素就可以了。這也正是loadCSS()所完成的工作。

    實際上,ensure沒有確保CSS完成加載后再執(zhí)行下去。這估計是因為瀏覽器都能夠在CSS加載完成后自動應用到頁面上,因此Omar AL Zabir就認為CSS的加載順序是無關(guān)緊要的,不過假如CSS加載速度實在太慢,其實還是會影響顯示效果的。

    在IE6中加載CSS

    這次需要特別照顧的是IE6,而非Safari。IE6在往head元素添加link元素時,必須在window的上下文中完成,因此添加link的函數(shù)通過call調(diào)用切換了上下文。

    總結(jié)

    實際上動態(tài)加載JavaScript與CSS都并不難,在大多數(shù)情況下只需要向head元素追加對應的子元素就可以了,只有Safari2和IE6這兩款古老的瀏覽器是需要特殊照顧的。

                                                                                   轉(zhuǎn)自----http://www.cnblogs.com/cathsfz/archive/2008/09/02/1282415.html
    posted on 2009-12-25 15:49 紫蝶∏飛揚↗ 閱讀(694) 評論(0)  編輯  收藏 所屬分類: div+css+js代碼
    主站蜘蛛池模板: 最新中文字幕电影免费观看| 猫咪免费人成网站在线观看| 特级做a爰片毛片免费看| 日韩一区二区三区免费播放| 永久免费av无码网站大全| 亚洲精品和日本精品| 亚洲电影一区二区| 亚洲AV无码无限在线观看不卡| 亚洲第一成年网站视频| 永久免费A∨片在线观看| 男人的好免费观看在线视频| 亚洲日韩欧洲无码av夜夜摸| 亚洲一级片在线播放| 一级做受视频免费是看美女| 国产成人精品免费视频大| 免费成人午夜视频| 亚洲福利一区二区精品秒拍| 一级毛片在线免费视频| 亚洲人成网站在线播放vr| 免费国产成人午夜在线观看| 吃奶摸下高潮60分钟免费视频| 黄色免费网址大全| 精品无码国产污污污免费| 羞羞网站在线免费观看| 亚洲日韩精品一区二区三区无码| 免费91麻豆精品国产自产在线观看 | 好爽好紧好大的免费视频国产| 亚洲欧洲成人精品香蕉网| 最近免费中文字幕mv在线电影 | 中文字幕亚洲无线码a| 亚洲精品理论电影在线观看| 一本色道久久88综合亚洲精品高清 | 国产一卡2卡3卡4卡无卡免费视频 国产一卡二卡3卡四卡免费 | 美女黄网站人色视频免费| 亚洲中文字幕无码永久在线| 日本黄网站动漫视频免费| 日本亚洲高清乱码中文在线观看| 一本岛高清v不卡免费一三区| 国产亚洲欧美日韩亚洲中文色| 亚洲综合无码精品一区二区三区| 亚洲免费观看在线视频|