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

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

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

    我是FE,也是Fe

    前端來源于不斷的點滴積累。我一直在努力。

    統計

    留言簿(15)

    閱讀排行榜

    評論排行榜

    如何判斷link標簽css文件加載完畢

    動態加載css都是通過DOM操作新增一個link標簽來實現,常見的代碼如下:
        var node = document.createElement("link");
        node.setAttribute(
    "rel","stylesheet");
        node.setAttribute(
    "type","text/css");
        node.setAttribute(
    "href","xx.css");
        document.body.appendChild(node);

    但是要判斷這個css文件是否加載完畢,各個瀏覽器的做法差異比較大,今天在讀seajs 源代碼時想到里面應該能找到我想要的代碼,下面是改編自seajs中的源碼:
        <script type="text/javascript">
    function styleOnload(node, callback) {
        
    // for IE6-9 and Opera
        if (node.attachEvent) {
          node.attachEvent('onload', callback);
          
    // NOTICE:
          // 1. "onload" will be fired in IE6-9 when the file is 404, but in
          // this situation, Opera does nothing, so fallback to timeout.
          // 2. "onerror" doesn't fire in any browsers!
        }
        
    // polling for Firefox, Chrome, Safari
        else {
          setTimeout(
    function() {
            poll(node, callback);
          }, 
    0); // for cache
        }
      }

      
    function poll(node, callback) {
        
    if (callback.isCalled) {
          
    return;
        }

        
    var isLoaded = false;

        
    if (/webkit/i.test(navigator.userAgent)) {//webkit
          if (node['sheet']) {
            isLoaded 
    = true;
          }
        }
        
    // for Firefox
        else if (node['sheet']) {
          
    try {
            
    if (node['sheet'].cssRules) {
              isLoaded 
    = true;
            }
          } 
    catch (ex) {
            
    // NS_ERROR_DOM_SECURITY_ERR
            if (ex.code === 1000) {
              isLoaded 
    = true;
            }
          }
        }

        
    if (isLoaded) {
          
    // give time to render.
          setTimeout(function() {
            callback();
          }, 
    1);
        }
        
    else {
          setTimeout(
    function() {
            poll(node, callback);
          }, 
    1);
        }
      }


      
    function loadcss(){
        
    var node = document.createElement("link");
        node.setAttribute(
    "rel","stylesheet");
        node.setAttribute(
    "type","text/css");
        node.setAttribute(
    "href","xx.css");
        document.body.appendChild(node);
        styleOnload(node,
    function(){
            alert(
    "loaded");
        });

      }
        
    </script>

    單靠onload事件是不解決問題的。FF,webkit可以通過node.sheet.cssRules屬性是否存在來判斷是否加載完畢,IE6-9以及opera可以利用onload。其他瀏覽器需要通過定時任務來判斷是否加載完畢。

    照著這個思路,推薦大家去讀讀jQuery源碼,domready事件的判斷,原理也類似,每個瀏覽器的處理細節不一樣。

    seajs源碼:http://modules.seajs.com/seajs/1.0.1/sea-debug.js

    (完)





    posted on 2011-10-08 11:44 衡鋒 閱讀(2009) 評論(5)  編輯  收藏 所屬分類: Web開發

    評論

    # re: 如何判斷link標簽css文件加載完畢 2012-01-31 10:25 黑夢

    node.sheet.cssRules
    測試不成功 FF 下無論如何 不行
    谷歌下無論如何 行

    這個是不行  回復  更多評論   

    # re: 如何判斷link標簽css文件加載完畢 2012-01-31 10:35 黑夢

    @黑夢

    onerror 事件在谷歌中有響應。。。。  回復  更多評論   

    # re: 如何判斷link標簽css文件加載完畢 2012-01-31 11:15 黑夢

    查了一些資料 看來上面的代碼還是靠譜的
    就是瀏覽器本身對這塊的支持有問題。。。
    跨域 在瀏覽器的安全方案上是最大的麻煩了
    404 確實應該是在開發時就搞定的
      回復  更多評論   

    # re: 如何判斷link標簽css文件加載完畢 2012-02-06 18:57 衡鋒

    @黑夢
    我試了一下,FF也可以。  回復  更多評論   

    # re: 如何判斷link標簽css文件加載完畢 2012-04-16 11:33 tb

    恩 不錯的   回復  更多評論   

    主站蜘蛛池模板: 777成影片免费观看| 狼群影院在线观看免费观看直播| 最新中文字幕电影免费观看| 亚洲最大在线观看| av无码免费一区二区三区| 亚洲成人中文字幕| 久久99国产综合精品免费| 91亚洲国产在人线播放午夜 | 国内一级一级毛片a免费| 24小时在线免费视频| 色se01短视频永久免费| 四虎永久免费网站免费观看| 亚洲欧美日韩中文二区| 国产一区二区三区免费视频| 久久无码av亚洲精品色午夜| 一级毛片直播亚洲| a级片免费在线播放| 亚洲福利电影在线观看| 最新中文字幕免费视频| 白白色免费在线视频| 国产亚洲精品福利在线无卡一| 在线涩涩免费观看国产精品 | 美女被羞羞网站免费下载| 亚洲精品成人区在线观看| av永久免费网站在线观看| 亚洲色图黄色小说| 最近2019中文免费字幕| 黄色a级免费网站| 亚洲av日韩av无码黑人| 成年女人喷潮毛片免费播放| 国产精品亚洲专区无码不卡| 亚洲人JIZZ日本人| 最近的免费中文字幕视频| 精品国产日韩亚洲一区在线| 亚洲区小说区图片区QVOD| 人禽杂交18禁网站免费| 日韩精品无码永久免费网站| 亚洲尹人九九大色香蕉网站| 日本免费网站观看| 亚洲视频在线观看免费| 亚洲色大成网站www久久九|