Tworzę wtyczkę jQuery.
Jak uzyskać rzeczywistą szerokość i wysokość obrazu za pomocą Javascript w Safari?
Następujące działa z Firefox 3, IE7 i 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();
Ale w przeglądarkach Webkit, takich jak Safari i Google Chrome, wartości wynoszą 0.
javascript
jquery
safari
google-chrome
webkit
Frank Bannister
źródło
źródło
Odpowiedzi:
Przeglądarki Webkit ustawiają właściwość height i width po załadowaniu obrazu. Zamiast używać limitów czasu, zaleciłbym użycie zdarzenia ładowania obrazu. Oto szybki przykład:
Aby uniknąć jakiegokolwiek wpływu CSS na wymiary obrazu, powyższy kod tworzy kopię obrazu w pamięci. To bardzo sprytne rozwiązanie sugerowane przez FDisk .
Możesz także użyć atrybutów
naturalHeight
inaturalWidth
HTML5.źródło
width
iheight
was powinien prawdopodobnie również usunąćmin-width
,min-height
,max-width
imax-height
jak mogą one również wpływać na wymiary obrazu.window.onload
, może zostać zwrócona wysokość / szerokość równa 0. W każdym razie zintegrowałem pomysł FDisk z powyższym rozwiązaniem.load()
, że zostanie on wykonany asynchronicznie, więc jeśli chcesz uzyskać dostępwidth
iheight
- mogą nie zostać jeszcze ustawione. Zamiast tego rób „magię” wload()
sobie!Użyj atrybutów
naturalHeight
inaturalWidth
z HTML5 .Na przykład:
Działa w IE9 +, Chrome, Firefox, Safari i Opera ( statystyki ).
źródło
Nie musisz usuwać stylu z atrybutów obrazu lub wymiarów obrazu. Wystarczy utworzyć element za pomocą javascript i uzyskać utworzoną szerokość obiektu.
źródło
Image
obiektu, a następnie przyjrzenie się jegowidth
właściwości. To proste, eleganckie podejście. FDisk, masz mój głos. :)window.onload
, może zostać zwrócona szerokość 0.Problem polega na tym, że przeglądarki WebKit (Safari i Chrome) ładują równolegle informacje JavaScript i CSS. W związku z tym JavaScript może zostać wykonany przed obliczeniem efektów stylizacji CSS, zwracając złą odpowiedź. W jQuery odkryłem, że rozwiązaniem jest poczekać, aż document.readyState == 'complete', .eg,
Jeśli chodzi o szerokość i wysokość ... w zależności od tego, co robisz, możesz chcieć offsetWidth i offsetHeight, które obejmują między innymi obramowania i wypełnienie.
źródło
$(window).load(function(){ ... });
pomógł w moim przypadkuW przyjętej odpowiedzi jest wiele dyskusji na temat problemu, w którym
onload
zdarzenie nie uruchamia się, jeśli obraz zostanie załadowany z pamięci podręcznej WebKit.W moim przypadku
onload
pożary dla obrazów w pamięci podręcznej, ale wysokość i szerokość są nadal równe 0. ProstysetTimeout
problem rozwiązał dla mnie:Nie mogę powiedzieć, dlaczego
onload
zdarzenie się uruchamia, nawet jeśli obraz jest ładowany z pamięci podręcznej (poprawa jQuery 1.4 / 1.5?) - ale jeśli nadal występuje ten problem, być może połączenie mojej odpowiedzi ivar src = img.src; img.src = ""; img.src = src;
techniki praca.(Pamiętaj, że dla moich celów nie martwię się o wstępnie zdefiniowane wymiary, ani w atrybutach obrazu, ani w stylach CSS - ale możesz je usunąć zgodnie z odpowiedzią Xavi. Lub sklonować obraz.)
źródło
to działa dla mnie (safari 3.2), strzelając z poziomu
window.onload
wydarzenia:źródło
Możesz programowo uzyskać obraz i sprawdzić wymiary za pomocą Javascript bez konieczności w ogóle bałagania w DOM.
źródło
Co
image.naturalHeight
iimage.naturalWidth
właściwości?Wygląda na to, że dobrze działa z powrotem kilka wersji w Chrome, Safari i Firefox, ale wcale nie w IE8, a nawet IE9.
źródło
Jak uzyskać właściwe rzeczywiste wymiary bez rzeczywistego obrazu:
Działa z <img class = "toreaddimensions" ...
źródło
Jquery ma dwie właściwości o nazwie naturalWidth i naturalHeight, których można używać w ten sposób.
Gdzie my-img to nazwa klasy używana do wyboru mojego obrazu.
źródło
naturalWidth
(i wysokość) są właściwościami obiektu elementu obrazu. developer.mozilla.org/en/docs/Web/API/HTMLImageElementJak wspomniano wcześniej, odpowiedź Xavi nie będzie działać, jeśli obrazy znajdują się w pamięci podręcznej. Problem występuje w przypadku, gdy webkit nie uruchamia zdarzenia ładowania na buforowanych obrazach, więc jeśli atrybuty szerokość / wysokość nie są wyraźnie ustawione w znaczniku img, jedynym niezawodnym sposobem na uzyskanie obrazów jest oczekiwanie na uruchomienie
window.load
zdarzenia.window.load
Wydarzenie zadziała zawsze , więc jest to bezpieczne, aby uzyskać dostęp do szerokość / wysokość i img potem bez podstęp.Jeśli chcesz uzyskać rozmiar dynamicznie ładowanych obrazów, które mogą zostać zbuforowane (wcześniej załadowane), możesz użyć metody Xavi oraz ciągu zapytania, aby uruchomić odświeżanie pamięci podręcznej. Minusem jest to, że spowoduje kolejne żądanie do serwera, dla obrazu, który jest już buforowany i powinien być już dostępny. Głupi Webkit.
ps: jeśli masz już QueryString
img.src
, będziesz musiał go przeanalizować i dodać dodatkowy parametr, aby wyczyścić pamięć podręczną.źródło
Jak mówi Luke Smith, ładowanie obrazu to bałagan . Nie jest wiarygodny we wszystkich przeglądarkach. Ten fakt sprawił mi wielki ból. Obraz z pamięci podręcznej w ogóle nie uruchomi zdarzenia w niektórych przeglądarkach, więc ci, którzy powiedzieli „ładowanie obrazu jest lepsze niż setTimeout”, są w błędzie.
Rozwiązanie Luke'a Smitha jest tutaj.
I jest ciekawa dyskusja temat tego, jak poradzić sobie z tym bałaganem w jQuery 1.4.
Przekonałem się, że całkiem niezawodnie jest ustawić szerokość na 0, a następnie poczekać, aż właściwość „complete” się spełni, a właściwość width będzie większa niż zero. Powinieneś także uważać na błędy.
źródło
Z komentarza Chrisa: http://api.jquery.com/load-event/
źródło
Moja sytuacja jest prawdopodobnie trochę inna. Dynamicznie zmieniam src obrazu za pomocą javascript i potrzebuję upewnić się, że nowy obraz ma proporcjonalny rozmiar, aby zmieścił się w stałym kontenerze (w galerii zdjęć). Początkowo właśnie usunąłem atrybuty szerokości i wysokości obrazu po jego załadowaniu (poprzez zdarzenie ładowania obrazu) i zresetowałem je po obliczeniu preferowanych wymiarów. Jednak to nie działa w przeglądarce Safari i prawdopodobnie w IE (nie przetestowałem go dokładnie w IE, ale obraz nawet się nie pokazuje, więc ...).
W każdym razie Safari zachowuje wymiary poprzedniego obrazu, więc wymiary są zawsze o jeden obraz za nimi. Zakładam, że ma to coś wspólnego z pamięcią podręczną. Zatem najprostszym rozwiązaniem jest po prostu sklonowanie obrazu i dodanie go do DOM (ważne jest, aby dodać go do DOM, aby uzyskać i wysokość). Nadaj obrazowi wartość widoczności ukrytego (nie używaj display none, ponieważ nie będzie działać). Po uzyskaniu wymiarów usuń klon.
Oto mój kod za pomocą jQuery:
To rozwiązanie działa w każdym przypadku.
źródło
Teraz dostępna jest wtyczka jQuery
event.special.load
, która radzi sobie z przypadkami, w których zdarzenie load na zbuforowanym obrazie nie jest uruchamiane: http://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.jsźródło
Ostatnio musiałem znaleźć szerokość i wysokość do ustawienia domyślnego rozmiaru .dialog reprezentującego wykres. Rozwiązanie, z którego korzystałem to:
Dla mnie działa to w FF3, Opera 10, IE 8,7,6
PS Być może znajdziesz więcej rozwiązań, które sprawdzą się w niektórych wtyczkach, takich jak LightBox lub ColorBox
źródło
Aby dodać do odpowiedzi Xaviego, gitub
PaulaIrisha, David Desandro, gitgub oferuje funkcję o nazwie imagesLoaded () która działa na tych samych zasadach, i rozwiązuje problem niektórych obrazów w pamięci podręcznej przeglądarki, które nie uruchamiają zdarzenia .load () (ze sprytnym original_src -> data_uri -> przełączanie original_src).Jest szeroko stosowany i regularnie aktualizowany, co sprawia, że jest to najbardziej niezawodne rozwiązanie problemu, IMO.
źródło
imagesLoaded
funkcji można znaleźć tutaj: github.com/desandro/imagesloadedDziała to zarówno dla obrazów buforowanych, jak i dynamicznie ładowanych.
Aby użyć tego skryptu:
Demo: http://jsfiddle.net/9543z/2/
źródło
Zrobiłem pewne obejście funkcji narzędzia, używając wtyczki jQuery imageLoaded: https://github.com/desandro/imagesloaded
Możesz tego użyć, przekazując adres URL, funkcję i jej kontekst. Funkcja jest wykonywana po załadowaniu obrazu i zwróceniu utworzonego obrazu, jego szerokości i wysokości.
źródło
Jeśli obraz jest już używany, powinieneś:
ustaw symulacje obrazu na początkowe
image.css („szerokość”, „inicjał”); image.css („wysokość”, „inicjał”);
uzyskać wymiary
var originalWidth = $ (this) .width (); var originalHeight = $ (this) .height ();
źródło
Możesz użyć właściwości naturalWidth i naturalHeight elementu obrazu HTML. (Oto więcej informacji ).
Użyłbyś tego w ten sposób:
Wygląda na to, że działa to we wszystkich przeglądarkach oprócz IE od wersji 8 i niższych.
źródło
Sprawdziłem odpowiedź Dio i działa ona dla mnie świetnie.
$('#image').fadeIn(10,function () {var tmpW = $(this).width(); var tmpH = $(this).height(); });
Upewnij się, że wszystkie swoje funkcje nazywacie aso. obsługują rozmiar obrazu w funkcji przypominającej fadeIn ().
Dzięki za to.
źródło
Używam innego podejścia, po prostu wywołuję Ajax do serwera, aby uzyskać rozmiar obrazu, gdy obiekt obrazu jest w użyciu.
i oczywiście kod po stronie serwera:
źródło
Działa to w różnych przeglądarkach
uzyskaj wymiary za pomocą
Twoje zdrowie!
źródło
Inną sugestią jest użycie wtyczki imagesLoaded .
źródło
// Ten kod pomaga pokazać obraz o wymiarach 200 * 274
źródło
Oto rozwiązanie dla wielu przeglądarek, które wyzwala zdarzenie po załadowaniu wybranych obrazów: http://desandro.github.io/imagesloaded/ możesz sprawdzić wysokość i szerokość w funkcji imagesLoaded ().
źródło
Natknąłem się na ten wątek, próbując znaleźć odpowiedź na moje własne pytanie. Próbowałem uzyskać szerokość / wysokość obrazu w funkcji PO module ładującym i ciągle wymyśliłem 0. Czuję, że to może być to, czego szukasz, ponieważ to działa dla mnie:
źródło
Sprawdź to repozytorium w github!
Świetny przykład na sprawdzenie szerokości i wysokości za pomocą Javascript
https://github.com/AzizAK/ImageRealSize
--- Wymagane jest edytowanie niektórych komentarzy ..
Kod JavaScript:
i kod HTML:
źródło
Dla funkcji, w których nie chcesz zmieniać oryginalnego położenia ani obrazu.
źródło