1

我编写了一个 CSS 和 Javascript 惰性加载器来为单独的 pagelet 动态加载资源(就像 Facebook 使用 BigPipe 技术呈现页面的方式一样)。

简而言之,首先呈现 HTML 框架,然后页面的各个部分都由服务器异步生成。当每个 pagelet 到达时,首先加载 pagelet css,然后设置其 innerHTML,最后我们为此 pagelet 加载任何所需的 javascript 并对其进行初始化。

一切都完美无缺,任何给定页面的感知加载时间几乎都是瞬时的。

但是在 IE 中,我偶尔会Method does not support method or property在初始化脚本时得到。

我通过在加载脚本之前检查 document.readyState 解决了这个问题。

现在这不是一个大问题,但它平均为 chrome 或 firefox 中的页面加载增加了 170 毫秒。这是不需要的。

  function loadScripts(init){

        // ensure document readystate is complete before loading scripts
        if( doc.readyState !== 'complete'){
            setTimeout(function(){
                loadScripts(init);
            }, 1 );
        }
        else{
            complete++;
            if(complete == instance.length){            
                var scripts = checkJS(javascript);
                if(scripts.length) {
                    LazyLoad.js(scripts, function(){                    
                        runPageletScript();
                        for (var i = 0; i < scripts.length; ++i) {
                            TC.loadedJS.push(scripts[i]);
                        }
                    });
                }
                else{
                    runPageletScript();
                }
            }
        }

    }

我正在寻找的是对这个脚本的修改,它只会在 IE 中实现“等待”,如果它是任何其他浏览器,它会立即触发。我不能使用像 jQuery 一样的实用程序,$.Browser并且需要它成为最小的可能方法。我讨厌使用任何形式的浏览器检测,但它似乎是我唯一的解决方案。也就是说,如果有人能想出另一种方法,那就太棒了。

任何建议将不胜感激。

4

2 回答 2

2

您可以使用JScript 条件编译,它仅在 IE 浏览器中可用(最高 IE10)。

因为它是一个注释,所以最好将它放在里面new Function,因为缩小器可能会删除它,从而改变你的代码。尽管通常您应该避免使用new Function,但在这种情况下,实际上没有任何其他方法可以防止缩小器将其删除。

例子:

var isIE = !(new Function('return 1//@cc_on &0')());

但是,您的主要问题似乎是 DOM 尚未加载——确保在使用DOMContentLoaded事件(IE9+)运行任何加载器之前已加载它:

document.addEventListener('DOMContentLoaded', function () {
    // perform logic here
});
于 2013-05-14T10:58:51.667 回答
2

这只是另一种解决方案,因为澳洲航空的解决方案可能并不总是有效。例如,在 UMTS 连接上,提供商可能会删除评论以节省带宽(也许他们会保留条件评论):

if(navigator.appName == 'Microsoft Internet Explorer' 
   &&  doc.readyState !== 'complete'){
  ...
}
于 2013-05-14T11:19:15.467 回答