<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

    恩 不錯的   回復  更多評論   

    主站蜘蛛池模板: 最近高清中文字幕无吗免费看| 午夜影视在线免费观看| 亚洲av永久无码嘿嘿嘿 | 97在线观免费视频观看| 亚洲熟妇自偷自拍另欧美| 亚洲国产精品激情在线观看| 人妻无码一区二区三区免费| 亚洲性无码AV中文字幕| 亚洲自偷自偷偷色无码中文| 国产精品永久免费10000| 日韩大片在线永久免费观看网站| 亚洲欧洲日韩不卡| 国产乱子伦精品免费女| 精品一区二区三区免费毛片爱 | 羞羞网站免费观看| 亚洲欧洲国产精品你懂的| 国产免费久久精品| 亚洲免费在线视频播放| 四虎影视久久久免费观看| 91亚洲性爱在线视频| 亚洲中文字幕无码爆乳av中文| 国产乱子精品免费视观看片| 国产精品偷伦视频免费观看了 | 久久99免费视频| 亚洲av日韩综合一区二区三区| 久久夜色精品国产嚕嚕亚洲av| 国产免费午夜a无码v视频| 97免费人妻在线视频| 国产免费MV大全视频网站| 亚洲色偷偷色噜噜狠狠99| 亚洲欧洲国产精品你懂的| 亚洲中久无码永久在线观看同| 成人免费视频软件网站| 91成人在线免费视频| baoyu122.永久免费视频| 18禁亚洲深夜福利人口| 精品亚洲成A人无码成A在线观看| 亚洲va中文字幕无码久久不卡| 免费在线观看污网站| 日韩在线看片免费人成视频播放| 亚洲精品视频在线观看免费|