jquery每个+ $ .get不起作用

时间:2012-04-25 16:16:53

标签: jquery ajax

我正在用法语做一个类似Reddit的网站,并且要完全优化我获取结果,缓存它,然后通过jQuery查询每个链接,看看它们是否被downvoted / upvoted。

  1. 您如何看待优化查询?

  2. 为什么不起作用!这是我的代码。

  3. 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(索引),它也做同样的事情。

4 个答案:

答案 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
});

希望这会有助于后代: - )