Question

J'essaie d'écrire un script utilisateur qui crée une demande AJAX entre domaines.

J'ai inclus jQuery dans mon script à l'aide de @require et tout semble bien fonctionner jusqu'au point où j'essaie d'exécuter jQuery.getJSON.

L’API à laquelle j’ai accès prend en charge jsonp, mais j’obtiens toujours une erreur indiquant que jsonp123456789 n’est pas défini.

De ce que j’ai pu comprendre, c’est parce que jQuery a écrit la réponse jsonp directement dans l’en-tête de la page, qui est ensuite mise en mode bac à sable. Une fois que cela s'est produit, jQuery ne peut plus accéder au rappel, ce qui le rend indéfini. (Je ne suis pas à 100% sur ce point, mais cela me semble probable).

Y at-il un moyen de contourner ce problème? Il a été suggéré de déclarer la fonction de rappel dans unsafeWindow mais je ne sais pas comment faire cela et je n’ai pas réussi à la faire fonctionner.

Était-ce utile?

La solution

Ne serait-il pas intéressant que jQuery utilise GM_xmlhttpRequest en interne afin de bénéficier de toutes les commodités des méthodes jQuery et des fonctionnalités intersites de Greasemonkey? Comme le souligne mahemoff, Greasemonkey pourrait vous permettre de faire la demande sans vous fier à JSONP et au problème de rappel auquel vous êtes confronté, mais vous devrez gérer vous-même le contenu JSON.

Nous avons écrit une bibliothèque qui fera exactement cela: le Pont Greasemonkey / jQuery XHR . Si vous @require ce script dans votre script utilisateur, tous les $. Get et $. GetJSON et $. Post , etc. Les appels jQuery fonctionnent sur plusieurs sites sans recourir à des techniques telles que JSONP.

Donc, si vous utilisez ce pont et supprimez simplement le ? callback =? de votre URL, votre code jQuery devrait fonctionner sans modification. Cet article de blog fournit une procédure pas à pas. Si vous avez des questions, des commentaires, des rapports de bugs ou des suggestions sur le plugin bridge, merci de me le faire savoir.

Autres conseils

La solution consiste à utiliser GM_HttpRequest. Vous pouvez vous en tirer, au lieu de JSONP pour les requêtes entre domaines, car contrairement au XHR habituel, GM_HttpRequest autorise les appels entre domaines. 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 ...
    }
  });

Notez que le JSON de cet eval est le moyen le plus simple. Si vous souhaitez une solution plus sécurisée pour les JSON non fiables, vous devez inclure une petite bibliothèque d'analyse JSON .

Malheureusement, vous devez également enchaîner un setTimeout apparemment inutile et de durée nulle autour du la totalité. Je trouve plus facile de coller le GM_xmlhttpRequest dans sa propre méthode, puis d’exécuter setTimeout (makeCall, 0);.

Vous pouvez voir un exemple réel ici .

Comme beaucoup d'entre vous le savent, Google Chrome ne prend actuellement en charge aucune des fonctions pratiques de GM_.

En tant que tel, il est impossible de traiter des requêtes AJAX intersites en raison de diverses restrictions de sandbox (même à l'aide d'excellents outils tels que Script de requête inter-domaines de James Padolsey )

J'avais besoin d'un moyen permettant aux utilisateurs de savoir quand mon script Greasemonkey avait été mis à jour dans Chrome (Chrome ne le faisant pas non plus ...). Je suis arrivé avec une solution qui est documentée ici (et utilisée dans mon script Lighthouse ++ ) et vaut la peine d'être lu pour ceux d'entre vous qui souhaitent vérifier la version de vos scripts:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top