2013-05-14 2 views
5

Я пытаюсь «ПОЛУЧИТЬ» изображение из файла каждые 100 мс путем изменения источника объекта DOM. Я вижу, что вызов GET действительно возвращает правильное изображение каждые 100 мс, но отображение фактического изображения обновляется только один раз в секунду. Вот мой JavaScript код, который делает работу:DOM слишком долго реагирует

<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: Изменена функция использовать поджимать следующим образом:

<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> 

все еще обновляется с той же скоростью (что фактически каждые 5 секунд, а не 1s как указано первоначально). Поэтому для каждых 50 запросов на получение (10/сек за 5 секунд) элемент обновляется только один раз.

Другое важное замечание: это второе решение прекрасно работает на моем локальном хосте, где я сталкиваюсь с проблемой, когда я запускаю одну и ту же веб-страницу удаленного хоста.

+1

Перед отображением необходимо предварительно загрузить изображения. В противном случае, 1s - это время загрузки изображения. Вы можете использовать [эту функцию] (http://short-tag.info/2013/04/preload-images-with-plain-javascript/). – antoox

+19

После того, как вызывается 'videoDataPoll',' filename' является – undefined

+1

Ха-ха, комментарий гения. –

ответ

2

Я хотел бы предложить использовать обработчик OnLoad для изображения вместо фиксированного времени ожидания:

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

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

В этом случае вам нужно будет получить имя файла из внутри функции, а не передавая его как пары.

+0

Я пробовал ваше решение, и я согласен с тем, что он должен работать теоретически, но, к сожалению, без тайм-аута, VideoDataPoll просто выходит из-под контроля и Замораживает веб-страницу. – exxodus7

+0

@ exxodus7 вы все равно можете использовать таймаут, но вы должны действительно дождаться перегрузки перед запуском таймаута –

+0

Хорошая точка. Я попробовал оба вместе в своем обновлении для ответа, но он по-прежнему имел тот же эффект (как отмечено в обновлении, плохое бывает только при запуске на удаленном хосте). – exxodus7

Смежные вопросы