link element onload

前端 未结 11 832
予麋鹿
予麋鹿 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:21

    E.g. Android browser doesn't support "onload" / "onreadystatechange" events for element: http://pieisgood.org/test/script-link-events/
    But it returns:

    "onload" in link === true
    

    So, my solution is to detect Android browser from userAgent and then wait for some special css rule in your stylesheet (e.g., reset for "body" margins).
    If it's not Android browser and it supports "onload" event- we will use it:

    var userAgent = navigator.userAgent,
        iChromeBrowser = /CriOS|Chrome/.test(userAgent),
        isAndroidBrowser = /Mozilla\/5.0/.test(userAgent) && /Android/.test(userAgent) && /AppleWebKit/.test(userAgent) && !iChromeBrowser; 
    
    addCssLink('PATH/NAME.css', function(){
        console.log('css is loaded');
    });
    
    function addCssLink(href, onload) {
        var css = document.createElement("link");
        css.setAttribute("rel", "stylesheet");
        css.setAttribute("type", "text/css");
        css.setAttribute("href", href);
        document.head.appendChild(css);
        if (onload) {
            if (isAndroidBrowser || !("onload" in css)) {
                waitForCss({
                    success: onload
                });
            } else {
                css.onload = onload;
            }
        }
    }
    
    // We will check for css reset for "body" element- if success-> than css is loaded
    function waitForCss(params) {
        var maxWaitTime = 1000,
            stepTime = 50,
            alreadyWaitedTime = 0;
    
        function nextStep() {
            var startTime = +new Date(),
                endTime;
    
            setTimeout(function () {
                endTime = +new Date();
                alreadyWaitedTime += (endTime - startTime);
                if (alreadyWaitedTime >= maxWaitTime) {
                    params.fail && params.fail();
                } else {
                    // check for style- if no- revoke timer
                    if (window.getComputedStyle(document.body).marginTop === '0px') {
                        params.success();
                    } else {
                        nextStep();
                    }
                }
            }, stepTime);
        }
    
        nextStep();
    }
    

    Demo: http://codepen.io/malyw/pen/AuCtH

提交回复
热议问题