2012-08-10 7 views
9

Próbuję sklonować obraz generowany losowo. Mimo że używam dokładnie tego samego adresu URL, inny obraz to obciążenie. (testowane w chrome i firefox)Wymuszenie buforowania obrazów za pomocą javascript

Nie mogę zmienić serwera obrazu, więc szukam czystego rozwiązania javascript/jQuery.

Jak zmusić przeglądarkę do ponownego użycia pierwszego obrazu?

Firefox: Firefox Demo

Chrome: Chrome Demo

Spróbuj to sam (być może trzeba przeładować go kilka razy, by go zobaczyć)

Kod: http://jsfiddle.net/TRUbK/

$("<img/>").attr('src', img_src) 
$("<div/>").css('background', background) 
$("#source").clone() 

Demo: http://jsfiddle.net/TRUbK/embedded/result/

+0

Pomijając przypadkowe problemy, jeśli uda się to sprawić, problem będzie występował natychmiast po rozpoczęciu pracy z danymi obrazu, ponieważ [obraz pochodzi z innej domeny] (http : //stackoverflow.com/questions/9972049/cross-origin-data-in-html5-canvas). Błąd spodziewany jest w specyfikacji: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#security-with-canvas-elements –

Odpowiedz

6

Nie można zmienić serwera obrazu, jeśli nie jest on twój, ale możesz z łatwością napisać coś na swoim serwerze, aby sobie z nim poradzić.

Pisać coś w swoim języku po stronie serwera z wyboru (PHP, ASP.NET, cokolwiek), że:

  1. Hits http://a.random-image.net/handler.aspx?username=chaosdragon&randomizername=goat&random=292.3402&fromrandomrandomizer=yes i pliki do pobrania niego. Generujesz klucz na jeden z dwóch sposobów. Zyskaj mieszankę (MD5 powinno być w porządku, nie jest to związane z bezpieczeństwem, więc obawia się, że jest za słabe, te dni nie mają zastosowania). Lub uzyskaj rozmiar obrazu - ten ostatni może mieć kilka duplikatów, ale jest szybszy do wytworzenia.
  2. Jeśli obraz nie jest jeszcze zapisany, zapisz go w lokalizacji, używając tego klucza jako części nazwy pliku, a typ zawartości jako inną część (w przypadku, gdy jest mieszanka plików JPEG i PNG).
  3. Odpowiedz na odpowiedź XML lub JSON z identyfikatorem URI dla następnego etapu.

W kodzie strony klienta trafia się ten URI przez XmlHttpRequest, aby uzyskać identyfikator URI do wykorzystania z obrazami. Jeśli chcesz nowy losowy, ponownie naciśnij ten pierwszy identyfikator URI, jeśli chcesz ten sam obraz dla dwóch lub więcej miejsc, użyj tego samego wyniku.

Ten identyfikator URI ma wartość podobną do http://yourserver/storedRandImage?id=XXX, gdzie XXX jest kluczem (hash lub rozmiar zgodnie z powyższą decyzją). Program obsługi wyszukuje zapisane kopie obrazów i wysyła plik w dół strumienia odpowiedzi z poprawnym typem zawartości.

To wszystko jest bardzo łatwe technicznie, ale możliwy problem jest legalny, ponieważ przechowujesz kopie obrazów na innym serwerze, możesz przestać być zgodny z warunkami umowy z usługą wysyłania losowych obrazy.

+0

To podejście jest sprytne, jednak nie rozwiązuje mojego problemu, sam obraz jest dostarczany przez usługę innej firmy i dołączony do biblioteki javascript i zależy od logowania (cookie). -image.net tylko w celach demonstracyjnych) – jantimon

+0

Tak jak w przypadku użytkownika aplikacji jest zalogowany do ich? Nie będzie działać na tym, nie :( –

+0

Ponieważ nie będzie działającego rozwiązania, tak jak miałem na myśli nagradzaj nagrodę za odpowiedź z największą liczbą głosów. Dzięki za twój wysiłek! – jantimon

1

Nagłówki wysyłane ze skryptu generatora obrazów losowych zawierają deklarację Cache-Control: max-age=0, która zasadniczo mówi przeglądarce, aby nie buforowała obrazu.

Musisz zmodyfikować skrypt/serwer generatora obrazów, aby wysyłać odpowiednie nagłówki buforowania, jeśli chcesz, aby wynik był buforowany.

Należy również upewnić się, że adres URL pozostaje taki sam (nie patrzyłem na ten aspekt, ponieważ przekazywano mnóstwo parametrów).

+0

Nie jestem w stanie zmienić nagłówki obrazów, ponieważ nie jestem właścicielem serwera obrazów. URL jest taki sam. – jantimon

+0

@Ghommey Cóż, prawdopodobnie nie masz opcji. To właśnie mówi przeglądarce, jak powinien on buforować element. –

+0

dlaczego działa po pierwszym klonie? – jantimon

0

Powiedz to, aby zatrzymać się losowo obraz, wydaje się działać tak, jak chcesz, kiedy dodać ten trzeci zastąpić połączenia:

// Get the canvas element. 
var background = ($("#test").css('background-image')), 
img_src = background.replace(/^.+\('?"?/, '').replace(/'?"?\).*$/, '').replace(/&fromrandomrandomizer=yes/,'') 
+0

Dzięki, ale podany adres URL jest tylko przykładem i chcę mieć losowe obrazy, więc niestety to podejście nie działa dla mnie. – jantimon

+0

Ale ja tylko usuwam losową część obrazu PODCZAS klonowania. Częścią tego procesu nie jest powiedzenie, że nie możesz używać przypadkowych obrazów. Tak więc po wygenerowaniu oryginalnego obrazu, nie otrzyma losowego obrazu podczas klonowania. – Dameo

+0

Sklonowany obraz powinien być taki sam jak poprzedni losowy obraz. – jantimon

0

try:

var myImg = new Image(); 
myImg.src = img_src; 

a następnie dołączyć "myImg" tam, gdzie chcesz:

$(document).append(myImg); 
+0

Dzięki, ale to nie działa. Załaduj ponownie następującą stronę kilka razy: http://jsfiddle.net/9ykXq/embedded/result/ – jantimon

1

Po pierwsze, możesz "wymuszać" wszystko w sieci. Jeśli chcesz wymusić pewne rzeczy, to tworzenie stron internetowych jest dla ciebie niewłaściwym medium.

Można spróbować użyć canvas element do skopiowania obrazu. Zobacz przykłady: https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Canvas_tutorial/Using_images.

+2

Proszę nie mów mi, co mogę i nie mogę wymusić! Cały czas używam sił w tworzeniu stron internetowych. Jeśli chcesz, mogę cię uczyć. –

+4

@ j-man86 Nic nie wymusiłeś. Właśnie zrobiłeś coś, co zadziałało we wszystkich testowanych przez ciebie scenariuszach (być może nawet celowo ignorując te, o których wiedziałeś, że nie będą działać). Wymień jedną rzecz, którą "wymusiłeś" i umiem nazwać scenariusz, w którym to nie zadziała (i tak, te scenariusze mogą być mało prawdopodobne, a nawet odebrane, ale to nie zmieni faktu, że twoje "forsowanie" nie zadziała, a zatem nie jest to "forsowanie"). – RoToRa

+0

Dzięki @RoToRa działa to dla firefox, ale nie dla chrome :( http://jsfiddle.net/VT8c5/ – jantimon

0

Zrobiłem to z skryptach Skrzypek i dostał ten sam obraz za każdym razem

#test { 
background:url(http://a.random-image.net.nyud.net/handler.aspx?username=chaosdragon&randomizername=goat&random=292.3402&fromrandomrandomizer=yes); 
width: 150px; 
height: 150px; 

}

zanotować .nyud.net po nazwie domeny.

1

Możesz spróbować zapisać reprezentację obrazu w base64.

Załaduj obrazek w ukrytym div/canvas, a następnie przekonwertuj go w base64. (Nie jestem pewien, czy płótno można ukryć, czy też można go przenieść za pomocą znacznika html4). Teraz możesz przechowywać "usztywniony" obraz w ciasteczku i używać go bez ograniczeń ...

1

wydaje się, że dwa obejścia:

  1. Jeśli pójdziesz metodą płótnie, czy można uzyskać obraz, aby załadować na samą płótnie, dzięki czemu można manipulować dane obrazu bezpośrednio zamiast tworzenia 2nd żądanie http obrazu. Możesz przesłać dane obrazu bezpośrednio na drugie płótno.
  2. Jeśli masz zamiar zbudować serwer proxy, możesz poprosić serwer proxy o usunięcie dyrektywy No-Cache, aby kolejne żądania przeglądarki używały pamięci podręcznej (tutaj nie ma gwarancji - zależy to od ustawień przeglądarki/użytkownika).
Powiązane problemy