【问题标题】:Canvas variable not updating when link is clicked单击链接时画布变量不更新
【发布时间】:2013-08-21 02:21:26
【问题描述】:

查看链接:http://jndgn.com/colortheory/bezold.html

单击导航中的“大条纹”链接时,我试图简单地更新其下方画布中彩色条纹的数量。变量“stripeNum”设置为 100,单击时应通过以下方式更改为 20:

$(function(){
  $("#stripes").on("click",function(e){
    e.preventDefault();

    if(stripeNum == 100) {
        stripeNum = 20;
    } else {
        stripeNum = 100;
    }       
  });
})

...但是单击时,不会发生任何操作。我是否需要让画布自行更新?这里有点 HTML5 菜鸟。提前感谢您的任何想法。

附上JSFiddle 以便于代码透明。

【问题讨论】:

    标签: javascript jquery html canvas refresh


    【解决方案1】:

    您需要重新绘制画布,并在执行此操作时将其清除。你可以简单地做这个调整,你会很好:

    首先,将你拥有的画布绘图包装在一个函数中:

    var contextFill = function() {
      context.clearRect(0, 0, canvas.width, canvas.height); // Clear on draw
      for (var i = 0; i < stripeNum + 1; i++) {
        context.beginPath();
        context.rect(0, i * canvas.height / stripeNum, canvas.width, canvas.height / (2 * stripeNum));
        context.fillStyle = randomColor;
        context.fill();
       }
    }
    

    然后,在文档准备好时致电contextFill()。我对上面的唯一添加是context.clearRect,用于清除画布。

    最后,在调用较大的条纹时也调用它,例如:

    ...
    if (stripeNum == 100) {
         stripeNum = 20;
    } else {
         stripeNum = 100;
    }    
    contextFill();
    

    如果您想在窗口调整大小时更新画布,您可以在窗口上观看resize 事件。缺点是它可能会发生多次,具体取决于用户调整大小的方式。您可以使用像lodash 这样的库来确保每N 毫秒只调用一次函数。例如:

    window.addEventListener('resize', _.debounce(function() {
         contextFill();
    }, 500));
    

    【讨论】:

    • 完美运行。我收到的最快、最简单、最直接的回复。非常感谢!干杯!
    • 我也一直无法找到在调整窗口大小时更新画布的正确方法。是否可以在调整窗口大小时调用contextFill()
    • @JohnDuggan 使用 vanilla JS,您可以添加一个事件监听器来调整窗口大小,如下所示:window.addEventListener('resize', function() { contextFill(); }) -- 这样做的缺点是它会发生太多次而不适合如果用户正在摆弄尺寸,则性能。最简单的解决方案是使用lodash 之类的实用程序带库并使用_.debounce。我已经用一个例子更新了我的答案
    • 在使用或不使用 lodash 的情况下实现调整大小功能似乎没有任何运气,直到我意识到 contextFill() 需要包含以下内容:canvas.width = window.innerWidth; canvas.height = window.innerHeight; 以便它想要填充空间。再次感谢您的帮助。
    • 啊,是的,很好!调整大小后收集最新的宽度/高度是有意义的。
    猜你喜欢
    • 1970-01-01
    • 2014-05-17
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 2012-02-06
    相关资源
    最近更新 更多