国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

Js判斷CSS文件加載完畢的具體實現(xiàn)

2019-11-20 21:14:04
字體:
供稿:網(wǎng)友

要判斷這個 CSS 文件是否加載完畢,各個瀏覽器的做法差異比較大,這次要說IE瀏覽器做的不錯,我們可以直接通過onload方法來處理CSS加載完成以后的處理:

復(fù)制代碼 代碼如下:

// 代碼節(jié)選至seajs
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!
    }
}

很遺憾,這次在其他的瀏覽器中,想判斷CSS是否加載完成就不是那么方便了,F(xiàn)F,webkit可以通過node.sheet.cssRules屬性是否存在來判斷是否加載完畢。而且需要使用setTimeout間隔事件輪詢:

復(fù)制代碼 代碼如下:

// 代碼節(jié)選至seajs
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);
    }
  }

setTimeout(function() {
     poll(node, callback);
}, 0);

SeaJS給出的完整的處理是這樣的:

復(fù)制代碼 代碼如下:

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);
    }
  }
// 我的動態(tài)創(chuàng)建LINK函數(shù)
function createLink(cssURL,lnkId,charset,media){
    var head = document.getElementsByTagName('head')[0],
        linkTag = null;

 if(!cssURL){
     return false;
 }

    linkTag = document.createElement('link');
 linkTag.setAttribute('id',(lnkId || 'dynamic-style'));
 linkTag.setAttribute('rel','stylesheet');
 linkTag.setAttribute('charset',(charset || 'utf-8'));
 linkTag.setAttribute('media',(media||'all'));
 linkTag.setAttribute('type','text/css');
    linkTag.href = cssURL;

    head.appendChild(linkTag);
}
function loadcss(){
    var styleNode = createLink('/wp-content/themes/BlueNight/style.css');

    styleOnload(styleNode,function(){
        alert("loaded");
    });
}

在看到seajs的代碼的時候,我立刻想起了我看到Diego Perini的另一個解決方案:
復(fù)制代碼 代碼如下:

/*
 * Copyright (C) 2010 Diego Perini
 * All rights reserved.
 *
 * cssready.js - CSS loaded/ready state notification
 *
 * Author: Diego Perini <diego.perini at gmail com>
 * Version: 0.1
 * Created: 20100616
 * Release: 20101104
 *
 * License:
 *  //m.survivalescaperooms.com * Download:
 *  http://javascript.nwbox.com/cssready/cssready.js
 */
function cssReady(fn, link) {
  var d = document,
  t = d.createStyleSheet,
  r = t ? 'rules' : 'cssRules',
  s = t ? 'styleSheet' : 'sheet',
  l = d.getElementsByTagName('link');
  // passed link or last link node
  link || (link = l[l.length - 1]);
  function check() {
    try {
      return link && link[s] && link[s][r] && link[s][r][0];
    } catch(e) {
      return false;
    }
  }
  (function poll() {
    check() && setTimeout(fn, 0) || setTimeout(poll, 100);
  })();
}

其實,如果你讀過jQuery的domready事件的判斷的代碼,原理也類似。也是通過setTimeout輪詢的方式來判斷DOM節(jié)點是否加載完畢。
還有,F(xiàn)ackbook則是通過在動態(tài)創(chuàng)建的CSS樣式中包含一個固定的樣式,例如#loadcssdom,loadcssdom就是一個高度為1px樣式。然后動態(tài)創(chuàng)建一個DOM對象,添加這個loadcssdom樣式。然后也是setTimeout輪詢loadcssdo是否已經(jīng)有1px的高度了。這個處理方式的解決方案,大家可以下《CSSP: Loading CSS with Javascript

主站蜘蛛池模板: 太保市| 忻城县| 固原市| 井冈山市| 英超| 黑河市| 姚安县| 泸溪县| 灌南县| 尚义县| 马边| 东海县| 马边| 岗巴县| 白玉县| 云浮市| 冷水江市| 沾化县| 永兴县| 石城县| 龙海市| 三河市| 南部县| 攀枝花市| 汉川市| 高青县| 大荔县| 当涂县| 靖边县| 方山县| 华宁县| 繁峙县| 康乐县| 乌恰县| 礼泉县| 宜宾县| 时尚| 元朗区| 乐山市| 抚顺县| 县级市|