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