欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2014年01月17日 15:07:25   作者:  
在多數(shù)情況下我們不需要判斷css文件是否加載成功了,但有些時(shí)間這個(gè)功能還是需要的,今天我來整理了兼容各種瀏覽器的判斷CSS文件加載完畢實(shí)現(xiàn)方法與各位分享

要判斷這個(gè) CSS 文件是否加載完畢,各個(gè)瀏覽器的做法差異比較大,這次要說IE瀏覽器做的不錯(cuò),我們可以直接通過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);
    }
  }
// 我的動(dòng)態(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的代碼的時(shí)候,我立刻想起了我看到Diego Perini的另一個(gè)解決方案:
復(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:
 *  http://www.dbjr.com.cn * 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);
  })();
}

其實(shí),如果你讀過jQuery的domready事件的判斷的代碼,原理也類似。也是通過setTimeout輪詢的方式來判斷DOM節(jié)點(diǎn)是否加載完畢。
還有,F(xiàn)ackbook則是通過在動(dòng)態(tài)創(chuàng)建的CSS樣式中包含一個(gè)固定的樣式,例如#loadcssdom,loadcssdom就是一個(gè)高度為1px樣式。然后動(dòng)態(tài)創(chuàng)建一個(gè)DOM對(duì)象,添加這個(gè)loadcssdom樣式。然后也是setTimeout輪詢loadcssdo是否已經(jīng)有1px的高度了。這個(gè)處理方式的解決方案,大家可以下《CSSP: Loading CSS with Javascript – and getting an onload callback.》
而《JavaScript Patterns》的作者Stoyan則在他的博客里,比較詳細(xì)的說明了《When is a stylesheet really loaded?》。
看完了這些,你可能會(huì)感嘆:汗,判斷CSS是否加載完畢,目前還真不是那么容易!其實(shí)我這里算是一個(gè)拋磚引玉,因?yàn)殚_發(fā)中,除了動(dòng)態(tài)加載CSS,我們還要?jiǎng)討B(tài)加載JavaScript,動(dòng)態(tài)加載HTML的操作,有空我也會(huì)寫關(guān)于動(dòng)態(tài)加載JavaScript的相關(guān)內(nèi)容,不過在那之前,我建議你看看這些:
    《ensure – Ensure JavaScripts/HTML/CSS are loaded on-demand when needed》,這個(gè)庫(kù)是專門處理動(dòng)態(tài)加載HTML,CSS,JavaScript的。就像作者介紹的那樣:
        ensure is a tiny JavaScript library that provides a handy function ensure which allows you to load JavaScript, HTML, CSS on-demand, and then execute your code. ensure www.dbjr.com.cn ensures that the relevant JavaScript and HTML snippets are already in the browser DOM before executing your code that uses them.
    《Tell CSS that JavaScript is available ASAP》
    看完這個(gè)后,你可能就不會(huì)糾結(jié):When you're styling parts of a web page that will look and work differently depending on whether JavaScript is available or not。
好了,這次就說這么多了,希望對(duì)對(duì)大家的開發(fā)和學(xué)習(xí)有幫助!

相關(guān)文章

  • 實(shí)例詳解JS中的事件循環(huán)機(jī)制

    實(shí)例詳解JS中的事件循環(huán)機(jī)制

    JavaScript是單線程的腳本語(yǔ)言,所以代碼在執(zhí)行的時(shí)候,只有一個(gè)主線程來執(zhí)行所有的任務(wù),同一個(gè)時(shí)間只能做同一件事情。本文就為大家詳細(xì)講解一下它的件循環(huán)機(jī)制,需要的可以參考一下
    2022-04-04
  • Bootstrap select多選下拉框?qū)崿F(xiàn)代碼

    Bootstrap select多選下拉框?qū)崿F(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了Bootstrap select多選下拉框?qū)崿F(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下代碼
    2016-12-12
  • 使用javascript訪問XML數(shù)據(jù)的實(shí)例

    使用javascript訪問XML數(shù)據(jù)的實(shí)例

    使用javascript訪問XML數(shù)據(jù)的實(shí)例...
    2006-12-12
  • JS使用eval()動(dòng)態(tài)創(chuàng)建變量的方法

    JS使用eval()動(dòng)態(tài)創(chuàng)建變量的方法

    這篇文章主要介紹了JS使用eval()動(dòng)態(tài)創(chuàng)建變量的方法,詳細(xì)分析了eval函數(shù)的功能及使用eval函數(shù)實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建變量的步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-06-06
  • javascript?ES6中set集合、map集合使用方法詳解與源碼實(shí)例

    javascript?ES6中set集合、map集合使用方法詳解與源碼實(shí)例

    這篇文章主要介紹了javascript?ES6中set、map使用方法詳解與源碼實(shí)例,需要的朋友可以參考下
    2022-12-12
  • 微信小程序中懸浮窗功能的實(shí)現(xiàn)代碼

    微信小程序中懸浮窗功能的實(shí)現(xiàn)代碼

    懸浮窗就是圖中微信圖標(biāo)的按鈕,采用fixed定位,可拖動(dòng)和點(diǎn)擊。本文給大家分享一個(gè)比較常見的常見,通過實(shí)例代碼給大家介紹微信小程序中懸浮窗功能的實(shí)現(xiàn),一起看看吧
    2019-08-08
  • JavaScript基礎(chǔ)之流程控制語(yǔ)句的用法

    JavaScript基礎(chǔ)之流程控制語(yǔ)句的用法

    下面就為大家?guī)硪黄狫avaScript基礎(chǔ)之流程控制語(yǔ)句的用法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • JavaScript模塊化之使用requireJS按需加載

    JavaScript模塊化之使用requireJS按需加載

    RequireJS 可以幫助用戶異步按需的加載 JavaScript 代碼,并解決 JavaScript 模塊間的依賴關(guān)系,提升了前端代碼的整體質(zhì)量和性能
    2017-04-04
  • 讓IE8瀏覽器支持function.bind()方法

    讓IE8瀏覽器支持function.bind()方法

    function.bind()方法默認(rèn)IE8是不支持的,下面有個(gè)小技巧可完美解決這個(gè)問題,為此疑惑的朋友可以看看
    2014-10-10
  • 你可能不知道的JSON.stringify()詳解

    你可能不知道的JSON.stringify()詳解

    老司機(jī)們,你知道JSON.stringify還有第二個(gè)和第三個(gè)可選參數(shù)嗎?它們是什么呢?是不是感到不可思議?下面這篇文章就來給大家介紹了一些你可能不知道的JSON.stringify的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-08-08

最新評(píng)論