因此,这是我的Chrome扩展程序[here]的核心,[jq
为jQuery.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()。我无法弄清楚原因。
答案 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`
....