2013-05-14 15 views
5

Próbuję "GET" obrazu z pliku co 100ms, zmieniając źródło obiektu DOM. Widzę, że wywołanie GET rzeczywiście zwraca poprawny obraz co 100ms, ale rzeczywisty obraz jest aktualizowany tylko raz na sekundę. Oto mój kod JavaScript, który działa:DOM zbyt długo reaguje

<img id="videoDisplay" style="width:800; height:600"/> 

<script type="text/javascript"> 
    function videoDataPoll(filename) { 
    setTimeout(function() { 
     document.getElementById("videoDisplay").src = filename + "?random="+(new Date()).getTime(); 
     videoDataPoll(filename); 
    }, 100); 
    } 
</script> 

UPDATE: Zmieniono funkcja używać wstępnego ładowania następująco:

<canvas id="videoDisplay" style="width:800; height:600"/> 

<script type="text/javascript"> 
    var x=0, y=0; 
    var canvas, context, img; 
    function videoDataPoll() { 
    var filename = getFilename(); 
    canvas = document.getElementById("videoDisplay"); 
    context = canvas.getContext("2d"); 
    img = new Image(); 
    img.onload = function() { 
     context.drawImage(img, x, y); 
     setTimeout("videoDataPoll()", 100); 
    } 
    img.src = filename + "?random=" + (new Date()).getTime(); 
    } 
<script> 

Wciąż aktualizuje przy tej samej prędkości (który jest rzeczywiście co 5 sekund, nie 1s jak pierwotnie stwierdzono). Tak więc na każde 50 żądań otrzymania (10/sek przez 5 sekund) element jest aktualizowany tylko raz.

Kolejna ważna uwaga: to drugie rozwiązanie działa idealnie na moim lokalnym hoście, gdzie napotkam problem, gdy uruchamiam tę samą stronę ze zdalnego hosta.

+1

Musisz wstępnie wczytać obrazy przed wyświetleniem. W przeciwnym razie 1s to czas ładowania obrazu. Możesz użyć [tej funkcji] (http://short-tag.info/2013/04/preload-images-with-plain-javascript/). – antoox

+19

Po pierwszym wywołaniu 'videoDataPoll', nazwa pliku' to – undefined

+1

Haha, komentarz geniuszu. –

Odpowiedz

2

Proponuję korzystać z obsługi onload dla obrazu zamiast ustalonego limitu czasu:

function videoDataPoll(filename) { 
     document.getElementById("videoDisplay").src = filename + "?random="+(new Date()).getTime(); 
    } 

    document.getElementById("videoDisplay").onload = videoDataPoll; 
    videoDataPoll(filename); 

w tym przypadku trzeba uzyskać nazwę pliku od wewnątrz funkcji zamiast przekazaniem go jako param.

+0

Próbowałem twojego rozwiązania, i zgadzam się, że to powinno działać w teorii, ale niestety bez timeouta videoDataPoll wydaje się wymykać spod kontroli i zawiesza stronę internetową. – exxodus7

+0

@ exxodus7 nadal można użyć limitu czasu, ale należy naprawdę poczekać na onload przed uruchomieniem timeout –

+0

Dobrze. Próbowałem obu razem w mojej aktualizacji do odpowiedzi, ale nadal miał taki sam efekt (jak wspomniano w aktualizacji, zła dzieje się tylko wtedy, gdy jestem uruchomiony na zdalnym hoście). – exxodus7

Powiązane problemy