jQuery.ajax d'échec de l'appel à l'intérieur de extension Chrome
Je suis le portage de l'un de mes extensions Firefox à Chrome, et je suis confronté à un petit problème avec une requête AJAX. Le code suivant fonctionne très bien dans la FF extension, mais échoue avec un statut de "0" dans Chrome.
function IsImage(url) {
var isImage = false;
var reImageContentType = /image\/(jpeg|pjpeg|gif|png|bmp)/i;
var reLooksLikeImage = /\.(jpg|jpeg|gif|png|bmp)/i;
if(!reLooksLikeImage.test(url))
{
return false;
}
var xhr = $.ajax({
async: false,
type: "HEAD",
url: url,
timeout: 1000,
complete : function(xhr, status) {
switch(status)
{
case "success":
isImage = reImageContentType.test(xhr.getResponseHeader("Content-Type"));
break;
}
},
});
return isImage;
}
Cette partie de l'extension vérifie ce qui est dans le presse-papiers (un autre Chrome problème, j'ai déjà résolu), et, si l'URL de l'image, il envoie une requête HEAD et vérifie le "Content-Type" en-tête de réponse pour être sûr que c'est une image. Si oui, il va retourner true, coller le texte du presse-papiers dans une balise IMG. Sinon, si il ressemble à un URL qui n'est pas une image, il l'enveloppe dans une balise. Si ce n'est pas une URL, il n'a tout simplement une simple pâte.
De toute façon, l'url en cours de vérification est certainement une image, et fonctionne très bien dans les FF, mais dans la fonction complète, xhr.est à l'état "0", et est à l'état "erreur" quand la fonction se termine. Augmenter le délai d'attente de 10 secondes ne l'aide pas. J'ai vérifié les images de test devrait revenir comme "image/jpeg" lors de l'exécution:
curl -i -X HEAD <imageURL>
Je sais aussi que je devrais être à l'aide de l'erreur et de réussite des rappels, au lieu de remplir, mais ils ne fonctionnent pas non plus. Des idées?
ne devrait pas
return isImage;
être partie du rappel?Il peut l'être. C'était juste pour avoir un point de retour, mais il n'a même pas en arriver là, car le commutateur(statut) est une "erreur", de sorte que la branche n'est jamais appelée.
Je parie que c'est le problème, mais je n'ai pas compris l'exploitation forestière dans Chrome, autres que les alert() appelle, donc je ne suis pas sûr si c'est en silence à défaut ou s'il y a un autre problème. xhr.responseText est également vide.
Êtes-vous sûr de
type: "HEAD"
? Le doc dit que c'est censé être GET ou POST, d'autres sont permis, mais pas pris en charge dans tous les navigateurs. Ce pourrait bien être le cas, car il fonctionne de FF, mais pas dans google chrome.OriginalL'auteur Chris Doggett | 2009-12-23
Vous devez vous connecter pour publier un commentaire.
Comme vous l'avez compris Chris, dans le Contenu des Scripts, vous ne pouvez pas faire de la Croix-Domaine XHRs. Vous devez faire en une extension de la page de Fond, pop-up, ou même des Options pour le faire.
Pour plus d'informations concernant le contenu du script limitation, veuillez vous référer à:
http://code.google.com/chrome/extensions/content_scripts.html
Et pour plus d'informations concernant xhr limitation, veuillez vous référer à:
http://code.google.com/chrome/extensions/xhr.html
OriginalL'auteur Mohamed Mansour
J'ai résolu une partie du problème, en fait la plupart des. Tout d'abord, comme Brennan et je l'ai mentionné hier, j'avais besoin de définir des autorisations dans le manifeste.json.
Ce n'est pas idéal pour accorder des autorisations pour chaque domaine, mais puisque les images peuvent être accueillis à partir de n'importe quel domaine, il faudra le faire, et je vais avoir à se prémunir contre les attaques de type XSS.
L'autre problème, c'est que Chrome en effet, les blocs de quoi que ce soit dans le content_scripts section de faire des appels AJAX, à défaut silencieusement. Cependant, il n'y a aucune restriction sur le background_page, si vous en avez un. Cette page peut faire tous les appels AJAX il veut, et le Chrome a une API pour permettre à votre script pour ouvrir un port et de transmettre les demandes à cet arrière-plan de la page. Quelqu'un a écrit un script appelé XHRProxy comme une solution de contournement, et je l'ai modifié pour obtenir les en-tête de réponse. Il fonctionne!
Mon seul problème maintenant est de savoir comment faire le script d'attendre le résultat de l'appel à être mis à l'épreuve, au lieu de simplement retourner immédiatement.
OriginalL'auteur Chris Doggett
Vérifier votre fichier manifeste. L'extension ont la permission d'accéder à cette url?
Si elle contribue à votre deuxième problème (ou quelqu'un d'autre):
Vous pouvez envoyer une demande à votre page d'arrière-plan comme:
La Variable
response
peut être tout ce que vous voulez qu'il soit. Il peut simplement être un succès ou de refuser la chaîne. Jusqu'à vous.Sur votre fond de page, vous pouvez ajouter un écouteur:
Avec cela, vous pouvez passer à la réponse de votre requête AJAX retour à votre contenu de script et de faire ce que vous vouliez faire avec elle.
OriginalL'auteur Brennan McEachran
Accepté la réponse est obsolète.
Le contenu des scripts peut maintenant faire de la cross-site XMLHttpRequests comme arrière-plan des scripts!
L'Url doit être autorisé dans le manifeste:
Vous pouvez également utiliser des expressions comme:
pour obtenir plus d'autorisations générales.
Voici le Lien vers la documentation.
OriginalL'auteur Konstantin Schubert