0

我有一个 Chrome 扩展程序,我终于开始更新 [已经超过 6 个月]。
我经历了将清单版本从 1 升级到 2 的过程。

我的扩展程序向 Facebook 添加了一个“全部戳”按钮,因此您不必单独戳每个人。

问题是,他们将戳移到了 facebook.com/pokes,而不是在主页的框架中。

所以我的解决方法是告诉人们在/pokes 上重新加载页面,这样脚本就会重新加载,并注入“Poke All”按钮。现在,我想解决这个问题,以便当用户访问 facebook.com,然后单击“戳”并加载戳时,该按钮会自动出现。我已经用 setTimeout 设置了 1.5 秒,但是如果有人的连接速度很慢,1.5 秒是不够的,并且脚本试图过早地注入按钮,导致没有按钮。

所以基本上,我在“Pokes”链接中添加了一个事件监听器。这就是我添加超时运行的原因show_pokes(),它运行注入代码。

我的想法是放一个$(document).ready() inside show_pokes(),但这不起作用,因为它从未在函数中继续存在。我猜$(document).ready()只是为了初始页面加载?所以我尝试了

document.addEventListener('DOMContentLoaded', function (){ /*huge chunk of code here*/ })

但这也只是挂起,从未完成该功能。

因此,我很确定当您单击 Facebook 选项卡时,Facebook 会使用 AJAX 请求 [请参见此处],所以也许我可以设置一个事件以等待 AJAX 完成,然后它可以在我的函数中继续,并注入按钮?任何帮助将不胜感激,或者如果您需要更多代码或更多细节,请告诉我。或者,如果你可以去 Facebook 看看它是如何加载这些标签的,[并确认或否认它是否使用 AJAX],那也会有很大的帮助。

4

2 回答 2

0

我不知道这是否会对您有所帮助,但听起来您可以使用$.when().done()jQuery 提供的。when()这样,它将等到done().

http://api.jquery.com/jQuery.when/

于 2012-09-24T16:48:32.147 回答
0

正如杰里米所说,增加一个计数器。请注意,在此循环期间 AJAX 返回i将继续进行。如果您需要保留当前,i那么您需要将 AJAX 调用放在闭包中。

var pokes = $(".pokeMe");
var poked = 0;
var failed = 0;

for(var i = 0; i < pokes.length; i++) {
    $.ajax({
        url : url, 
        success : function(data) {
            poked++;

            if (poked + failed == pokes.length) {
                // all actions returned
            }
        },
        error : function(data) {
            failed++;

            // optional logic
        }
    });
}
于 2012-09-24T04:56:56.843 回答