jQuery: Dynamique de la gestion des images (en attente de chargement)
Je suis en train d'écrire un plugin qui a un construit en fonction d'attendre jusqu'à ce que toutes les images qui sont sur la page à charger avant qu'il exécute lui-même. $(window).load()
ne fonctionne que si c'est le chargement initial de la page, mais si quelqu'un veut tirer vers le bas le code HTML par le biais de l'AJAX qui contient des images, il ne fonctionne pas.
Est-il une bonne façon de le faire ET le mettre en œuvre, de sorte qu'il peut être autonome dans le plug-in? J'ai essayé de boucler sur $('img').complete
, et je sais que cela ne fonctionne pas (les images ne jamais charger, et le navigateur se bloque en vertu d'un "script prend trop de temps" bug). Pour un exemple de ce que je suis en train de faire, visiter la page que je suis à la recherche de la maison de l'extension:
Si vous allez sur le "plus" de l'article (cliquez sur la barre de navigation), vous verrez que l'image diaporama ne se charge pas correctement. Je sais que le code actuel ne fonctionne pas, mais c'est juste de la place de la tenue jusqu'à ce que je comprendre quelque chose.
Edit: Essayer cette solution, mais ça ne fonctionne pas:
if($('.simpleSlide-slide img').size() > 0) {
var loaded_materials = $('.simpleSlide-slide img').get();
} else {
var loaded_materials = $('.simpleSlide-slide').get();
}
$(loaded_materials).live('load', function() {
/* Image processing and loading code */
});
OriginalL'auteur dclowd9901 | 2010-03-30
Vous devez vous connecter pour publier un commentaire.
Le problème avec la boucle sur les images et l'appel
$('img').complete
est que le navigateur de l'INTERFACE utilisateur est mono-thread, donc vous ne serez jamais en lui donnant la chance de charger les images parce que c'est toujours dans votre boucle. Vous pouvez utilisersetTimeout
pour permettre au navigateur de travail. par exemple,OriginalL'auteur noah
Je pense que Vous avez besoin de lier une fonction globale ajaxSuccess et puis de lier un événement de chargement de chaque image sur la page.
ou lorsque Vous attendez-vous à beaucoup d'images:
Si tout le code ci-dessus ne fonctionne pas correctement Tou pourriez mettre le code dans une fonction de callback qui ajoute html sur le site après l'ajout. à l'aide de setTimeout dans la fonction ci-dessus peut aider trop.
[modifier]
Vous pouvez générer des images
<img src="something" onload="$.imgHello()" />
dans le code côté serveur et l'incrément de quelques contre dans chaque$.imgHello()
appel de fonction si Vous savez comment beaucoup d'images sont là va être chargé. Mais ce n'est pas une solution que je recommande à n'importe qui..loaded
classe?Si Vous avez des centaines d'images sur la page, il devrait être plus rapide pour sélectionner uniquement les nouveaux que pour lier de nouveau la fonction de charge de l'ensemble des cas.
Mais j'ai de l'exécution de la même fonction pour autant d'images que j'ai sur la page? Ne serait-ce pas tout autant ralentir? Je reviens à cette idée que si il y avait d'une certaine manière, je pourrais avoir le script de savoir combien d'images ont été sur la page (qu'il peut), et chaque image peut informer le script de son achèvement, d'une certaine façon, le script pourrait à son tour exécuter une fonction lors de la notification d'achèvement, alors je vais être bon pour aller. Javascript est même que la capacité?
En fait, c'est ce qui se passe. Mais uniquement pour les images générées par un seul appel ajax. Vous ne pouvez pas lier quelque chose à un événement AVANT de mettre l'image sur la page. Il y a seulement un petit hack que Vous pouvez faire. voir modifier
Oups, je pense que le jQuery .la méthode load () est ce n'est pas un gestionnaire d'événement, c'est un contenu graveur. Peut-être, au lieu
$('img').one('load', function(){
OriginalL'auteur naugtur
Avez-vous pensé à utiliser
live()
de se lier à tous les actuels et futursimg
éléments?Après votre mise à jour, je peux voir le problème que vous rencontrez.
live()
fonctionne le mieux sur un sélecteur, alors que votre aide sur un jQuery-enveloppé tableau d'éléments. À l'aide delive()
comme ce n'est pas différent à l'aide debind()
. Vous devriez essayer quelque chose comme ceci à la place:'load'
comme un événement...Vous êtes une machine! J'étais en train de taper ma réponse 😛 C'est injuste 😉
la documentation ne fait aucune mention de la non prise en charge des événements. Juste
A string containing a JavaScript event type, such as "click" or "keydown".
Il prétend même à soutenir des événements personnalisés, donc je suis sûr qu'il peut prendre en charge cette norme 🙂Oui, il prend en charge tous les événements, mais seulement dans la dernière version de jquery. Il l'habitude de travailler uniquement avec un sous-ensemble de disponible événements et ils ont eu à résoudre, il est rapide, parce que les gens continuaient à abuser sur le live() fonction. Moi je préfère garder une trace de ce que je fais et l'utilisation de bind() si c'est possible.
alors pourquoi n'est-il pas de travail dans le code ci-dessus?
OriginalL'auteur Andy E
Après avoir essayé d'accomplir cette tâche dans à peu près tous les moyens imaginables de la mode, celui-ci a été celui qui a enfin travaillé, et un grand merci à Naugtur pour me pointer dans la bonne direction:
Pour une explication rapide de ce qui se passe, je vais utiliser une analogie. Imaginez que chaque image est un invité à votre partie. Les lumières sont éteintes. Vous retournez sur le feu, puis de la course à chaque invité et de leur donner un morceau de papier, un stylo et un téléphone cellulaire, tout en pointant les combien de personnes vous avez remis des matériaux. Ils ont tous commencer à dessiner furieusement et puis dès qu'ils ont terminé leurs dessins, ils vous appellent et vous le dire. Pour chacune des appels, vous traversez un compte hors de votre conseil d'administration. Lorsque la dernière personne qui vous appelle (lorsque vous exécutez hors de coches sur votre planche, vous leur dites de raccrocher et d'appeler la pizza guy. C'est la pizza de temps. Si il n'y avait pas de clients pour commencer, vous appelez la pizza guy vous-même.
Si vous êtes en train de penser "Pourquoi n'avait-il créer un
Image()
objet pour chaque$.load()
, eh bien, j'ai essayé d'aller le traditionnel jQuery route de au moyen d'un simple jQuery-sélecteur de style au lieu de l'image de l'Objet. Il a apparemment été complètement ignoré (qui s'est écrasé à la page). J'ai essayé d'utiliserImage()
en conjonction avec.onLoad
, et qui a fonctionné dans la mesure où de ne pas tomber de la page, mais il n'a pas de remplir la fonction pour laquelle je l'ai écrit.Ce morceau de code est autonome, donc j'imagine qu'il peut être copypasta avais en tout chargement de l'image de l'app. Il semble assez petit pour moi afin de ne pas être intrusif.
functionToPerform()
agit donc comme toute fonction que vous voulez attendre pour effectuer jusqu'à ce que toutes les images sont chargées (dans mon cas, c'est l'ensemble du plugin). Toodles.$.extend(no_of_images);
?OriginalL'auteur dclowd9901