2010-10-26 6 views
0

J'essaie de faire mon propre bookmarklet et j'ai déjà essayé de lire une réponse dans SO mais rien pour répondre à la réaction étrange que j'ai eu de mon script.Ajax dans bookmarklet: action faite mais réponse non donnée

Je fais un appel AJAX de mon bookmarklet, donc je ne le petit truc:

var newScript = document.createElement("script"); 
newScript.type = "text/javascript"; 
newScript.src = "http://example.com/urlToMyJS.js"; 
document.body.appendChild(newScript); 
void(0); 

Et les urlToMyJS.js est comme ceci:

var u = 'http://example.com/scriptToCall.php'; 
var request = new XMLHttpRequest(); 
request.open("GET", u, true); 
request.onreadystatechange = function() { 
    var done = 4, ok = 200; 
    if (request.readyState == done && request.status == ok) { 
    if (request.responseText) { 
     alert(request.responseText); 
    } 
    } 
}; 
request.send(null); 

La partie bizarre est:

  • Le javascript est toujours lancé et scri ptToCall.php est toujours appelé aussi (il enregistre chaque coup)
  • Le alert montre le responseText quand je clique sur le bookmarklet sur example.com
  • Parfois, sur d'autres sites, le alert ne montre rien (mais toujours apparaît)
  • d'autres fois, le alert ne montre même pas ... (mais je dois encore le hit journal ...)

avez-vous une idée pourquoi il fait ça? Et si oui, avez-vous une idée de ce que je pourrais faire pour montrer toujours le responseText?

Répondre

0

Eh bien, finalement, j'ai utilisé une autre astuce:

var newScript = document.createElement("script"); 
newScript.type = "text/javascript"; 
newScript.src = "http://example.com/scriptToCall.php"; 
document.body.appendChild(newScript); 
void(0); 

De cette façon (le PHP envoie un en-tête javascript), pas plus AJAX. C'était un non-sens dans mon cas puisque les deux fichiers étaient dans le même serveur/dossier, 1 mouvement au lieu de 2!

En tout cas, merci Bobince pour tous les détails que je pourrais utiliser dans le futur!

+0

Regardez aussi dans CORS - utile ... – mplungjan

+0

hoooo, je ne savais pas à ce sujet. Intéressant, mais il ne fonctionne pas avec IE7 apparemment :-((et FF <3.5) Sauf si vous connaissez un hack? – Shikiryu

0

status ne sera pas ok sauf si vous testez le bookmarklet sur votre propre site (example.com). Lorsque vous exécutez le bookmarklet sur un site différent à example.com (qui est après tout le point d'avoir un bookmarklet), il fera une XMLHttpRequest d'origine croisée à example.com. En fonction du navigateur que vous utilisez, cela peut faire la demande, mais vous ne serez pas en mesure de lire la réponse en raison de la politique de même origine. C'est une fonctionnalité de sécurité essentielle que vous ne pouvez pas faire en usurpant l'identité XMLHttpRequests à d'autres serveurs.

Si vous souhaitez renvoyer une requête XMLHttpRequest à votre serveur, vous devez le faire à partir d'un document sur votre serveur, en faisant en sorte que le bookmarklet crée un pointant vers example.com.

Vous pouvez également utiliser JSONP (inclusion <script>) pour appeler scriptToCall.php.

+0

Eh bien, comme vous pouvez le voir, le fichier JS et le fichier PHP sont tous deux sur mon serveur, et le PHP n'appelle aucun autre serveur. En fait, pour le moment, il enregistre uniquement la connexion et l'URL sur laquelle je suis et renvoie un message ("ok" ou "ok").Je pensais que l'ajout du script comme je le faisais permettrait la requête et la réponse interdomaines (je l'ai utilisé sur un autre projet que bookmarklet sans problème). Je vais vérifier JSONP mais parce que je déteste iframe: D – Shikiryu

+0

Oui, c'est l'emplacement du document qui * inclut * le script qui est important; la source du fichier JS est sans importance pour la politique de même origine. – bobince

+0

Je comprends. Mais j'ai utilisé ce "hack" pour une extension chrome et ça marche ... Est-ce parce que la requête vient d'un localhost? – Shikiryu