我正在用法语做一个类似Reddit的网站,并且要完全优化我获取结果,缓存它,然后通过jQuery查询每个链接,看看它们是否被downvoted / upvoted。
您如何看待优化查询?
为什么不起作用!这是我的代码。
HTML:
<div class="box ajax_div" title="3">
<div class="score">
<a href="#" class="upvote_position" title="post-up-3"><img src="images/up.png" /></a>
<div class="score_position">1</div>
<a href="#" class="downvote_position" title="post-down-3"><img src="images/down.png" /></a>
</div>
<div class="box_info">
<div class="link">
<a href="#" class="text-show"><a href="?show=3" rel="nofollow" class="out">ouioui</a>
</div>
<div class="further">
<span class="date" title="2012-04-25 04:57:05">il y a 13 heures</span> | posté par <a href="?user=david">david</a> dans <a href="?chan=100hp.fr">100hp.fr</a>
</div>
<div class="further_more">
<a href="?show=3"><img src="images/comment.png" />2 commentaires</a> <a href="#" class="save" title="3"><img src="images/save.png" />sauvegarder le lien</a> <a href="#" class="spam" title="3"><img src="images/report.png" />spam?</a>
</div>
</div>
<div class="textbox" style="display:none;">razraz</div>
</div>
JavaScript:
$(".box").each(function(index){
ele = $('.box').eq(index);
$.get("ajax/score.php",
{ idbox: ele.attr('title'), type: "post" },
function(data) {
ele.find(".score_position").html(data);
});
});
我有多个这样的盒子,它只影响最后一个盒子。我首先尝试没有索引和eq(索引),它也做同样的事情。
答案 0 :(得分:6)
您覆盖ele
全局变量,请尝试添加var
:
$(".box").each(function(index){
var ele = $('.box').eq(index);
$.get("ajax/score.php",
{ idbox: ele.attr('title'), type: "post" },
function(data) {
ele.find(".score_position").html(data);
});
});
这样做的另一个改进是使用正在执行.each()
的回调的上下文。这将使您的脚本加速一点,因为选择器不需要再次评估,只需将DOM元素(this
)括在jQuery
对象中:
$(".box").each(function(index){
var ele = $(this);
$.get("ajax/score.php",
{ idbox: ele.attr('title'), type: "post" },
function(data) {
ele.find(".score_position").html(data);
});
});
答案 1 :(得分:2)
.get
请求是异步的,这意味着它一旦被调用就不会阻止代码执行。
实际上,ele
不是您最终调用.get
回调时所认为的元素(它可能是.box
的最后一个元素)。
为了解决这个问题,尝试在没有每次迭代循环时更改的变量的情况下定位元素。
答案 2 :(得分:1)
jquery的每个函数在“each”
中提供两个参数$('...')。each(function(index,value){...});
只需使用第二个参数。
答案 3 :(得分:0)
我有同样的问题。 @Blender给了我最初的想法:谢谢。
我的解决方案是使用:
$.ajax({
url: "myExample.html",
context: this //"this" refer to the outer-context "this" & not the internal $ajax "this"
}).done(function() {
//do all the stuff you need to do, it will then be executed in the right order
});
在我的情况下,如果我不这样做,我的代码的其余部分比返回的$ .ajax调用快得多。如果我使用全局变量并不重要。
更新:
使用$ .ajax时,浏览器只能使用2个套接字来运行请求。如果您有多个请求(超过500个),这将导致浏览器(我使用Chrome)挂起,因为请求加起来但无法按时处理。一段时间后,您将从服务器获得连接错误。
解决方案:使用AJAX队列管理器。我使用了http://plugins.jquery.com/ajaxQueue/
所以现在我的代码略有不同(只需用jQuery.ajaxQueue替换$ .ajax):
jQuery.ajaxQueue({
url: "myExample.html",
context: this //"this" refer to the outer-context "this" & not the internal $ajax "this"
}).done(function() {
//do all the stuff you need to do, it will then be executed in the right order
});
希望这会有助于后代: - )