我是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 衡鋒 閱讀(2011) 評論(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

          恩 不錯的   回復  更多評論   

          主站蜘蛛池模板: 乌拉特后旗| 平陆县| 视频| 新郑市| 和顺县| 惠州市| 定陶县| 新昌县| 积石山| 景谷| 长汀县| 鹿泉市| 长寿区| 汤原县| 涡阳县| 海南省| 葫芦岛市| 丽江市| 聂荣县| 沿河| 浪卡子县| 攀枝花市| 达孜县| 隆子县| 祥云县| 天柱县| 咸丰县| 邛崃市| 封开县| 丽水市| 琼中| 武隆县| 安吉县| 洞口县| 土默特左旗| 池州市| 开江县| 南皮县| 荥经县| 萨迦县| 扎鲁特旗|