Javascript 这些ajax调用会进一步延迟页面元素吗?
我使用这个伪代码来检索一些json文件,并将其内容放入content divJavascript 这些ajax调用会进一步延迟页面元素吗?,javascript,jquery,Javascript,Jquery,我使用这个伪代码来检索一些json文件,并将其内容放入content div <html> <head> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> <title>Test</title> </head> <body>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<title>Test</title>
</head>
<body>
<div id="content"></div>
<script type="text/javascript" charset="utf-8">
var my_files = ['http://example.com/file.json', 'http://example.com/file2.json'];
var params = {
format: 'json'
};
function _populate_content(arg){jQuery("#content").text(arg)}
jQuery(my_files.each(function() {
jQuery.ajax({
url: url,
dataType: 'jsonp',
data: params,
jsonpCallback: "_populate_content",
});
});
</script>
<div id="more_content"></div>
</body>
</html>
试验
var my_files=['http://example.com/file.json', 'http://example.com/file2.json'];
变量参数={
格式:“json”
};
函数_populate_content(arg){jQuery(#content”).text(arg)}
jQuery(my_files.each(function()){
jQuery.ajax({
url:url,
数据类型:“jsonp”,
数据:params,
jsonpCallback:“\u填充\u内容”,
});
});
检索远程文件可能需要一些时间。我的问题是:这段代码会延迟加载和呈现“更多内容”-div吗
是否最好将ajax检索包含在$(document).ready()块中?是。在进行这些调用时,浏览器将进行阻止。您应该在页面加载时执行此操作,以便在执行此操作时,页面可见/呈现:
$(document).ready(function() {
jQuery(my_files.each(function() {
// etc...
}));
});
简短回答:否。由于您没有在.ajax()参数中定义'async:false',javascript将异步执行。这意味着您的my_files数组将循环并触发异步调用,然后继续加载页面
您可能希望将您的逻辑包装在$(document).ready()中,但在此之前,请在您的more_content div中放置一个按钮,让用户知道信息即将到来。ajax调用是异步的(除非您另有指定)。因此不会延迟页面加载 此代码是否会延迟“更多内容”-div的加载和呈现 否,因为Ajax调用是异步的(非阻塞) 将ajax检索封装在
$(document.ready()
块中是否更好
是的。这将在呈现整个DOM后执行Ajax调用。虽然它可以不使用,但当Ajax调用返回时,您不能100%确定ID为
content
的元素可用。正如@BiAiB所指出的,该元素将可用。不过这仍然是一个很好的实践
顺便说一句,如果你想让你的代码在所有浏览器中都能工作,你应该使用jQuery的
每种浏览器,而不是内置的:
jQuery.each(my_files, function() {
jQuery.ajax({
url: url,
dataType: 'jsonp',
data: params,
jsonpCallback: "_populate_content",
});
});
也许这只是一个简单的示例,但是加载两个URL有意义吗?第二个调用将覆盖第一个调用的结果…ajax调用是异步的,因此没有延迟。
如果将其放入文档就绪块中,
您可以证明,在执行调用之前,浏览器确实呈现了整个页面。如.ajax()所示除非设置了async:false,否则调用不会被阻止。啊,对了,谢谢你的澄清。这与我的理解完全相反。干杯!事实上,#content节点出现在脚本之前,所以在他的情况下是可以的,但最好还是使用$(document).ready(),以防前面的条件不满足。