我有一个用户界面(让我们称之为第1页),其中包含大量HTML和JavaScript。当点击第1页上的某些元素时,会打开一个jQuery UI对话框并加载一个部分页面(让我们称之为第2页):
$("#myDialog").dialog({ modal: true /* Other options */ });
$('#myDialog').load('page2Link', { }, function () { });
$('#myDialog').dialog('open');
然后还有一堆HTML和JavaScript。简化示例:
<script src="Scripts/page2Stuff.js" type="text/javascript"></script>
<div id="page2Body">
<!-- More elements -->
</div>
我在page2Stuff.js
里面有JS,需要等到第2页完全呈现。我可以在这个部分页面中使用什么来查看是否已将新HTML添加到DOM中?我尝试过以下方法:
$('#myDialog').load('page2Link', { }, page2ReadyFunction);
找不到page2ReadyFunction
。我假设因为.load
在page2Stuff.js
中运行JavaScript然后丢弃它或什么?
我能够让它工作的方式现在使用setTimeout
并不断检查$('#page2Body')
是否会返回任何内容,但这似乎并不理想。
答案 0 :(得分:2)
不要在第二页的开头添加script
标记,而是在所有HTML之后将其放在最后,如下所示:
<div id="page2Body">
<!-- More elements -->
</div>
<script src="Scripts/page2Stuff.js" type="text/javascript"></script>
由于代码将根据源顺序执行,因此您可以放心,在脚本运行时HTML就会就绪。
答案 1 :(得分:1)
当您运行load
函数时,预计在该确切时间存在page2ReadyFunction
。它不是因为你没有加载脚本。以下将解决该问题,但不应该工作,因为脚本将异步加载:
$('#myDialog').load('page2Link', { }, function() {page2ReadyFunction();});
要解决这个问题,你可以这样做:
$('#myDialog').load('page2Link', { }, function() {
function tryPageLoad() {
if(page2ReadyFunction)
page2ReadyFunction();
else
setTimeout(tryPageLoad, 100);
}
tryPageLoad();
});
此函数每隔100ms尝试查看page2ReadyFunction
是否存在,并在此时调用它。
当然,您不必担心这一点,因为子脚本标记将异步加载,并且渲染应该在JavaScript执行之前发生。您可以使用console.log
来验证这一点,以查看首先触发的内容,客户端脚本中的JavaScript或回调函数。
答案 2 :(得分:1)
来自jQuery文档的加载回调函数:http://api.jquery.com/load/
complete(responseText,textStatus,XMLHttpRequest)一个回调函数 在请求完成时执行。
此功能在请求完成时执行,但您需要等到呈现第2页。
一个简单的解决方案是将$(document).ready()块放入page2提取的javascript文件中。
答案 3 :(得分:0)
请在完成ajax加载后加载
你必须使用
完全像这样的ajax函数
var req= $.ajax({
url:'page2Link',
type:"post",
data:{ajax:1,field_id:field_ids,whatever:whatever}
});
//after loading
req.complete(function(res){
$('#myDialog').html(res);
});
//after complete loading and request end
req.always(function(res){
page2ReadyFunction
});
所有这些而不是
$('#myDialog').load('page2Link', { }, function () { });
答案 4 :(得分:0)
像这样服务:
<script src="Scripts/page2Stuff.js" type="text/javascript"></script>
<div id="page2Body">
<!-- More elements -->
</div>
<script>
$(function() {
// call your function from page2Stuff.js here
});
</script>
答案 5 :(得分:0)
<body onload="function2kickOffP2()">
这将在第2页的主体上进行。