DOM需要很长时间才能做出反应

时间:2013-05-14 13:43:23

标签: javascript jquery html image dom

我试图通过更改DOM对象的源来每隔100ms从文件中“获取”一个图像。我可以看到GET调用确实每隔100ms返回正确的图像,但实际的图像显示仅每秒更新一次。这是我执行工作的JavaScript代码:

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

更新:更改了使用预加载的功能,如下所示:

<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秒一次,而不是最初声明的1秒)。因此,对于每50次获取请求(10秒/秒,5秒),元素只会更新一次。

另一个重要注意事项:第二个解决方案在我的本地主机上完美运行,我遇到的问题是当我从远程主机运行相同的网页时。

1 个答案:

答案 0 :(得分:2)

我建议对图像使用onload处理程序而不是固定的超时:

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

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

在这种情况下,您需要从函数内部获取文件名,而不是将其作为参数传递。