开发者

I can't figure out why the URL won't change for my GM_xmlhttpRequest in my Greasemonkey script

I'm having a really frustrating problem I hope someone can help me with. Here is a piece of my Grease开发者_StackOverflow中文版monkey script, I can't figure out why the asynchronous requests are always sent to the same 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);
       }
     });    
}

When I fire up Fiddler, I can see that it makes the same request no matter how many items are in my collection. Whatever the first link is, all requests are made to the that link. I have verified that the parse method successfully passes a different link to the SendData function every time, but the requests are always made to the first URL in the collection.

I thought what I had was similar to what I found here, but maybe I'm missing something. Any help would be appreciated.


It seems as though url is not getting captured in a closure, so it's undefined for all but the first GM_xmlhttpRequest run.

Modifying SendData(), like so:

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

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

should be enough.


Or, you can get the pages sequentially. Change parse() to something like:

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);
 }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜