我是FE,也是Fe

          前端來源于不斷的點(diǎn)滴積累。我一直在努力。

          統(tǒng)計(jì)

          留言簿(15)

          閱讀排行榜

          評(píng)論排行榜

          如何判斷l(xiāng)ink標(biāo)簽css文件加載完畢

          動(dòng)態(tài)加載css都是通過DOM操作新增一個(gè)link標(biāo)簽來實(shí)現(xiàn),常見的代碼如下:
              var node = document.createElement("link");
              node.setAttribute(
          "rel","stylesheet");
              node.setAttribute(
          "type","text/css");
              node.setAttribute(
          "href","xx.css");
              document.body.appendChild(node);

          但是要判斷這個(gè)css文件是否加載完畢,各個(gè)瀏覽器的做法差異比較大,今天在讀seajs 源代碼時(shí)想到里面應(yīng)該能找到我想要的代碼,下面是改編自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。其他瀏覽器需要通過定時(shí)任務(wù)來判斷是否加載完畢。

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

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

          (完)





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

          評(píng)論

          # re: 如何判斷l(xiāng)ink標(biāo)簽css文件加載完畢 2012-01-31 10:25 黑夢(mèng)

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

          這個(gè)是不行  回復(fù)  更多評(píng)論   

          # re: 如何判斷l(xiāng)ink標(biāo)簽css文件加載完畢 2012-01-31 10:35 黑夢(mèng)

          @黑夢(mèng)

          onerror 事件在谷歌中有響應(yīng)。。。。  回復(fù)  更多評(píng)論   

          # re: 如何判斷l(xiāng)ink標(biāo)簽css文件加載完畢 2012-01-31 11:15 黑夢(mèng)

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

          # re: 如何判斷l(xiāng)ink標(biāo)簽css文件加載完畢 2012-02-06 18:57 衡鋒

          @黑夢(mèng)
          我試了一下,FF也可以。  回復(fù)  更多評(píng)論   

          # re: 如何判斷l(xiāng)ink標(biāo)簽css文件加載完畢 2012-04-16 11:33 tb

          恩 不錯(cuò)的   回復(fù)  更多評(píng)論   

          主站蜘蛛池模板: 淮滨县| 漾濞| 太和县| 射洪县| 南昌县| 巴楚县| 西城区| 长春市| 陵川县| 土默特右旗| 许昌市| 蒙城县| 景谷| 日喀则市| 岑巩县| 来凤县| 三河市| 南雄市| 张家港市| 沙河市| 新安县| 镇沅| 光泽县| 汉寿县| 南华县| 延寿县| 天全县| 泾川县| 昌黎县| 平谷区| 滦南县| 阳原县| 达日县| 土默特右旗| 铜鼓县| 乌拉特后旗| 长海县| 富锦市| 固原市| 开封市| 睢宁县|