jQuery循环,只执行最后ajax成功

时间:2011-11-08 19:34:04

标签: jquery

因此,这是我的Chrome扩展程序[here]的核心,[jqjQuery.noConflict()] jq('.pam div .fbCurrentActionLink')返回Facebook上的每个“Poke”链接。它使用.each()循环遍历每个人[也就是每个人的“戳”链接],并且在成功时,它用粗体&替换文本“Poke”。绿色“戳”文字。

function execute()
{
        jq('.pam div .fbCurrentActionLink').each(function () {

        anc=jq(this)
        uid=anc.attr('ajaxify').match(/(\d+)/)[0]

        //ajax
                var post_form_id = jq('#post_form_id').val();
                var fb_dtsg = jq('input[name=fb_dtsg]').val();
                //use AJAX to submit poke, via their fb id
                jq.ajax({
                        type: 'POST',
                        url: 'ajax/poke.php?__a=1',
                        data: 'uid=' + uid + '&pokeback=1&post_form_id=' + post_form_id + '&fb_dtsg=' + fb_dtsg + '&post_form_id_source=AsyncRequest',
                        beforeSend: function(xhr){
                                xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
                        },
                        success: function(data, textStatus){
                                anc.html('<b style="color:green !important">Poked</b>');
                        }
                });

        //ajax
        });

}

现在问题是,让我们说有3个回归。它只会执行 last 上的.html()。我无法弄清楚原因。

2 个答案:

答案 0 :(得分:5)

我认为你遇到的问题是,当第一个ajax调用完成时,anc的值已被覆盖。一旦触发成功事件,anc等于它在最后一次迭代时的值。要解决此问题,必须停止覆盖值,或者在循环期间,必须将每个ajax调用绑定到将放置结果的元素。

要将ajax调用绑定到dom元素,您需要提供定义ajax调用的context

尝试一下,我希望它能起作用......

      jq.ajax({
              type: 'POST',
              context: this,        //added line
              url: 'ajax/poke.php?__a=1',
              data: 'uid=' + uid + '&pokeback=1&post_form_id=' + post_form_id + '&fb_dtsg=' + fb_dtsg + '&post_form_id_source=AsyncRequest',
              beforeSend: function(xhr){
                    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
              },
              success: function(data, textStatus){
                    $(this).html('<b style="color:green !important">Poked</b>');  
                    //changed to $(this) instead of anc
              }
      });

答案 1 :(得分:3)

您必须在var之前为变量添加前缀。否则,它们不是在本地(即each)声明的。如果是这种情况,则在每次迭代时都会覆盖该变量。

function execute() {
        jq('.pam div .fbCurrentActionLink').each(function () {
            var anc = jq(this);                              // Added `var`
            var uid = anc.attr('ajaxify').match(/(\d+)/)[0]; // Added `var`
            ....