link element onload

前端 未结 11 795
予麋鹿
予麋鹿 2020-11-30 03:31

Is there anyway to listen to the onload event for a element?

F.ex:

var link = document.createElement(\'link\');
link.rel =          


        
相关标签:
11条回答
  • 2020-11-30 04:22

    Today, all modern browsers support the onload event on link tags. So I would guard hacks, such as creating an img element and setting the onerror:

    if !('onload' in document.createElement('link')) {
      imgTag = document.createElement(img);
      imgTag.onerror = function() {};
      imgTag.src = ...;
    } 
    

    This should provide a workaround for FF-8 and earlier and old Safari & Chrome versions.

    minor update:

    As Michael pointed out, there are some browser exceptions for which we always want to apply the hack. In Coffeescript:

    isSafari5: ->
      !!navigator.userAgent.match(' Safari/') &&
          !navigator.userAgent.match(' Chrom') &&
          !!navigator.userAgent.match(' Version/5.')
    
    # Webkit: 535.23 and above supports onload on link tags.
    isWebkitNoOnloadSupport: ->
      [supportedMajor, supportedMinor] = [535, 23]
      if (match = navigator.userAgent.match(/\ AppleWebKit\/(\d+)\.(\d+)/))
        match.shift()
        [major, minor] = [+match[0], +match[1]]
        major < supportedMajor || major == supportedMajor && minor < supportedMinor
    
    0 讨论(0)
  • 2020-11-30 04:24

    This trick is borrowed from the xLazyLoader jQuery plugin:

    var count = 0;
    
    (function(){
      try {
        link.sheet.cssRules;
      } catch (e) {
        if(count++ < 100)
          cssTimeout = setTimeout(arguments.callee, 20);
        else
          console.log('load failed (FF)');
        return;
      };
      if(link.sheet.cssRules && link.sheet.cssRules.length == 0) // fail in chrome?
        console.log('load failed (Webkit)');
      else
        console.log('loaded');
    })();
    

    Tested and working locally in FF (3.6.3) and Chrome (linux - 6.0.408.1 dev)

    Demo here (note that this won't work for cross-site css loading, as is done in the demo, under FF)

    0 讨论(0)
  • 2020-11-30 04:24

    You either need a specific element which style you know, or if you control the CSS file, you can insert a dummy element for this purpose. This code will exactly make your callback run when the css file's content is applied to the DOM.

    // dummy element in the html
    <div id="cssloaded"></div>
    
    // dummy element in the css
    #cssloaded { height:1px; }
    
    // event handler function
    function cssOnload(id, callback) {
      setTimeout(function listener(){
        var el = document.getElementById(id),
            comp = el.currentStyle || getComputedStyle(el, null);
        if ( comp.height === "1px" )
          callback();
        else
          setTimeout(listener, 50);
      }, 50)
    }
    
    // attach an onload handler
    cssOnload("cssloaded", function(){ 
      alert("ok"); 
    });
    

    If you use this code in the bottom of the document, you can move the el and comp variables outside of the timer in order to get the element once. But if you want to attach the handler somewhere up in the document (like the head), you should leave the code as is.

    Note: tested on FF 3+, IE 5.5+, Chrome

    0 讨论(0)
  • 2020-11-30 04:26

    This is kind of a hack, but if you can edit the CSS, you could add a special style (with no visible effect) that you can listen for using the technique in this post: http://www.west-wind.com/weblog/posts/478985.aspx

    You would need an element in the page that has a class or an id that the CSS will affect. When your code detects that its style has changed, the CSS has been loaded.

    A hack, as I said :)

    0 讨论(0)
  • 2020-11-30 04:27

    The way I did it on Chrome (not tested on other browsers) is to load the CSS using an Image object and catching its onerror event. The thing is that browser does not know is this resource an image or not, so it will try fetching it anyway. However, since it is not an actual image it will trigger onerror handlers.

    var css = new Image();
    css.onerror = function() {
        // method body
    }
    // Set the url of the CSS. In link case, link.href
    // This will make the browser try to fetch the resource.
    css.src = url_of_the_css;
    

    Note that if the resource has already been fetched, this fetch request will hit the cache.

    0 讨论(0)
提交回复
热议问题