这三种方式中,惰性加载js或按需加载的基本区别是什么?
<script/>
元素修改标头以注入新的.js文件。这也不会在页面加载时阻塞浏览器。<script/>
标签来控制它? - Amir Raminfar似乎使用XmlHttpRequest检索脚本,然后通过eval()
执行它。如果脚本未托管在同一协议/域名/端口上,则此方法无效。
而且3.似乎都是做同样的事情:它们创建一个<script src="the script url"></script>
元素,在其上绑定onload
事件,并将其插入到页面中。当浏览器加载脚本时,它将被执行,并触发onload
事件。
eval()
执行其内容script
元素插入到head
元素中,并在加载完成后报告回来(2)和(3)都使用了onreadystatechange
钩子,可能不兼容旧浏览器(例如Firefox 3.x及以下版本不支持)。
(1)可能是最健壮的,兼容性方面,因为它只需要XHR。但如果您以这种方式加载的代码出现错误,则浏览器的控制台可能不太有用,因为错误仅发生在“eval'd code”中,而不是在特定的文件/行中。话虽如此,懒加载通常是一种优化方法,因此您可以在调试时正常地或使用其他2种方法加载脚本。
你应该尝试一下这个叫做head.js的新库。
他们有一些有趣的想法和 API,希望能对你有所帮助。
或者你可以使用普通的 XHR 请求来获取你的脚本文件名,并使用类似于这样的方法插入到 DOM 中。我还添加了 removeScript 部分。
addScript = function(file)
{
var headID = document.getElementsByTagName("head")[0];
var newScript = document.createElement('script');
newScript.type = 'text/javascript';
newScript.src = file;
headID.appendChild(newScript);
};
removeScript = function(file)
{
var headID = document.getElementsByTagName("head")[0].children;
for(var i in headID)
if(headID[i].tagName == "SCRIPT")
if(headID[i].getAttribute('src') == file)
headID[i].parentNode.removeChild(headID[i]);
}
readyState == 'loaded'
发生在脚本执行之前,而'complete'
发生在之后。 - zzzzBov