我无法弄清楚为什么我的Greasemonkey脚本中的GM_xmlhttpRequest不会更改URL

时间:2011-01-26 21:39:16

标签: javascript jquery closures greasemonkey

我有一个非常令人沮丧的问题,我希望有人可以帮助我。这是我的Greasemonkey脚本的一部分,我无法弄清楚为什么异步请求总是被发送到同一个URL。

function parse(details) {
     var element = $(details);
     var coll = element.find("#my valid selector");

     $.each(coll, function(index, href) { 
          SendData(href);
     });
 }

 function SendData(url) {
      GM_xmlhttpRequest ({
       method: 'GET',
       url: url,
       headers: {
        'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
        'Accept': 'application/atom+xml,application/xml,text/xml',
       },
       onload: function(responseDetails) {
          doSomething(responseDetails.responseText);
       }
     });    
}

当我启动Fiddler时,无论我的收藏中有多少物品,我都可以看到它会发出相同的请求。无论第一个链接是什么,所有请求都发送到该链接。我已经验证了parse方法每次都成功地将一个不同的链接传递给SendData函数,但是请求总是发送到集合中的第一个URL。

我认为我拥有的东西与我发现的here类似,但也许我错过了一些东西。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

似乎url未在closure中捕获,因此除了第一次GM_xmlhttpRequest运行之外,其他所有内容都未定义。

修改SendData(),如下所示:

function SendData(url)
{
    var moreSubstantial = url + " ";

    GM_xmlhttpRequest(
    {
        method:     'GET',
        url:        moreSubstantial,

应该足够了。


或者,您可以按顺序获取页面。将parse()更改为:

function parse (details)
{
    var element     = $(details);
    var coll        = element.find("#my valid selector");
    var TargetPages = coll.map (function() {return this.href;} );

    (function getNextPage (J)
    {
        var PageURL = TargetPages[J];

        GM_xmlhttpRequest
        ( {
            method:     "GET",
            url:        PageURL,
            headers:    {
                            'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
                            'Accept': 'application/atom+xml,application/xml,text/xml',
                        },
            onload:     function (responseDetails)
                        {
                            doSomething (responseDetails.responseText);

                            if (--J >= 0)
                                getNextPage (J);
                        }
        } );
    } ) (TargetPages.length - 1);
 }