Magento自带六个以上的JavaScript库,这会使加载时间更加缓慢。有人能够成功地使用脚本加载器(如head.js或labjs)与Magento一起异步加载吗?我一直在尝试,但无法使其正常工作。看起来似乎页面上的内联脚本会在库加载之前触发。我知道head.js有一个像head.ready这样的函数来告诉脚本执行,但是由于整个站点中内联脚本太多了,将其添加到每个出现的位置并不实际。
core_block_abstract_to_html_after
或controller_action_layout_render_before
事件,这些事件在输出呈现的HTML之前立即触发。在您的观察者中,您可以使用preg_replace
在每个<script>
标记后立即插入一个head.ready
语句。我使用jQuery实现这个功能,并且效果很好。
您需要做的是发出一个ajax请求来获取脚本,然后使用eval
评估该脚本。您可以编写自己的函数实现此功能,但是jQuery已经提供了一些不错的方法。
对于单个脚本,$.getScript
函数非常适用。它基本上是$.ajax
函数的扩展,指定您正在请求一个脚本。语法如下:
$.getScript('my_script_url',function(){
// do whatever needs to be done after the script loads
alert('my script was asynchroniously loaded');
});
$.when(
$.getScript("/script_1.js"),
$.getScript("/script_2.js"),
$.getScript("/script_3.js")
// ...
//$.getScript("/script_n.js")
).then(
// on succes
function(){
alert('good to go!');
},
// on failure
function(){
alert('loading failed. one or more scripts encountered a problem :(');
}
);
所有这类加载器都需要对站点上的每个脚本进行一些修改。我知道——我刚在一个系统上实现了LABjs,当我使用grep命令搜索时,显示出有超过400个文件带有某种脚本标记!!