【发布时间】:2017-03-02 15:18:04
【问题描述】:
我正在构建一个模块,该模块将通过 ajax 调用在网站上显示横幅。代码有两个主要部分:
banner.js 异步插入到头部。此 javascript 进行 ajax 调用并将从 ajax 调用检索到的横幅插入页面占位符。
网站管理员可以将每个横幅占位符插入到页面的任何部分,如下所示:
<div id="banner1"></div>
网站管理员最多可以在管理员中定义 5 个横幅并插入相同数量的占位符。问题是因为banner.js 中定义的ajax 调用可以在加载其余html 和占位符之前返回横幅。我可以在结束</body> 标记之前加载banners.js,但这不是最佳解决方案,因为某些元素会延迟DOM 解析并且横幅不会加载得那么快。
到目前为止,我找到的唯一解决方案是:
var bannerScriptListener1 = setInterval(function(){
if(jQuery("#banner1").length>0){
clearInterval(bannerScriptListener1)
jQuery("#banner1").html(banners[1].html)
}
},10)
var bannerScriptListener2 = setInterval(function(){
if(jQuery("#banner2").length>0){
clearInterval(bannerScriptListener2)
jQuery("#banner1").html(banners[2].html)
}
},10)
//same for banner 3,4,5
该解决方案有多糟糕?我使用谷歌任务管理器工具对其进行了测试,客户端内存消耗没有太大差异。但我可能会遗漏一些东西。有没有更好的解决办法?
编辑: 我给出了整个 html 示例来显示问题。我无法控制其他元素,我唯一的控制是控制banner.js,在banners.js 中通过ajax 调用调用的php 文件,我可以知道网站管理员可以在哪里插入div 占位符。 banner.js 可以插入头部,但我无法控制优先顺序。这只是一个非常简单的例子,实际上像 Magento 这样的平台有更多的文件和脚本,不同的模块可能会造成混乱。
<html>
<head>
<script type="text/javascript" src="banners.js"></script>
<script type="text/javascript" src="othermodulescript1.js"></script>
<script type="text/javascript" src="othermodulescript2.js"></script>
</head>
<body>
<div id="banner1"></div>
<!--Some more elements-->
<div>lorem ipsum</div>
<div>lorem ipsum</div>
<!--Example of script from another module that sometimes takes 3 seconds to load
I don't have control over this-->
<script type="text/javascript" src="http://www.example.com/externalscript.js"></script>
<!--Some more elements-->
<div id="banner2"></div>
</body>
</html>
【问题讨论】:
-
使用 JQuery 函数将 ajaxed 横幅的插入推迟到 document.ready 事件。又名
$(function() { ... do stuff that has to wait for doc ready here ... }): -
既然你已经在用jQuery了,那经典的
$( document ).ready(function() {})不就解决了这个问题吗? -
香草版是
document.addEventListener("DOMContentLoaded", function(event) { ... });或者将banner ajaxing脚本移到body底部。 -
既然你可以控制你运行/加载哪些脚本以及在哪个roder中,为什么不总是在你执行可以阻止DOM的外部脚本之前强制标题先呈现呢?所有 DOM 阻塞都应尽可能延迟,以便您获得良好的渲染时间。加载 html/css -> 加载横幅 -> 渲染横幅 -> 加载所有其他脚本。
标签: javascript jquery html setinterval