Estou criando um plugin jQuery.
Como obtenho a largura e a altura reais da imagem com Javascript no Safari?
O seguinte funciona com o Firefox 3, IE7 e 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();
Mas nos navegadores Webkit, como Safari e Google Chrome, os valores são 0.
javascript
jquery
safari
google-chrome
webkit
Frank Bannister
fonte
fonte
Respostas:
Os navegadores Webkit definem a propriedade height e width após o carregamento da imagem. Em vez de usar tempos limite, recomendo usar o evento onload de uma imagem. Aqui está um exemplo rápido:
Para evitar qualquer efeito que o CSS possa ter nas dimensões da imagem, o código acima faz uma cópia na memória da imagem. Esta é uma solução muito inteligente sugerida pelo FDisk .
Você também pode usar os atributos
naturalHeight
enaturalWidth
HTML5.fonte
width
eheight
você provavelmente deve também removermin-width
,min-height
,max-width
emax-height
como eles também poderiam influenciar as dimensões da imagem.window.onload
, uma altura / largura igual a 0 poderá ser retornada. De qualquer forma, integrei a ideia do FDisk na solução acima.load()
será executado de forma assíncrona, portanto, se você deseja acessarwidth
eheight
- eles ainda não foram definidos. Em vez disso, faça “a mágica” porload()
si só!Use os atributos
naturalHeight
enaturalWidth
do HTML5 .Por exemplo:
Funciona no IE9 +, Chrome, Firefox, Safari e Opera ( estatísticas ).
fonte
Você não precisa remover o estilo da imagem ou dos atributos das dimensões da imagem. Basta criar um elemento com javascript e obter a largura do objeto criado.
fonte
Image
objeto, depois analisando suawidth
propriedade. Essa é uma abordagem simples e elegante. FDisk, você tem meu voto. :)window.onload
, uma largura de 0 poderá ser retornada.O principal problema é que os navegadores WebKit (Safari e Chrome) carregam informações JavaScript e CSS em paralelo. Portanto, o JavaScript pode ser executado antes que os efeitos de estilo do CSS sejam calculados, retornando a resposta errada. No jQuery, descobri que a solução é esperar até document.readyState == 'complete', .eg,
Quanto à largura e altura, dependendo do que você está fazendo, você pode querer offsetWidth e offsetHeight, que incluem itens como bordas e preenchimento.
fonte
$(window).load(function(){ ... });
ajudou no meu casoHá muita discussão na resposta aceita sobre um problema em que o
onload
evento não é acionado se uma imagem é carregada do cache do WebKit.No meu caso, é
onload
acionado para imagens em cache, mas a altura e a largura ainda são 0. Um simplessetTimeout
resolveu o problema para mim:Não sei dizer por que o
onload
evento está sendo disparado, mesmo quando a imagem é carregada do cache (aprimoramento do jQuery 1.4 / 1.5?) - mas se você ainda estiver com esse problema, talvez uma combinação da minha resposta e davar src = img.src; img.src = ""; img.src = src;
técnica trabalhos.(Observe que, para meus propósitos, não estou preocupado com dimensões predefinidas, nem nos atributos da imagem nem nos estilos CSS - mas você pode removê-las, conforme resposta do Xavi. Ou clonar a imagem.)
fonte
isso funciona para mim (safari 3.2), disparando de dentro do
window.onload
evento:fonte
Você pode obter programaticamente a imagem e verificar as dimensões usando Javascript sem precisar mexer no DOM.
fonte
E sobre
image.naturalHeight
eimage.naturalWidth
propriedades?Parece funcionar bem em algumas versões no Chrome, Safari e Firefox, mas não no IE8 ou mesmo no IE9.
fonte
Como obtemos as dimensões reais corretas sem uma imagem real piscante:
Funciona com <img class = "toreaddimensions" ...
fonte
O Jquery possui duas propriedades chamadas naturalWidth e naturalHeight, que você pode usar dessa maneira.
Onde my-img é um nome de classe usado para selecionar minha imagem.
fonte
naturalWidth
(e altura) são propriedades no objeto de elemento de imagem. developer.mozilla.org/en/docs/Web/API/HTMLImageElementComo afirmado anteriormente, a resposta do Xavi não funcionará se as imagens estiverem no cache. O problema responde ao webkit que não dispara o evento load em imagens em cache; portanto, se os atributos width / height não estão definidos explicitamente na tag img, a única maneira confiável de obter as imagens é aguardar o disparo do evento
window.load
.O
window.load
evento será acionado sempre , por isso é seguro acessar a largura / altura e o img depois disso sem nenhum truque.Se você precisar obter o tamanho de imagens carregadas dinamicamente que podem ser armazenadas em cache (carregadas anteriormente), use o método Xavi mais uma sequência de consultas para acionar uma atualização de cache. A desvantagem é que isso causará outra solicitação ao servidor, para um img que já esteja em cache e já esteja disponível. Webkit estúpido.
ps: se você já tem um QueryString no
img.src
, precisará analisá-lo e adicionar o parâmetro extra para limpar o cache.fonte
Como diz Luke Smith, o carregamento da imagem é uma bagunça . Não é confiável em todos os navegadores. Esse fato me deu muita dor. Uma imagem em cache não dispara o evento em alguns navegadores; portanto, aqueles que disseram "carregar a imagem é melhor que setTimeout" estão errados.
A solução de Luke Smith está aqui.
E há uma discussão interessante sobre como essa bagunça pode ser tratada no jQuery 1.4.
Eu descobri que é bastante confiável definir a largura como 0 e aguarde a propriedade "complete" se tornar verdadeira e a propriedade width seja maior que zero. Você deve observar também os erros.
fonte
Do comentário de Chris: http://api.jquery.com/load-event/
fonte
Minha situação provavelmente é um pouco diferente. Estou alterando dinamicamente o src de uma imagem via javascript e necessário para garantir que a nova imagem seja dimensionada proporcionalmente para caber em um contêiner fixo (em uma galeria de fotos). Inicialmente, acabei de remover os atributos de largura e altura da imagem depois de carregada (por meio do evento de carregamento da imagem) e redefini-los depois de calcular as dimensões preferidas. No entanto, isso não funciona no Safari e possivelmente no IE (eu não testei completamente no IE, mas a imagem nem aparece, então ...).
De qualquer forma, o Safari mantém as dimensões da imagem anterior, para que as dimensões estejam sempre uma imagem atrás. Presumo que isso tenha algo a ver com o cache. Portanto, a solução mais simples é clonar a imagem e adicioná-la ao DOM (é importante que ela seja adicionada ao DOM para obter o with e height). Atribua à imagem um valor de visibilidade oculto (não use nenhum, pois não funcionará). Depois de obter as dimensões, remova o clone.
Aqui está o meu código usando jQuery:
Esta solução funciona em qualquer caso.
fonte
Agora existe um plugin jQuery
event.special.load
, para lidar com casos em que o evento load em uma imagem em cache não é acionado: http://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.jsfonte
Recentemente, precisei encontrar largura e altura para definir o tamanho padrão de .dialog representando o gráfico. A solução que eu uso foi:
Para mim, isso funciona em FF3, Opera 10, IE 8,7,6
PS Você pode encontrar mais algumas soluções procurando dentro de alguns plugins como LightBox ou ColorBox
fonte
Para adicionar à resposta de Xavi,
ogitubub dePaul Irish,David Desandro, oferece uma função chamada imagesLoaded () que funciona com os mesmos princípios e contorna o problema de as imagens em cache de alguns navegadores não dispararem o evento .load () (com inteligente original_src -> data_uri -> comutação original_src).É amplamente utilizado e atualizado regularmente, o que contribui para ser a solução mais robusta para o problema, a IMO.
fonte
imagesLoaded
função aqui: github.com/desandro/imagesloadedIsso funciona para imagens armazenadas em cache e carregadas dinamicamente.
Para usar este script:
Demonstração: http://jsfiddle.net/9543z/2/
fonte
Eu fiz alguma função do utilitário de solução alternativa, usando o plugin jquery imagesLoaded: https://github.com/desandro/imagesloaded
Você pode usar isso passando url, função e seu contexto. A função é executada depois que a imagem é carregada e retorna a imagem criada, sua largura e altura.
fonte
Se a imagem já estiver sendo usada, você deverá:
defina as simulações de imagem como inicial
image.css ('largura', 'inicial'); image.css ('altura', 'inicial');
obter dimensões
var originalWidth = $ (this) .width (); var originalHeight = $ (this) .height ();
fonte
Você pode usar as propriedades naturalWidth e naturalHeight do elemento de imagem HTML. (Aqui está mais informações ).
Você usaria assim:
Parece que isso funciona em todos os navegadores, exceto no IE da versão 8 e abaixo.
fonte
Eu verifiquei a resposta de Dio e funciona muito bem para mim.
$('#image').fadeIn(10,function () {var tmpW = $(this).width(); var tmpH = $(this).height(); });
Certifique-se de chamar todas as suas funções também. que lidam com o tamanho da imagem na função recorder de fadeIn ().
Obrigado por isso.
fonte
Eu uso uma abordagem diferente, basta fazer o Ajax chamar o servidor para obter o tamanho da imagem quando o objeto de imagem estiver em uso.
e, claro, código do lado do servidor:
fonte
Isso funciona em vários navegadores
obter as dimensões usando
Felicidades!
fonte
Outra sugestão é usar o plugin imagesLoaded .
fonte
// Este código ajuda a mostrar imagens com 200 * 274 dimensões
fonte
Aqui está uma solução entre navegadores que aciona um evento quando as imagens selecionadas são carregadas: http://desandro.github.io/imagesloaded/, você pode procurar a altura e a largura na função imagesLoaded ().
fonte
Tropecei nessa discussão tentando encontrar uma resposta para minha própria pergunta. Eu estava tentando obter a largura / altura de uma imagem em uma função APÓS o carregador e continuava com 0. Eu sinto que isso pode ser o que você está procurando, pois funciona para mim:
fonte
Confira este repositório no github!
Ótimo exemplo para verificar a largura e altura usando Javascript
https://github.com/AzizAK/ImageRealSize
--- Editado é solicitado a partir de alguns comentários.
Código Javascript:
e código HTML:
fonte
Para funções nas quais você não deseja alterar o posicionamento ou a imagem original.
fonte