2016-03-21 60 views
0

这对我所有的测试都很有用,但在现场系统上,我遇到了问题。图像没有出现在画布上 - 有时

有三个独立但相同的画布。他们最初都是用640x480 jpg图像绘制的。第三个每秒更新一个新的640x480 jpg图像。

出于某种原因,第三个画布的原始静态图像(仅限该画布)不会从活动服务器加载,仅在测试中加载。

这里的HTML:

<div style="padding: 1vw;"> 
    <a href="/virtualscribe" class="camLink"> 
     <div class="camDiv"> 
      <div class="camBox" id="picBoxLeft"> 
       <canvas id="canvasLeft" class="camBorder"></canvas> 
      </div> 
     </div> 
    </a> 
    <a href="/videos" class="camLink"> 
     <div class="camDiv"> 
      <div class="camBox" id="picBoxCenter"> 
       <canvas id="canvasCenter" class="camBorder"></canvas> 
      </div> 
     </div> 
    </a> 
    <div class="camDiv"> 
     <div class="camBox" id="picBoxRight"> 
      <canvas id="canvasRight" class="camBorder"></canvas> 
     </div> 
    </div> 
</div> 

这里的CSS:

<style> 
    .camBox { 
     max-width: 28vw; 
     width: 28vw; 
     height: 21vw; 
     max-height: 21vw; 
     display: inline-block; 
    } 
    .camDiv { 
     padding: 1.5vw; 
     display: inline-block; 
    } 
    .camBorder { 
     border: 0.6vw solid #fe890f; 
     border-top-left-radius: 3.3vw; 
     border-bottom-right-radius: 3.3vw; 
    } 
    .camLink { 
     color: transparent; 
    } 
</style> 

而这里的JavaScript的:

var refreshTimer; 
    var imgLiveCam; 

    function drawPictureBox(img, canvas, text) { 
     var context = canvas.getContext("2d"); 
     context.drawImage(img, 0, 0, canvas.width, canvas.height); 
     context.globalAlpha = 0.6; 
     context.fillStyle = "rgb(244,121,32)"; 
     context.fillRect(0, canvas.height * 0.67, canvas.width, canvas.height * 0.33); 
     context.globalAlpha = 1; 
     var maxWidth = canvas.width; 
     var x = canvas.width/2; 
     var y = canvas.height * 0.85; 
     context.font = canvas.width/12 + 'px Oswald'; 
     context.strokeStyle = 'black'; 
     context.lineWidth = 2; 
     context.textAlign = "center"; 
     context.strokeText(text, x, y, maxWidth); 
     context.fillStyle = 'white'; 
     context.fillText(text, x, y, maxWidth); 
    }; 
    function drawCamBox(img, logo, canvas) { 
     var context = canvas.getContext("2d"); 
     context.drawImage(img, 0, 0, canvas.width, canvas.height); 
     context.globalAlpha = 0.6; 
     context.fillStyle = "rgb(244,121,32)"; 
     context.fillRect(0, canvas.height * 0.67, canvas.width, canvas.height * 0.33); 
     var eSize = canvas.height/10; 
     context.globalAlpha = 1; 
     context.drawImage(logo, 2, canvas.height * 0.67 - eSize, eSize, eSize); 
     var now = new Date(); 
     var text = now.toLocaleDateString() + " " + now.toLocaleTimeString(); 
     var maxWidth = canvas.width * 0.33; 
     var x = canvas.width - 10 - maxWidth; 
     var y = canvas.height * 0.67 - 10; 
     context.font = maxWidth/10 + "px Arial"; 
     context.strokeStyle = 'black'; 
     context.lineWidth = 2; 
     context.strokeText(text, x, y, maxWidth); 
     context.fillStyle = 'white'; 
     context.fillText(text, x, y, maxWidth); 
     text = 'View Our Production Floor'; 
     context.textAlign = "center"; 
     maxWidth = canvas.width; 
     x = canvas.width/2; 
     y = canvas.height * 0.85; 
     context.font = canvas.width/12 + 'px Oswald'; 
     context.strokeText(text, x, y, maxWidth); 
     context.fillText(text, x, y, maxWidth); 
    } 
    function addResizeListener(fn) { 
     if (window.attachEvent) { 
      window.attachEvent('onresize', fn) 
     } else if (window.addEventListener) { 
      window.addEventListener('resize', fn, true); 
     }; 
    } 
    function initCam() { 
     var imgLeft = new Image(); 
     imgLeft.onload = function() { 
      var canvas = document.getElementById("canvasLeft"); 
      var picBox = document.getElementById("picBoxLeft"); 
      var drawFn = function() { 
       canvas.height = picBox.clientHeight; 
       canvas.width = picBox.clientWidth; 
       drawPictureBox(imgLeft, canvas, 'Looking for a Scribe?'); 
      }; 
      drawFn(); 
      addResizeListener(drawFn); 
     } 
     var imgCenter = new Image(); 
     imgCenter.onload = function() { 
      var canvas = document.getElementById("canvasCenter"); 
      var picBox = document.getElementById("picBoxCenter"); 
      var drawFn = function() { 
       canvas.height = picBox.clientHeight; 
       canvas.width = picBox.clientWidth; 
       drawPictureBox(imgCenter, canvas, 'Watch In-Depth Videos'); 
      }; 
      drawFn(); 
      addResizeListener(drawFn); 
     } 
     imgLiveCam = new Image(); 
     var logo = new Image(); 
     logo.src = "e.png"; 
     imgLiveCam.onload = function() { 
      var canvas = document.getElementById("canvasRight"); 
      var picBox = document.getElementById("picBoxRight"); 
      var drawFn = function() { 
       canvas.height = picBox.clientHeight; 
       canvas.width = picBox.clientWidth; 
       drawCamBox(imgLiveCam, logo, canvas); 
      }; 
      drawFn(); 
      imgLiveCam.onload = drawFn; 
      addResizeListener(drawFn); 
     } 
     imgLeft.src = "scribe.jpg"; 
     imgCenter.src = "doc-with-spine.jpg"; 
     imgLiveCam.src = "camloading.jpg"; 
     refreshTimer = setTimeout(refresh, 499); 
    } 
    function refresh() { 
     clearTimeout(refreshTimer); 
     imgLiveCam.src = "http://cams.edataservices.com/17fcam.jpg?t=" + new Date().getTime(); 
     refreshTimer = setTimeout(refresh, 1009); 
    } 

任何想法,为什么第三帆布开出空白大部分时间?

+0

难道它总是一样的图片,不显示?每次加载页面时你是否从相同的图像开始?这听起来像一个或多个图像只是不在你试图得到的网址。 – ArchLicher

+0

我同意ArchLicher,尝试添加一个侦听器到'Image.onerror'来检查图像是否已经加载。顺便说一句,我不能看到刷新从任何地方调用,但超时,所以你不需要清除超时时间一旦它有时间 – Blindman67

+0

其实,是的,它始终是相同的图像。我正在尝试加载一个“默认”图像,该图像将在刷新后稍后加载更新图像(实时图像)时出现。 我最终在启动更新之前放了1500毫秒的延迟,现在它似乎一直工作。我认为更新请求在第一张图片加载之前即将发布,这使问题变得混乱。 –

回答

0

通过在开始刷新周期前添加更长的延迟时间,浏览器有更多时间加载初始“默认”图像。我把它设置在1500ms,现在它非常可靠。

(感谢您的帮助...)