Je crée un plugin jQuery.
Comment obtenir la largeur et la hauteur réelles de l'image avec Javascript dans Safari?
Les éléments suivants fonctionnent avec Firefox 3, IE7 et Opera 9:
var pic = $("img")
// need to remove these in of case img-element has set width and height
pic.removeAttr("width");
pic.removeAttr("height");
var pic_real_width = pic.width();
var pic_real_height = pic.height();
Mais dans les navigateurs Webkit comme Safari et Google Chrome, les valeurs sont 0.
javascript
jquery
safari
google-chrome
webkit
Frank Bannister
la source
la source
Réponses:
Les navigateurs Webkit définissent la propriété height et width après le chargement de l'image. Au lieu d'utiliser des délais d'attente, je vous recommande d'utiliser l'événement de chargement d'une image. Voici un petit exemple:
Pour éviter tout effet que CSS pourrait avoir sur les dimensions de l'image, le code ci-dessus crée une copie en mémoire de l'image. Il s'agit d'une solution très intelligente suggérée par FDisk .
Vous pouvez également utiliser les attributs
naturalHeight
etnaturalWidth
HTML5.la source
width
etheight
vous devriez probablement enlever aussimin-width
,min-height
,max-width
etmax-height
qu'ils pourraient également influer sur les dimensions de l' image.window.onload
, une hauteur / largeur de 0 peut être renvoyée. Dans tous les cas, j'ai intégré l'idée de FDisk dans la solution ci-dessus.load()
sera exécuté de manière asynchrone, donc si vous voulez y accéderwidth
etheight
- ils ne sont peut-être pas encore définis. Au lieu de cela, faites «la magie» enload()
soi!Utilisez les attributs
naturalHeight
etnaturalWidth
de HTML5 .Par exemple:
Fonctionne dans IE9 +, Chrome, Firefox, Safari et Opera ( statistiques ).
la source
Vous n'avez pas besoin de supprimer le style de l'image ou des attributs des dimensions de l'image. Créez simplement un élément avec javascript et obtenez la largeur de l'objet créé.
la source
Image
objet, puis regarde sawidth
propriété. Il s'agit d'une approche simple et élégante. FDisk, vous avez mon vote. :)window.onload
, une largeur de 0 peut être renvoyée.Le problème racine est que les navigateurs WebKit (Safari et Chrome) chargent les informations JavaScript et CSS en parallèle. Ainsi, JavaScript peut s'exécuter avant que les effets de style de CSS aient été calculés, renvoyant la mauvaise réponse. Dans jQuery, j'ai trouvé que la solution est d'attendre que document.readyState == 'complete', .eg,
En ce qui concerne la largeur et la hauteur ... selon ce que vous faites, vous voudrez peut-être offsetWidth et offsetHeight, qui incluent des éléments comme les bordures et le rembourrage.
la source
$(window).load(function(){ ... });
aidé dans mon casIl y a beaucoup de discussions dans la réponse acceptée à propos d'un problème où l'
onload
événement ne se déclenche pas si une image est chargée à partir du cache WebKit.Dans mon cas, les
onload
incendies pour les images mises en cache, mais la hauteur et la largeur sont toujours 0. Un simple asetTimeout
résolu le problème pour moi:Je ne peux pas expliquer pourquoi l'
onload
événement se déclenche même lorsque l'image est chargée à partir du cache (amélioration de jQuery 1.4 / 1.5?) - mais si vous rencontrez toujours ce problème, peut-être une combinaison de ma réponse et de lavar src = img.src; img.src = ""; img.src = src;
technique travail.(Notez que pour mes besoins, je ne suis pas préoccupé par les dimensions prédéfinies, que ce soit dans les attributs de l'image ou les styles CSS - mais vous voudrez peut-être les supprimer, selon la réponse de Xavi. Ou cloner l'image.)
la source
cela fonctionne pour moi (safari 3.2), en tirant de l'intérieur de l'
window.onload
événement:la source
Vous pouvez obtenir l'image par programme et vérifier les dimensions en utilisant Javascript sans avoir à jouer avec le DOM du tout.
la source
Qu'en est-
image.naturalHeight
il desimage.naturalWidth
propriétés?Semble fonctionner correctement sur plusieurs versions de Chrome, Safari et Firefox, mais pas du tout dans IE8 ou même IE9.
la source
Jquery a deux propriétés appelées naturalWidth et naturalHeight, que vous pouvez utiliser de cette façon.
Où my-img est un nom de classe utilisé pour sélectionner mon image.
la source
naturalWidth
(et la hauteur) sont des propriétés de l'objet élément image. developer.mozilla.org/en/docs/Web/API/HTMLImageElementComment obtenir les bonnes dimensions réelles sans une image réelle clignotante:
Cela fonctionne avec <img class = "toreaddimensions" ...
la source
Comme indiqué précédemment, la réponse Xavi ne fonctionnera pas si les images sont dans le cache. Le problème répond au webkit qui ne déclenche pas l'événement de chargement sur les images mises en cache, donc si les attrs de largeur / hauteur ne sont pas explicitement définis dans la balise img, le seul moyen fiable d'obtenir les images est d'attendre que l'
window.load
événement soit déclenché.L'
window.load
événement se déclenchera toujours , il est donc sûr d'accéder à la largeur / hauteur de et img après cela sans aucune astuce.Si vous devez obtenir la taille des images chargées dynamiquement qui pourraient être mises en cache (précédemment chargées), vous pouvez utiliser la méthode Xavi plus une chaîne de requête pour déclencher une actualisation du cache. L'inconvénient est qu'il provoquera une autre demande au serveur, pour un img qui est déjà mis en cache et devrait être déjà disponible. Stupide Webkit.
ps: si vous avez déjà une QueryString dans le
img.src
, vous devrez l' analyser et ajouter le paramètre supplémentaire pour vider le cache.la source
Comme le dit Luke Smith, la charge d'image est un gâchis . Ce n'est pas fiable sur tous les navigateurs. Ce fait m'a fait très mal. Une image mise en cache ne déclenchera pas l'événement du tout dans certains navigateurs, donc ceux qui ont dit "la charge de l'image est meilleure que setTimeout" ont tort.
La solution de Luke Smith est ici.
Et il y a une discussion intéressante sur la façon dont ce désordre pourrait être géré dans jQuery 1.4.
J'ai trouvé qu'il est assez fiable de définir la largeur à 0, puis d'attendre que la propriété "complete" se vérifie et que la propriété width soit supérieure à zéro. Vous devez également surveiller les erreurs.
la source
D'après le commentaire de Chris: http://api.jquery.com/load-event/
la source
Ma situation est probablement un peu différente. Je change dynamiquement le src d'une image via javascript et je devais m'assurer que la nouvelle image est dimensionnée proportionnellement pour s'adapter à un conteneur fixe (dans une galerie de photos). Au départ, je viens de supprimer les attributs de largeur et de hauteur de l'image après son chargement (via l'événement de chargement de l'image) et de les réinitialiser après avoir calculé les dimensions préférées. Cependant, cela ne fonctionne pas dans Safari et peut-être IE (je ne l'ai pas testé complètement dans IE, mais l'image ne s'affiche même pas, alors ...).
Quoi qu'il en soit, Safari conserve les dimensions de l'image précédente afin que les dimensions soient toujours une image derrière. Je suppose que cela a quelque chose à voir avec le cache. La solution la plus simple consiste donc à simplement cloner l'image et à l'ajouter au DOM (il est important qu'elle soit ajoutée au DOM pour obtenir le avec et la hauteur). Donnez à l'image une valeur de visibilité cachée (n'utilisez pas d'afficher aucune car cela ne fonctionnera pas). Après avoir obtenu les dimensions, supprimez le clone.
Voici mon code utilisant jQuery:
Cette solution fonctionne dans tous les cas.
la source
Il existe maintenant un plugin jQuery
event.special.load
, pour gérer les cas où l'événement de chargement sur une image en cache ne se déclenche pas: http://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.jsla source
Récemment, j'ai dû trouver la largeur et la hauteur pour définir la taille par défaut du .dialog représentant le graphique. La solution que j'utilise était:
Pour moi, cela fonctionne dans FF3, Opera 10, IE 8,7,6
PS Vous trouverez peut-être d'autres solutions en regardant dans certains plugins comme LightBox ou ColorBox
la source
Pour ajouter à la réponse de Xavi, le gitub de
Paul Irish deDavid Desandro propose une fonction appelée imagesLoaded () qui fonctionne sur les mêmes principes, et contourne le problème des images en cache de certains navigateurs qui ne déclenchent pas l'événement .load () (avec intelligent original_src -> data_uri -> commutation original_src).Il est largement utilisé et mis à jour régulièrement, ce qui en fait la solution la plus robuste au problème, l'OMI.
la source
imagesLoaded
fonction ici: github.com/desandro/imagesloadedCela fonctionne pour les images mises en cache et chargées dynamiquement.
Pour utiliser ce script:
Démo: http://jsfiddle.net/9543z/2/
la source
J'ai fait une fonction utilitaire de contournement, en utilisant le plugin jquery imagesLoaded: https://github.com/desandro/imagesloaded
Vous pouvez l'utiliser en passant l'url, la fonction et son contexte. La fonction est exécutée après que l'image est chargée et renvoie l'image créée, sa largeur et sa hauteur.
la source
Si l'image est déjà utilisée, vous devez:
définir les simulations d'image sur initial
image.css ('largeur', 'initiale'); image.css ('hauteur', 'initiale');
obtenir des dimensions
var originalWidth = $ (this) .width (); var originalHeight = $ (this) .height ();
la source
Vous pouvez utiliser les propriétés naturalWidth et naturalHeight de l'élément d'image HTML. (Voici plus d' informations ).
Vous l'utiliseriez comme ceci:
Il semble que cela fonctionne dans tous les navigateurs, sauf sur IE à partir de la version 8 et inférieure.
la source
J'ai vérifié la réponse de Dio et cela fonctionne très bien pour moi.
$('#image').fadeIn(10,function () {var tmpW = $(this).width(); var tmpH = $(this).height(); });
Assurez-vous d'appeler également toutes vos fonctions. qui gère avec la taille de l'image dans la fonction de rappel de fadeIn ().
Merci pour cela.
la source
J'utilise une approche différente, faites simplement un appel Ajax au serveur pour obtenir la taille de l'image lorsque l'objet image est en cours d'utilisation.
et bien sûr le code côté serveur:
la source
Cela fonctionne sur plusieurs navigateurs
obtenir les dimensions en utilisant
À votre santé!
la source
Une autre suggestion est d'utiliser le plugin imagesLoaded .
la source
// Ce code aide à montrer l'image avec 200 * 274 dimensions
la source
Voici une solution multi-navigateur qui déclenche un événement lorsque vos images sélectionnées sont chargées: http://desandro.github.io/imagesloaded/ vous pouvez rechercher la hauteur et la largeur dans la fonction imagesLoaded ().
la source
Je suis tombé sur ce fil en essayant de trouver une réponse à ma propre question. J'essayais d'obtenir la largeur / hauteur d'une image dans une fonction APRÈS le chargeur, et je n'arrêtais pas de trouver 0. J'ai l'impression que c'est peut-être ce que vous recherchez, car cela fonctionne pour moi:
la source
Découvrez ce référentiel dans github!
Excellent exemple pour vérifier la largeur et la hauteur à l'aide de Javascript
https://github.com/AzizAK/ImageRealSize
--- Modifié est demandé à partir de certains commentaires ..
Code Javascript:
et code HTML:
la source
Pour les fonctions où vous ne souhaitez pas modifier l'emplacement ou l'image d'origine.
la source