Estoy creando un complemento jQuery.
¿Cómo obtengo el ancho y la altura de la imagen real con Javascript en Safari?
Lo siguiente funciona con Firefox 3, IE7 y 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();
Pero en los navegadores Webkit como Safari y Google Chrome los valores son 0.
javascript
jquery
safari
google-chrome
webkit
Frank Bannister
fuente
fuente
Respuestas:
Los navegadores Webkit establecen la propiedad de alto y ancho después de cargar la imagen. En lugar de usar tiempos de espera, recomiendo usar el evento de carga de una imagen. Aquí hay un ejemplo rápido:
Para evitar cualquiera de los efectos que CSS puede tener en las dimensiones de la imagen, el código anterior hace una copia en memoria de la imagen. Esta es una solución muy inteligente sugerida por FDisk .
También puede usar los atributos
naturalHeight
ynaturalWidth
HTML5.fuente
width
yheight
probablemente debería también eliminarmin-width
,min-height
,max-width
ymax-height
que también podrían influir en las dimensiones de imagen.window.onload
, se puede devolver un alto / ancho de 0. En cualquier caso, he integrado la idea de FDisk en la solución anterior.load()
se ejecutará de forma asincrónica, por lo que si desea accederwidth
yheight
, es posible que aún no se hayan configurado. En cambio, ¡haz "la magia" enload()
sí mismo!Use los atributos
naturalHeight
ynaturalWidth
de HTML5 .Por ejemplo:
Funciona en IE9 +, Chrome, Firefox, Safari y Opera ( estadísticas ).
fuente
No necesita eliminar el estilo de la imagen o los atributos de dimensiones de la imagen. Simplemente cree un elemento con javascript y obtenga el ancho del objeto creado.
fuente
Image
objeto y luego mirar suwidth
propiedad. Este es un enfoque simple y elegante. FDisk, tienes mi voto. :)window.onload
, se puede devolver un ancho de 0.El problema raíz es que los navegadores WebKit (Safari y Chrome) cargan información de JavaScript y CSS en paralelo. Por lo tanto, JavaScript puede ejecutarse antes de que se hayan calculado los efectos de estilo de CSS, devolviendo la respuesta incorrecta. En jQuery, descubrí que la solución es esperar hasta document.readyState == 'complete', .eg,
En cuanto al ancho y la altura ... dependiendo de lo que esté haciendo, es posible que desee offsetWidth y offsetHeight, que incluyen elementos como bordes y relleno.
fuente
$(window).load(function(){ ... });
ayudado en mi casoHay mucha discusión en la respuesta aceptada sobre un problema en el
onload
que el evento no se dispara si se carga una imagen desde el caché de WebKit.En mi caso, se
onload
activan las imágenes en caché, pero la altura y el ancho siguen siendo 0. Un simplesetTimeout
resolvió el problema por mí:No puedo decir por qué el
onload
evento se dispara incluso cuando la imagen se carga desde el caché (¿mejora de jQuery 1.4 / 1.5?), Pero si aún experimenta este problema, tal vez una combinación de mi respuesta y lavar src = img.src; img.src = ""; img.src = src;
técnica trabajo.(Tenga en cuenta que, para mis propósitos, no me preocupan las dimensiones predefinidas, ya sea en los atributos de la imagen o en los estilos CSS, pero es posible que desee eliminarlos, según la respuesta de Xavi. O clonar la imagen).
fuente
esto funciona para mí (safari 3.2), disparando desde dentro del
window.onload
evento:fuente
Puede obtener la imagen mediante programación y verificar las dimensiones usando Javascript sin tener que meterse con el DOM.
fuente
¿Qué pasa con
image.naturalHeight
yimage.naturalWidth
propiedades?Parece funcionar bien con algunas versiones en Chrome, Safari y Firefox, pero no en IE8 o incluso IE9.
fuente
Jquery tiene dos propiedades llamadas naturalWidth y naturalHeight, que puede usar de esta manera.
Donde my-img es un nombre de clase utilizado para seleccionar mi imagen.
fuente
naturalWidth
(y altura) son propiedades en el objeto del elemento de imagen. developer.mozilla.org/en/docs/Web/API/HTMLImageElementCómo obtenemos las dimensiones reales correctas sin una imagen real parpadeante:
Funciona con <img class = "toreaddimensions" ...
fuente
Como se indicó anteriormente, la respuesta de Xavi no funcionará si las imágenes están en el caché. El problema responde a que webkit no dispara el evento de carga en las imágenes en caché, por lo que si los atributos de ancho / alto no están establecidos explícitamente en la etiqueta img, la única forma confiable de obtener las imágenes es esperar a que se active el
window.load
evento.El
window.load
evento se disparará siempre , por lo que es seguro acceder al ancho / alto de e img después de eso sin ningún truco.Si necesita obtener el tamaño de las imágenes cargadas dinámicamente que podrían almacenarse en caché (previamente cargadas), puede usar el método Xavi más una cadena de consulta para activar una actualización de caché. La desventaja es que causará otra solicitud al servidor, para un img que ya está en caché y ya debería estar disponible. Estúpido Webkit.
ps: si ya tiene un QueryString en el
img.src
, tendrá que analizarlo y agregar el parámetro adicional para borrar el caché.fuente
Como dice Luke Smith, la carga de imágenes es un desastre . No es confiable en todos los navegadores. Este hecho me ha dado mucho dolor. Una imagen en caché no activará el evento en absoluto en algunos navegadores, por lo que aquellos que dijeron "cargar la imagen es mejor que setTimeout" están equivocados.
La solución de Luke Smith está aquí.
Y hay una discusión interesante sobre cómo se podría manejar este desastre en jQuery 1.4.
He descubierto que es bastante confiable establecer el ancho en 0, luego esperar a que la propiedad "completa" se haga realidad y la propiedad del ancho sea mayor que cero. También debes estar atento a los errores.
fuente
Del comentario de Chris: http://api.jquery.com/load-event/
fuente
Mi situación es probablemente un poco diferente. Estoy cambiando dinámicamente el src de una imagen a través de javascript y necesitaba asegurarme de que la nueva imagen tenga un tamaño proporcional para adaptarse a un contenedor fijo (en una galería de fotos). Inicialmente, eliminé los atributos de ancho y alto de la imagen después de cargarla (a través del evento de carga de la imagen) y los restablecí después de calcular las dimensiones preferidas. Sin embargo, eso no funciona en Safari y posiblemente en IE (no lo he probado completamente en IE, pero la imagen ni siquiera se muestra, así que ...).
De todos modos, Safari mantiene las dimensiones de la imagen anterior para que las dimensiones siempre estén una imagen atrás. Supongo que esto tiene algo que ver con el caché. Entonces, la solución más simple es simplemente clonar la imagen y agregarla al DOM (es importante que se agregue al DOM para obtener el con y la altura). Otorgue a la imagen un valor de visibilidad oculto (no use display none porque no funcionará). Después de obtener las dimensiones, elimine el clon.
Aquí está mi código usando jQuery:
Esta solución funciona en cualquier caso.
fuente
Ahora hay un complemento jQuery
event.special.load
, para tratar casos donde el evento de carga en una imagen en caché no se dispara: http://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.jsfuente
Recientemente necesitaba encontrar el ancho y la altura para configurar el tamaño predeterminado de .dialog que representa el gráfico. La solución que uso fue:
Para mí esto funciona en FF3, Opera 10, IE 8,7,6
PD: Puede encontrar algunas soluciones más buscando dentro de algunos complementos como LightBox o ColorBox
fuente
Para agregar a la respuesta de Xavi,
el gitub de Paul Irish,David Desandro, ofrece una función llamada imagesLoaded () que funciona con los mismos principios y evita el problema de que las imágenes en caché de algunos navegadores no activen el evento .load () (con inteligente original_src -> data_uri -> conmutación original_src).Es ampliamente utilizado y actualizado regularmente, lo que contribuye a que sea la solución más sólida para el problema, la OMI.
fuente
imagesLoaded
función aquí: github.com/desandro/imagesloadedEsto funciona para imágenes en caché y cargadas dinámicamente.
Para usar este script:
Demostración: http://jsfiddle.net/9543z/2/
fuente
He realizado alguna función de utilidad de solución alternativa, usando el complemento imagesqueaded jquery: https://github.com/desandro/imagesloaded
Puede usar esto pasando url, function y su contexto. La función se realiza después de cargar la imagen y devolver la imagen creada, su ancho y alto.
fuente
Si la imagen ya está en uso, debes sholud:
establecer simensiones de imagen a inicial
image.css ('ancho', 'inicial'); image.css ('altura', 'inicial');
obtener dimensiones
var originalWidth = $ (this) .width (); var originalHeight = $ (this) .height ();
fuente
Puede usar las propiedades naturalWidth y naturalHeight del elemento de imagen HTML. (Aquí hay más información ).
Lo usarías así:
Parece que esto funciona en todos los navegadores, excepto en IE desde la versión 8 y posteriores.
fuente
Revisé la respuesta de Dio y me funciona muy bien.
$('#image').fadeIn(10,function () {var tmpW = $(this).width(); var tmpH = $(this).height(); });
Asegúrate de llamar a todas tus funciones aso. que se maneja con el tamaño de la imagen en la función de recordatorio de fadeIn ().
Gracias por esto.
fuente
Utilizo un enfoque diferente, simplemente hago una llamada Ajax al servidor para obtener el tamaño de la imagen cuando el objeto de la imagen está en uso.
y, por supuesto, el código del lado del servidor:
fuente
Esto funciona entre navegadores
obtener las dimensiones usando
¡Salud!
fuente
Otra sugerencia es usar el complemento imagesLoaded .
fuente
// Este código ayuda a mostrar la imagen con 200 * 274 dimention
fuente
Aquí hay una solución de navegador cruzado que desencadena un evento cuando se cargan las imágenes seleccionadas: http://desandro.github.io/imagesloaded/ puede buscar el alto y el ancho dentro de la función imagesLoaded ().
fuente
Tropecé con este hilo tratando de encontrar una respuesta para mi propia pregunta. Intenté obtener el ancho / alto de una imagen en una función DESPUÉS del cargador, y seguí apareciendo 0. Sin embargo, creo que esto podría ser lo que estás buscando, ya que funciona para mí:
fuente
¡Mira este repositorio en github!
Gran ejemplo para verificar el ancho y la altura usando Javascript
https://github.com/AzizAK/ImageRealSize
--- Se solicita la edición de algunos comentarios.
Código Javascript:
y código HTML:
fuente
Para funciones en las que no desea alterar la ubicación o la imagen original.
fuente