11
votes

jquery.getjson à l'intérieur d'un script utilisateur greasemonkey

Je tente d'écrire un script utilisateur qui fait une demande AJAX de domaine croisée.

J'ai inclus JQuery à l'intérieur de mon script à l'aide de @require et tout semble fonctionner de fonctionner jusqu'au point où j'essaie d'exécuter Jquery.getjson.

L'API J'accède à des supports JSONP, mais je continue à obtenir une erreur indiquant JSON1123456789 n'est pas définie.

De ce que j'ai pu rassembler, cela est dû à JQuery écrivant la réponse JSONP directement dans la tête de la page, qui devient alors sandboxé. Une fois que cela s'est produit, JQuery ne peut plus accéder au rappel qui lui permettait d'être indéfini. (Je ne suis pas à 100% sur cela étant le cas, mais cela me semble susceptible de moi).

Y a-t-il un moyen de contourner cela? Il a été suggéré de déclarer la fonction de rappel à l'intérieur de l'Indicawindow, mais je ne suis pas sûr de le faire et je n'ai pas réussi à le faire fonctionner.


0 commentaires

3 Réponses :


8
votes

La solution de contournement est d'utiliser gm_httprequest. Vous pouvez vous en sortir, au lieu de JSONP pour les demandes croisées de domaine, car contrairement au XHR habituel, GM_HTTPEQUBEST permet d'apporter des appels croisés. Vous voulez quelque chose comme:

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


0 commentaires

16
votes

Ce ne serait-il pas bien si JQuery utilisait gm_xmlhttprequest en interne afin que vous puissiez disposer de la commodité des méthodes de jQuery et de la fonctionnalité croisée de Greasemonkey? Comme le souligne Mahemoff, Greasemonkey pourrait vous permettre de faire la demande sans compter sur JSONP et de courir dans le problème de rappel que vous êtes confronté, mais vous devrez traiter avec vous-même le contenu du JSON.

Nous avons écrit une bibliothèque qui fera exactement que: le Greasemonkey / Jquery XHR Bridge . Si vous @require ce script dans votre utilisateur, alors tous $. Obtenez et $. Getjson et $. POST , etc. Les appels de jQuery travailleront sur le site inter-site sans s'appuyer sur des techniques telles que JSONP.

Donc, si vous utilisez ce pont et supprimez simplement le ? rappel =? de votre URL, votre code JQuery devrait fonctionner sans modification. Ce blog post fournit une procédure pas à pas. Si quelqu'un a des questions, des commentaires, des rapports de bogues ou des suggestions sur le plugin de pont, veuillez me le faire savoir.


2 commentaires

Bonjour Nick, assez judicieusement Je suis tombé sur votre script quand j'ai essayé d'abord de m'attaquer à ce problème, mais je n'avais pas compris que je devais retirer le rappel pour que les choses puissent fonctionner et l'abandonner. Merci d'avoir répondu à cette question et expliquez ce qu'il faut faire.


Merci pour cela, a rendu ma tâche beaucoup plus facile!



1
votes

Comme beaucoup d'entre vous le sauront, Google Chrome ne prend en charge aucune des fonctions GM_ Handy pour le moment.

En tant que tel, il est impossible à faire des demandes Ajax de sites croisés en raison de diverses restrictions de sablebox (même à l'aide d'excellents outils tels que Script de demande croisé de James Padolsey )

J'avais besoin d'une façon pour les utilisateurs de savoir quand mon script Greasemonkey avait été mis à jour en Chrome (puisque Chrome ne le fait pas non plus ...). J'ai proposé une solution documentée ici (et utilisée dans mon Lighthouse ++ script) et vaut la peine de lire pour ceux d'entre vous souhaitez vérifier vos scripts:

http://blog.bandit.co .nz / post / 1048347342 / Version-Check-chrome-greasemonkey-script


0 commentaires