2010-09-21 8 views
6

Voglio ottenere l'altezza/larghezza di un'immagine all'interno di un div-containter nascosto, ma .height() e .width() restituiscono entrambi 0 (come previsto).Ottieni l'altezza dell'immagine all'interno di un div nascosto


$('body').append('<div id="init"><img id="myimg" src="someimage.png" /></div>'); 
$('#init').hide(); 
$('#myimg').height(); // == 0 
$('#myimg').width(); // == 0 

Come posso ottenere la corretta altezza/larghezza dell'immagine? Ho bisogno di prendere alcune decisioni :-)

Con i migliori saluti, Biggie

+2

Se leggete i commenti vedrai che @Yi Jiang dice che la sua risposta è errata. – egrunin

+0

Saresti così gentile da cambiare la tua risposta accettata (sì, puoi farlo) a quella di Robert, dal momento che ha ragione e io no. Grazie. –

risposta

9

sua perché l'immagine non ha ancora caricato .....

$('body').append('<div id="init"><img id="myimg" src="something.png" /></div>'); 
$('#init').hide(); 

$('#myimg').bind("load",function(){ 
    alert(this.height) //works 
})​ 

heres un test: http://jsfiddle.net/WMpSy/

+0

Funziona ma la spiegazione non è corretta. Ovviamente, l'immagine deve essere caricata prima, ma anche dopo che l'immagine è stata caricata se l'immagine si trova all'interno di un div nascosto, i metodi jQuery height() e width() restituiranno comunque 0. Questa soluzione funziona perché utilizza JavaScript elemento, non l'elemento jQuery - cioè questo.altezza invece di $ (this) .height(). Vedi la risposta di Samuel sotto per maggiori dettagli. –

1

Rendere il div temporaneamente visibile al fine di calcolare l'altezza o nascondere la div fuori dallo schermo, invece di utilizzare visualizzazione: Nessuno. Ho usato il primo approccio e ho trovato che fosse abbastanza veloce da non vedere mai l'elemento.

+1

Sì, e anche se è abbastanza lento da mostrare qualcosa come una posizione assoluta più un margine di -1000 dovrebbe nasconderlo durante il periodo in cui è visibile. –

4

Non è possibile nasconderlo se si desidera l'altezza e la larghezza corrette, ma è possibile impostare in modo che sia fuori dallo schermo e quindi effettivamente nascosto. Prova questo:

var hiddenDiv = $('<div id="init"><img id="myimg" src="someimage.png" /></div>').appendTo('body').css({ 
    'position': 'absolute', 
    'top': -9999 
}); 

var img = hiddenDiv.children('img'); 
img.height(); 
img.width(); 
+0

Come hai indicato sul mio post, Questo sta caricando un'immagine in cache, l'OP dovrebbe rivedere entrambe le risposte. – RobertPitt

+0

@Robert Ho eseguito il test - 'display: none' gli elementi hanno altezza - digitando' $ ('# answer-3761104'). Hide(). Height() 'indica l'altezza corretta - quindi questa risposta è completamente sbagliato. –

+0

Ho pensato che sarebbe stato giù per l'evento di caricamento dell'immagine. – RobertPitt

-7

sembra che è necessario calcolare la larghezza altezza & di un'immagine. se è così, ci stai pensando troppo.

+1

-1 A meno che non spieghi * perché *, o quali potrebbero essere le sue alternative, questo non è utile. – egrunin

+4

* Stai * pensando troppo a questo. – Stephen

0

si deve usare find()

$('body').find('#myimg').width(); 

o

$('body').find('#myimg').attr("width"); 

siccome si è aggiunto dopo il DOM è stato caricato

+5

Sbagliato, perché dovremmo trovare quando abbiamo un ID? – RobertPitt

+0

Ho avuto lo stesso problema e l'ho risolto utilizzando find(). –

0

Non sono sicuro che si può fare con jQuery (o javascript a tutti). Ho avuto un problema simile con altezze e larghezze riportate erroneamente sul caricamento/nascosto img. È possibile, tuttavia, aspettare che i carichi di immagini, ottenere è corretta altezza e la larghezza e poi nascondere il genitore ... in questo modo:

var height, width; 

$('#myimg').load(function() { 
    height = $(this).height(); 
    width = $(this).width(); 
    $('#init').hide(); 
} 
21

ho appena eseguito attraverso la soluzione per questo, ciò che si fa è invece che si basano su jQuery per fare questo per voi. Invece, ottenere l'elemento javascript e ottenere l'altezza fuori dell'elemento stesso, come segue:

var img = hiddenDiv.children('img'); 

var imgHeight = img.get(0).height; 
var imgWidth = img.get(0).width; 

Procedimento jQuery get(0) ci permette di ottenere in corrispondenza dell'elemento DOM sottostante e interessante abbastanza, le dimensioni dell'elemento DOM no modificare.

Una nota, tuttavia, per motivi di prestazioni, è necessario memorizzare nella cache lo img.get(0) se si prevede di utilizzarlo di più.

jQuery get method documentation

+2

Grazie. Questa è l'unica risposta che ha funzionato per me perché le immagini che stavo cercando di ottenere erano in un div nascosto dopo il caricamento completo. – Jerry

+1

"Abbastanza interessante" è corretto! Supponiamo che 'img' rappresenti un singolo elemento mirato ... non so perché img.height e img.get (0) .height restituiscono risultati diversi, ma sono lieto che esista la versione .get()! Grazie Samuel –

+3

Questa dovrebbe essere la risposta accettata. Aggiungere l'immagine e nasconderlo potrebbe funzionare, ma non è così pulito come questo metodo. – squarecandy

1

Ho avuto un problema simile. Il fatto è che se un'immagine o div contenente un'immagine ha style = "display: none" allora la sua altezza css = 0. Ho scoperto che le funzioni height() e width() davano valori errati, ad es. 0! La soluzione per me era assicurarsi che le immagini avessero i loro attributi impostati in modo che anche se fossero nascosti i valori fossero ancora accessibili.Quindi utilizzare:

$ ('# testImg'). Attr ('height') e $ ('# testImg'). Attr ('width') per ottenere l'altezza e la larghezza dell'immagine.

0

Sì, è perché l'immagine non è ancora caricato e questa è la mia soluzione:

$('<img src="My Image URL" />').appendTo('body').css({ 
       'position': 'absolute', 
       'top': -1 
      }).load(function() { 
       console.log('Image width: ' + $(this).width()); 
       console.log('Image height: ' + $(this).height()); 
       $(this).remove(); 
      }); 
Problemi correlati