JQuery.getJSON внутри пользователя greasemonkey script

Я пытаюсь написать пользователя script, который делает запрос AJAX кросс-домена.

Я включил jQuery внутри моего script с помощью @require, и все, кажется, работает нормально до тех пор, пока я не попытаюсь запустить jQuery.getJSON.

API, к которому я обращаюсь, поддерживает jsonp, однако я продолжаю получать сообщение об ошибке, поскольку jsonp123456789 не определен.

Из того, что я смог собрать, связано с тем, что jQuery записывает ответ jsonp непосредственно в начало страницы, который затем становится песочницей. Как только это произошло, jQuery больше не сможет получить доступ к обратному вызову, в результате чего он будет undefined. (Я не 100% на этом, но это кажется мне вероятным).

Есть ли способ обойти это? Было предложено объявить функцию обратного вызова внутри unsafeWindow, но я не уверен, как это сделать и не удалось заставить ее работать.

Ответ 1

Было бы неплохо, если бы jQuery использовал GM_xmlhttpRequest внутренне, чтобы вы могли использовать все удобства методов jQuery и межсайтовых функций Greasemonkey? Как указывает mahemoff, Greasemonkey может позволить вам сделать запрос, не полагаясь на JSONP и столкнуться с проблемой обратного вызова, с которой вы сталкиваетесь, но вам придется иметь дело с содержимым JSON самостоятельно.

Мы написали библиотеку, которая будет делать именно это: Greasemonkey/jQuery XHR bridge. Если вы @require, что script в вашем usercript, то все $.get и $.getJSON и $.post и т.д. JQuery вызовы будут работать на разных сайтах, не полагаясь на такие методы, как JSONP.

Итак, если вы используете этот мост и просто удаляете ?callback=? с вашего URL-адреса, ваш код jQuery должен работать без изменений. Это сообщение в блоге содержит пошаговое руководство. Если у кого есть какие-либо вопросы, комментарии, сообщения об ошибках или предложения о плагине моста, пожалуйста, дайте мне знать.

Ответ 2

Обходной путь - использовать GM_HttpRequest. Вы можете избежать этого, вместо JSONP для междоменных запросов, потому что в отличие от обычного XHR, GM_HttpRequest разрешает междоменные вызовы. Вы хотите что-то вроде:

  GM_xmlhttpRequest({
     method: "GET",
     url: "http://example.com/path/to/json",
     onload: function(xhr) {
      var data = eval("(" + xhr.responseText + ")");
      // use data ...
    }
  });

Обратите внимание, что этот eval JSON самый простой способ. Если вы хотите более безопасное решение для ненадежного JSON, вам нужно включить небольшую библиотеку JSON-parsing.

К сожалению, вы также должны обернуть, казалось бы, бесполезную нулевую продолжительность setTimeout вокруг всего. Мне легче всего вставить GM_xmlhttpRequest в свой собственный метод, а затем запустить setTimeout (makeCall, 0);.

Вы можете увидеть реальный пример .

Ответ 3

Как многие из вас узнают, Google Chrome в настоящий момент не поддерживает какие-либо удобные функции GM_.

Таким образом, невозможно выполнять запросы AJAX через сайт из-за различных ограничений на песочницу (даже используя большие инструменты, такие как James Запрос доменного имени Padolsey Script)

Мне нужен был способ узнать, когда мой Greasemonkey script был обновлен в Chrome (поскольку Chrome этого не делает...). Я придумал решение, которое описано здесь (и используется в Lighthouse ++ script), и стоит прочитать для тех из вас, кто хочет проверить версию скриптов:

http://blog.bandit.co.nz/post/1048347342/version-check-chrome-greasemonkey-script