9
votes

Pourquoi l'événement Onerror de Chrome pour l'élément IMG n'a-t-il été viré qu'une fois?

Pourquoi Chrome n'appelle-t-il que l'événement Onerror pour l'élément IMG une fois lorsque tous les autres navigateurs (IE7,8,9, FF, Opera et Safari) l'appelent à plusieurs reprises?

Y a-t-il un moyen de forcer Pour répéter l'appel ONERRRE (en chrome)?

Jsfiddle < p> html: xxx

javascript: < / p> xxx

edit: Commentaire de @sunil D. À propos de Chrome Not de nouvelle recherche en raison de nom de domaine non valide de www.asdfjklasdfasdf.com dans le Initial Fiddle exemple, je suis allé de l'avant et j'ai changé le nom de domaine pour correspondre à celui de l'image de réussite, mais avec un nom de fichier différent, il est donc toujours un 404. Cela prouvera que ce n'est pas le domaine non valide. Nom provoquant que Chrome renfloue la 2e tentative.

EDIT: Utilisation mise à jour du violon et de la suppression de jQuery à des choses simplement et de régler cela.


0 commentaires

5 Réponses :


0
votes

C'est le comportement correct. Vous ne voulez pas télécharger la même image deux fois - c'est un gaspillage de bande passante.

Quel chrome crée-t-il un objet en mémoire, puis l'appliquera à toutes les images avec le src .

Si vous en avez besoin, créez-la deux fois, créez ces objets via JavaScript et assignez .Onload = fonction () {..} à chacun.


1 commentaires

ça ne télécharge rien deux fois. Dans le violon, lorsque l'image initiale dans l'attribut src n'est pas trouvée, il incendie l'événement Onerrrrrr qui modifie l'attribut src SRC à une nouvelle URL. Lorsque la nouvelle URL est réévaluée et déterminée à être un 404 à nouveau, il convient à nouveau d'appeler l'événement Onerror jusqu'à ce que vous ne l'iez pas avec onerror = '' . Tout comme tous les autres navigateurs font. Essayez le violon en chrome et aussi dans un autre navigateur.



0
votes

Je pense que @mikhail est sur la bonne voie, à l'exception de la raison légèrement différente. Dans le deuxième exemple, vous essayez de télécharger 2 images du même domaine inexistant www.asdfjklasdfasdf.com .

Lorsque vous essayez de télécharger bogus1.png chrome omet de résoudre le domaine à une adresse IP.

Lorsque vous essayez de télécharger bogus2.png (à partir du même domaine inexistant), Chrome ne fait rien du tout. .. Parce qu'il sait que la recherche de domaine a échoué. Que ce soit un comportement correct pour Chrome de ne pas expédier un autre événement Onerror pourrait être ouvert au débat :) Je pense en quelque sorte qu'il devrait.

Pour prouver cela, ajoutez simplement 1 caractère à le nom de domaine pour bogus2.png et cela fonctionnera comme prévu.

edit

Une façon dont vous pouvez le forcer Pour tenter que les téléchargements suivants consistent à modifier le src du à la chaîne vide. C'est une sorte de hacky, mais ça marche. Vous pouvez définir votre attribut rsrc à quelque chose comme ceci: xxx

de cette façon, lorsque l'erreur se produit, vous définissez la source sur ''. Cela semble générer une erreur aussi, ce qui le déclenche ensuite pour essayer la prochaine source ...


3 commentaires

BLARG! Je pense que mon édition était erronée. Votre exemple original fonctionne pour moi maintenant, quand il n'a pas été plus tôt.


Vous êtes sur quelque chose en suggérant de définir l'attribut src à une chaîne vide entre les appels d'Onerror. Il semble travailler en chrome de cette façon et continuer à l'appeler à plusieurs reprises, mais pas sûre pourquoi.


Point intéressant sur le domaine, mais ce n'est pas la raison pour laquelle il est dédaignant. J'ai changé le violon ci-dessus pour utiliser le même nom de domaine avec un nom de fichier faux et le problème existe toujours.



5
votes

ok l'a eu. À l'intérieur de la fonction Vous attribuez à l'événement ONERRRE, définit l'attribut src code> sur null code> avant de le changer de nouvelle valeur forte>.

img.setAttribute('src', null);


2 commentaires

Vous pouvez s'il vous plaît Quelques des navigateurs Tous du temps, vous pouvez s'il vous plaît Tous des navigateurs Certains de la temps, mais vous ne pouvez pas s'il vous plaît tous des navigateurs tous du temps.


La réponse de Jess travaille dans tous les navigateurs de manière fiable (bien que son jsfiddle soit cassé), et ce n'est même pas un piratage - vous devez l'accepter au lieu de celui-ci, comme vous fait des demandes supplémentaires ...



5
votes

J'ai essayé les moyens énoncés ci-dessus, Setattribute ("SRC", NULL) a un effet secondaire, c'est-à-dire ajouter une autre demande.

Enfin, j'utilise p>

    setTimeout(function(){ imgElement.src = 'http://xxxx'; }, 0)


1 commentaires

Il suffit de faire courir Jsfiddle à Nowrap au lieu de décharger



0
votes

Aussi répondu par ETDashou sur cette question: https://stackoverflow.com/a/9891041/1090274 , réglage this.onerror = null; a travaillé pour moi.


0 commentaires