欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
YY in Limbo 混沌??裣?? DOM加載事件的終極解決方案

今天被土豆網(wǎng)的lex鄙視了,因為我的BLOG在Safari里根本無(wú)法瀏覽——loading永遠不會(huì )結束,很明顯,這意味著(zhù)webkit引擎不支持上次提到的判斷DOM加載完成的方法。

既然開(kāi)了新文章,就干脆重新回顧一下這個(gè)問(wèn)題:如今的javascript編程非常依賴(lài)DOM(文檔對象模型),對HTML和XML來(lái)說(shuō),DOM是一個(gè)應用程序接口 (API) ,對JS來(lái)說(shuō),DOM為文檔創(chuàng )建了程序可以使用的對象和方法,DOM把前端程序和內容結合在一起,就好像ORM(對象-關(guān)系映射,比如PEAR庫里的DB_DataObject)把后臺程序和關(guān)系數據庫結合在一起,形象點(diǎn)說(shuō)它是一顆節點(diǎn)樹(shù),沒(méi)有這棵樹(shù)的支撐,很多JS方法就無(wú)法使用。

傳統方式是通過(guò)window.onload事件來(lái)判斷DOM是否加載完成,但實(shí)際上它的加載時(shí)間里還包括了img標簽插入的圖片、FLASH等大家伙,很多時(shí)候,來(lái)不及等這些東西都下載完成才執行JS(特別是當你要用JS給頁(yè)面元素注冊事件、調整外觀(guān),用AJAX加載重要內容)。所以必須有一種方法來(lái)單獨判斷DOM是否加載完成。

國外很早就有強者解決了這個(gè)問(wèn)題,但我上次看的資料其實(shí)不完整(不求甚解的下場(chǎng)),最終的解決方案是在幾個(gè)人的BLOG上討論出來(lái)的……blogsphere(博客圈)果然是一種能激發(fā)創(chuàng )造性的社區結構……

首先是Dean Edwards指出了兩件重要的工具:

  • Mozilla提供一個(gè)很棒的事件:DOMContentLoaded
  • 微軟支持defer屬性,這并不是私有屬性,而是包括在W3C的DOM 1標準里的,但是它似乎沒(méi)有被XHTML支持,還有一個(gè)特點(diǎn)是,defer只能放在script標簽里,而不能用JS來(lái)添加。

那么首先在Firefox上判斷DOM加載完成就很簡(jiǎn)單了:

  1. if (document.addEventListener) 
  2. {
  3.     document.addEventListener("DOMContentLoaded", init, false);
  4. }

Opera9也支持上面的方法,但更低版本就不行了……

至于IE,最早提出的方法是把init函數放在一個(gè)單獨的ie_onload.js里執行,在HTML調用腳本時(shí)加入條件注釋和defer:

  1. <!--[if IE]><script defer src="ie_onload.js"></script><![endif]-->

或者:

  1. <!--[if IE]><script defer src="javascript:'init()'"></script><![endif]-->

這個(gè)方法的缺點(diǎn)是要在HTML里嵌入代碼,缺乏靈活性,在Matthias Miller加入討論后,產(chǎn)生了更方便的實(shí)現方法:

  1. // for Internet Explorer
  2.       /*@cc_on @*/
  3.       /*@if (@_win32)
  4.           document.write("<scr"+"ipt id=__ie_onload defer src=//0><\/scr"+"ipt>");
  5.           var script = document.getElementById("__ie_onload");
  6.           script.onreadystatechange = function() {
  7.               if (this.readyState == "complete") {
  8.                   init(); // call the onload handler
  9.               }
  10.           };
  11.       /*@end @*/

這里的cc就是conditional compilation(條件編譯),跟條件注釋很像,具體介紹可以看這里翻譯的文章。這里使用CC是因為內部的代碼會(huì )引起非IE瀏覽器的錯誤(比如Safari會(huì )出錯)

而“script”被拆成”scr”+”ipt”似乎是為了避免與諾頓(Norton Internet Security)發(fā)生沖突-_____-b

如果你以為這樣就可以應付所有情況了,就會(huì )像我一樣被Safari用戶(hù)鄙視……

jQuery的創(chuàng )始人John Resig在郵件列表里給出了Safari的解決方法:

  1. // for Safari
  2.       if (/WebKit/i.test(navigator.userAgent)) { // sniff
  3.           window.__load_timer = setInterval(function() {
  4.               if (/loaded|complete/.test(document.readyState)) {
  5.                   init(); // call the onload handler
  6.               }
  7.           }, 10);
  8.       }

最后有人封裝了完整的代碼:

  1. /*
  2. * (c)2006 Dean Edwards/Matthias Miller/John Resig
  3. * Special thanks to Dan Webb's domready.js Prototype extension
  4. * and Simon Willison's addLoadEvent
  5. *
  6. * For more info, see:
  7. * http://dean.edwards.name/weblog/2006/06/again/
  8. * http://www.vivabit.com/bollocks/2006/06/21/a-dom-ready-extension-for-prototype
  9. * http://simon.incutio.com/archive/2004/05/26/addLoadEvent
  10. *
  11. * Thrown together by Jesse Skinner (http://www.thefutureoftheweb.com/)
  12. *
  13. *
  14. * To use: call addDOMLoadEvent one or more times with functions, ie:
  15. *
  16. *    function something() {
  17. *       // do something
  18. *    }
  19. *    addDOMLoadEvent(something);
  20. *
  21. *    addDOMLoadEvent(function() {
  22. *        // do other stuff
  23. *    });
  24. *
  25. */
  26.  
  27. function addDOMLoadEvent(func) {
  28.    if (!window.__load_events) {
  29.       var init = function () {
  30.           // quit if this function has already been called
  31.           if (arguments.callee.done) return;
  32.      
  33.           // flag this function so we don't do the same thing twice
  34.           arguments.callee.done = true;
  35.      
  36.           // kill the timer
  37.           if (window.__load_timer) {
  38.               clearInterval(window.__load_timer);
  39.               window.__load_timer = null;
  40.           }
  41.          
  42.           // execute each function in the stack in the order they were added
  43.           for (var i=0;i < window.__load_events.length;i++) {
  44.               window.__load_events[i]();
  45.           }
  46.           window.__load_events = null;
  47.       };
  48.   
  49.       // for Mozilla/Opera9
  50.       if (document.addEventListener) {
  51.           document.addEventListener("DOMContentLoaded", init, false);
  52.       }
  53.      
  54.       // for Internet Explorer
  55.       /*@cc_on @*/
  56.       /*@if (@_win32)
  57.           document.write("<scr"+"ipt id=__ie_onload defer src=//0><\/scr"+"ipt>");
  58.           var script = document.getElementById("__ie_onload");
  59.           script.onreadystatechange = function() {
  60.               if (this.readyState == "complete") {
  61.                   init(); // call the onload handler
  62.               }
  63.           };
  64.       /*@end @*/
  65.      
  66.       // for Safari
  67.       if (/WebKit/i.test(navigator.userAgent)) { // sniff
  68.           window.__load_timer = setInterval(function() {
  69.               if (/loaded|complete/.test(document.readyState)) {
  70.                   init(); // call the onload handler
  71.               }
  72.           }, 10);
  73.       }
  74.      
  75.       // for other browsers
  76.       window.onload = init;
  77.      
  78.       // create event function stack
  79.       window.__load_events = [];
  80.    }
  81.   
  82.    // add function to event stack
  83.    window.__load_events.push(func);
  84. }

而且他還結合了addLoadEvent函數,我在上篇文章里有一種往onload里注冊新事件的簡(jiǎn)單方法,是利用JS的特性:“函數是一等公民”,而這里是利用數組來(lái)登記所有事件,與Ajax in Action里提到的Observer模式差不多。有了這段代碼,只要使用addDOMLoadEvent(函數名),就可以反復添加事件函數,而不用擔心覆蓋原來(lái)注冊的函數。

另外,喜歡用prototype的話(huà),也可以用這個(gè)擴展。

Matthias Miller還提到了HTTS加密連接的情況。

國外BLOG上的好東西很多,我覺(jué)得想解決技術(shù)問(wèn)題,與其買(mǎi)大部頭或暢銷(xiāo)書(shū)啃,不如用好搜索引擎,多在BLOG之間跳轉幾下,多看看評論,可以學(xué)到更多東西。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
頁(yè)面加載事件
The window.onload Problem
DOMContentLoaded與load的區別
document.ready事件和document.load事件的區別
jquery $(document).ready() 與window.onload的區別
javaScript & jquery完美判斷圖片是否加載完畢
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久