Frage

Ich bin versucht, ein Benutzerskript zu schreiben, die einen Cross-Domain-AJAX-Request macht.

Ich habe jQuery in meinem Skript enthält @require Gebrauch nehmen und alles scheint in Ordnung bis zu dem Punkt zu arbeiten, wo ich versuche jQuery.getJSON auszuführen.

Die API I unterstützt JSONP bin Zugriff jedoch immer ich einen Fehler bekommen jsonp123456789 Angabe ist nicht definiert.

Von dem, was ich konnte sammeln dies ist darauf zurückzuführen, jQuery die JSONP Antwort direkt in den Kopf der Seite zu schreiben, die dann Sandbox wird. Sobald das aufgetreten den Rückruf jQuery kann resultierenden Zugriff nicht mehr darin nicht definiert ist. (Ich bin nicht 100% auf das der Fall zu sein, aber es scheint mir wahrscheinlich).

Gibt es eine Möglichkeit, dies zu umgehen? Es wurde vorgeschlagen, dass ich die Callback-Funktion innerhalb unsafeWindow erklären, aber ich bin nicht sicher, wie dies zu tun, und haben es nicht geschafft, es zu bekommen zu arbeiten.

War es hilfreich?

Lösung

Wäre es nicht schön, wenn jQuery GM_xmlhttpRequest intern verwendet, so dass Sie den Komfort der jQuery-Methoden haben könnten und die Cross-Site-Funktionalität von Greasemonkey? Wie mahemoff weist darauf hin, konnte Greasemonkey können Sie den Antrag stellen, ohne auf JSONP zu verlassen und laufen in die Callback-Problem Sie konfrontiert, aber Sie werden mit den JSON Inhalte selbst zu tun haben.

Wir haben eine Bibliothek geschrieben, die genau das tun: die Grease / jQuery XHR Brücke . Wenn Sie das Skript in Ihrem userscript @require, dann alle $.get und $.getJSON und $.post usw. ruft jQuery Cross-Site arbeiten, ohne auf Techniken wie JSONP zu verlassen.

Wenn Sie also diese Brücke verwenden und einfach die ?callback=? aus Ihrer URL entfernen, sollte Ihr jQuery-Code ohne Änderungen arbeiten. Dieser Blog-Eintrag bietet eine Schritt-für-Schritt-Anleitung. Wenn jemand Fragen hat, Kommentare, Fehlerberichte oder Vorschläge über die Brücke Plugin, lass es mich wissen.

Andere Tipps

Die Abhilfe ist GM_HttpRequest zu verwenden. Sie können mit ihm, statt JSONP für Cross-Domain-Anfragen, denn im Gegensatz zu den üblichen XHR weg, GM_HttpRequest Cross-Domain-Anrufe zulässt. Sie wollen so etwas wie:

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

Beachten Sie, dass dieses JSON des eval die einfachste Art und Weise. Wenn Sie eine sichere Lösung für nicht vertrauenswürdige JSON wollen, müssen Sie umfassen eine kleine JSON-Parsing-Bibliothek .

Leider müssen Sie auch wickeln eine scheinbar nutzlos Null-Dauer SetTimeout um die das ganze Ding. Ich finde es am einfachsten, die GM_xmlhttpRequest in seiner eigenen Methode zu bleiben, dann laufen setTimeout (makecall, 0);.

Sie können sehen, ein reales Beispiel hier .

Wie viele von Ihnen wissen, ist Google Chrome zur Zeit nicht eine der handlichen GM_ Funktionen unterstützen.

Als solches ist es unmöglich Cross-Site-AJAX-Anforderungen aufgrund verschiedener Sandbox Einschränkungen zu tun (auch mit großen Werkzeugen wie James Padolsey Cross Domain Request-Skript )

ich brauchte eine Möglichkeit für die Nutzer zu wissen, wann meine Greasemonkey-Skript hatte in Chrome aktualisiert worden (da Chrome macht das nicht entweder ...). Ich kam mit einer Lösung auf, die hier dokumentiert ist (und in meinem gebräuchlich Leuchtturm ++ Skript) und lesenswert für die von Ihnen wollen Version Ihre Skripte überprüfen:

http://blog.bandit.co .nz / post / 1048347342 / version-Check-Chrom-Greasemonkey-Skript

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top