Czy jest możliwe ponowne załadowanie obrazu o identycznej nazwie pliku z serwera za pomocą jQuery?
Na przykład mam obraz na stronie, jednak obraz fizyczny może się zmienić w zależności od działań użytkownika. Uwaga: nie oznacza to zmiany nazwy pliku, ale sam plik.
to znaczy:
- Użytkownik wyświetla obraz na stronie domyślnej
- Użytkownik przesyła nowy obraz
- Domyślny obraz na stronie nie zmienia się (zakładam, że wynika to z identyczności nazwy pliku, przeglądarka używa wersji buforowanej)
Ten sam problem występuje bez względu na to, jak często wywoływany jest poniższy kod.
$("#myimg").attr("src", "/myimg.jpg");
W dokumentacji jQuery funkcja „load” byłaby idealna, gdyby miała domyślną metodę odpalenia zdarzenia, w przeciwieństwie do powiązania funkcji zwrotnej z udanym / całkowitym załadowaniem elementu.
Każda pomoc jest mile widziana.
Odpowiedzi:
Wygląda na to, że przeglądarka buforuje obraz (co teraz zauważam, że napisałeś w swoim pytaniu). Możesz zmusić przeglądarkę do ponownego załadowania obrazu, przekazując dodatkową zmienną, taką jak:
źródło
random
, i nie powinien nigdy być zDate
chyba że jesteś naprawdę bardzo szybko. ; ^) Ustalenie daty na kliencie nie wymaga tak dużych zasobów, i możesz ponownie użyć tyle obrazów, ile potrzebujesz, aby pobrać jednocześnie, więc przejdź do kroku 4. Zysk.Prawdopodobnie nie jest to najlepszy sposób, ale w przeszłości rozwiązałem ten problem, po prostu dodając znacznik czasu do adresu URL obrazu za pomocą JavaScript:
Następnym razem, gdy się ładuje, znacznik czasu jest ustawiany na bieżącą godzinę, a adres URL jest inny, więc przeglądarka wykonuje GET dla obrazu zamiast używać wersji z pamięci podręcznej.
źródło
imagename.jpg?t=1234567&q=.jpg
lubimagename.jpg#t1234567.jpg
Może to być jeden z dwóch problemów, o których sam wspominasz.
Szczerze mówiąc, myślę, że to numer dwa. Byłoby o wiele łatwiej, gdybyśmy mogli zobaczyć więcej jQuery. Ale na początek spróbuj najpierw usunąć atrybut, a następnie ustaw go ponownie. Aby zobaczyć, czy to pomaga:
Nawet jeśli to działa, opublikuj kod, ponieważ nie jest to optymalne, imo :-)
źródło
z jednym wierszem bez obawy o zakodowanie na stałe obrazu src w javascript (dzięki jeerose za pomysły:
źródło
Aby ominąć buforowanie i uniknąć dodawania nieskończonych znaczników czasu do adresu URL obrazu, usuń poprzedni znacznik czasu przed dodaniem nowego, oto jak to zrobiłem.
źródło
To działa świetnie! jednak jeśli przeładujesz src wiele razy, znacznik czasu zostanie również połączony z adresem URL. Zmodyfikowałem zaakceptowaną odpowiedź, aby sobie z tym poradzić.
źródło
Czy próbowałeś zresetować html kontenerów obrazów. Oczywiście, jeśli buforuje to przeglądarka, to nie pomogłoby.
źródło
Czasami rozwiązanie takie jak -
też nie odświeżam src poprawnie, wypróbuj to, to zadziałało dla mnie ->
źródło
Przydatne może być użycie „#” jako separatora
Moje obrazy są przechowywane w „ukrytym” folderze powyżej „www”, aby tylko zalogowani użytkownicy mieli do nich dostęp. Z tego powodu nie mogę użyć zwykłego,
<img src=/somefolder/1023.jpg>
ale wysyłam żądania do serwera w podobny sposób,<img src=?1023>
a on odpowiada, wysyłając z powrotem obraz o nazwie „1023”.Aplikacja służy do kadrowania obrazu, więc po żądaniu ajax do przycięcia obrazu, zostaje zmieniona jako zawartość na serwerze, ale zachowuje swoją oryginalną nazwę. Aby zobaczyć wynik przycinania, po zakończeniu żądania ajax, pierwszy obraz jest usuwany z DOM i wstawiany jest nowy obraz o tej samej nazwie
<img src=?1023>
.Aby uniknąć wypłaty gotówki, dodaję do żądania tag „time” poprzedzony „#”, aby stał się podobny
<img src=?1023#1467294764124>
. Serwer automatycznie odfiltrowuje część skrótu żądania i odpowiada poprawnie, wysyłając z powrotem mój obraz zachowany jako „1023”. Dlatego zawsze otrzymuję ostatnią wersję obrazu bez większego dekodowania po stronie serwera.źródło
Być może będę musiał ponownie załadować źródło obrazu kilka razy. Znalazłem rozwiązanie z Lodash, które działa dobrze dla mnie:
Istniejący znacznik czasu zostanie obcięty i zastąpiony nowym.
źródło
Na podstawie odpowiedzi @kasper Taeymans.
Jeśli po prostu potrzebujesz przeładować obraz (nie zastępuj jego pliku src nowym smth), spróbuj:
źródło
}
źródło