Запрос Greasemonkey AJAX из другого домена?

Я пытаюсь заставить JavaScript (с Greasemonkey) извлекать данные с моего собственного сайта для настройки другого сайта. Код, который я использую, выглядит следующим образом:

function getURL(url, func)
{
  var xhr = new XMLHttpRequest();
  xhr.open("GET", url, true);
  xhr.onload = function (e) 
  {
    if (xhr.readyState == 4) 
    {
      if (xhr.status == 200) 
      {
        func(xhr.responseText, url);
      } 
      else
      {
        alert(xhr.statusText, 0);
      }
    }
  };
  xhr.onerror = function (e)
  {
    alert("getURL Error: "+ xhr.statusText); // picks up error here
  };
  xhr.send(null);  
}

Вышеприведенное работает отлично, он получает текст из URL-адреса и возвращает его анонимной функции, которую я передаю в функцию, если файл находится в том же домене, что и страница, с которой я его вызываю. Однако, если домен другой, срабатывает onerror.

Как я могу разобраться, чтобы я мог получать данные из другого домена в этой настройке?


person Jason Lang    schedule 04.03.2017    source источник
comment
код, который вы разместили в скрипте Greasemonkey? если это так, вам нужно использовать Greasemonkeys XHR — https://wiki.greasespot.net/GM_xmlhttpRequest   -  person Jaromanda X    schedule 04.03.2017
comment
примечание: вам, вероятно, следует подумать о переносе вашего кода на web extension — потому что я не думаю, что Greasemonkey переживет Firefox 57 — разработчики на самом деле не заинтересованы в переносе Greasemonkey на веб-расширение — у них было куча проблем с недавней совместимостью с e10s , и я думаю, что через 10 лет с них хватит :p   -  person Jaromanda X    schedule 04.03.2017
comment
@JaromandaX, даже если текущий ведущий разработчик уронит мяч (больше/снова), другие, без сомнения, поднимут его. Также Tampermonkey в Firefox становится все более жизнеспособным вариантом.   -  person Brock Adams    schedule 04.03.2017
comment
конечно! Tampermonkey - спасибо за внимание @BrockAdams   -  person Jaromanda X    schedule 04.03.2017
comment
Спасибо, ребята, это была помощь. На самом деле, поскольку я контролирую домен, из которого я извлекаю данные, я смог исправить ситуацию, отредактировав данные, которые я отправляю, с другим заголовком CORS на моей странице. Кто-то упомянул об этом, но отредактировал. Тем не менее, очень полезно знать о расширениях GM для случаев, когда я не контролирую данные. spring.io/understanding/CORS   -  person Jason Lang    schedule 04.03.2017


Ответы (1)


Greasemonkey (и Tampermonkey) имеет встроенную поддержку междоменного AJAX. Используйте https://wiki.greasespot.net/GM_xmlhttpRequest.

Вот полный пользовательский скрипт, иллюстрирующий процесс:

// ==UserScript==
// @name        _Starter AJAX request in GM, TM, etc.
// @match       *://YOUR_SERVER.COM/YOUR_PATH/*
// @grant       GM_xmlhttpRequest
// @connect     targetdomain1.com
// ==/UserScript==

GM_xmlhttpRequest ( {
    method:     'GET',
    url:        'http://targetdomain1.com/some_page.htm',
    onload:     function (responseDetails) {
                    // DO ALL RESPONSE PROCESSING HERE...
                    console.log (
                        "GM_xmlhttpRequest() response is:\n",
                        responseDetails.responseText.substring (0, 80) + '...'
                    );
                }
} );

Вам также следует выработать привычку использовать директиву @connect, хотя она не является строго обязательной для Greasemonkey в Firefox, пока.

person Brock Adams    schedule 04.03.2017