Как найти URL-адрес запроса изнутри обратного вызова "onload" Greasemonkey GM_xmlhttpRequest в случае перенаправления 302?

У меня есть GM_xmlhttpReqeust Настройка функции следующим образом (упрощенная версия) в моем скрипте Greasemonkey.

  GM_xmlhttpRequest({
    synchronous: false,
    method: "HEAD",
    url: "http://www.example1.com",
    onload: function(response){console.debug(url);},
  });
  • GM_xmlhttpReqeust вызывается в асинхронном режиме в моем коде.

  • После доступа, http://www.example1.com 302 перенаправляет на http://www.example2.com

  • Я хотел бы получить доступ к стоимости оригинала url параметр (http://www.example1.com) внутри onload функция обратного вызова.

  • Согласно GM_xmlhttpReqeust документация, http://www.example2.com можно найти в response.finalUrl внутри onload Перезвоните.

Может кто-нибудь указать мне правильный путь Greasemonkey/JavaScript?

3 ответа

Решение

response перешел к onload это объект с этими ключевыми свойствами:

  • readyState
  • responseHeaders
  • responseText
  • статус
  • его статус
  • finalUrl

Ты хочешь finalUrlВы получаете это как:

GM_xmlhttpRequest ( {
    synchronous:    false,
    method:         "HEAD",
    url:            "http://www.google.com",
    onload:         function (response) {
        console.debug (response.finalUrl);
    }
} );


Обновление для пересмотренного / уточненного вопроса:

Чтобы получить / узнать первоначально запрошенный URL, вы должны позвонить GM_xmlhttpRequest() в закрытии. Вот так:

var origURL = "http://www.google.com";

(function (targURL) {
    GM_xmlhttpRequest ( {
        synchronous:    false,
        method:         "HEAD",
        url:            targURL,
        onload:         function (response) {
            console.log ("orig URL: ", targURL);
            console.log ("final URL: ", response.finalUrl);
        }
    } );
} ) (origURL);

Я получил глупое решение ниже, я надеюсь, что оно будет работать.

GM_xmlhttpRequest ( {
    synchronous:    false,
    method:         "HEAD",
    url:            "http://www.google.com",
    onload:         function (response) {
        console.debug (this.url);
    }
} );

Ссылаясь на

http://userscripts-mirror.org/topics/51161

Во-первых, вам нужно:

var method = this;
  var oldargs = [].slice.call( arguments, 1 );
  return function () {
    var newargs = [].slice.call( arguments );
    return method.apply( thisObject, oldargs.concat( newargs ));
  };
}

Тогда вы идете, аналогичным образом...

Другие вопросы по тегам