Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当按下一个键时,尝试在画布中移动一个矩形,但它不起作用_Javascript_Jquery_Canvas_Html5 Canvas - Fatal编程技术网

Javascript 当按下一个键时,尝试在画布中移动一个矩形,但它不起作用

Javascript 当按下一个键时,尝试在画布中移动一个矩形,但它不起作用,javascript,jquery,canvas,html5-canvas,Javascript,Jquery,Canvas,Html5 Canvas,当按下W/A/S/D时,矩形将“移动”。但是什么也没发生,我不确定为什么。我试着用一个不同的名字来称呼“e”,当然没有什么区别。我一直在寻找拼写错误。不走运。我想你的代码中有atypo。您正在变量canvas中存储对画布的引用,但是无论您在哪里使用myCanvas,它都非常适合我。我在JSFIDLE中测试了它,当画布具有焦点时,它可以完美地工作 在重新绘制矩形之前,请记住使用clearCanvas()函数 编辑:更新了我的JSFIDLE,以便画布立即获得焦点。还添加了箭头键支持。您需要做的是:

当按下W/A/S/D时,矩形将“移动”。但是什么也没发生,我不确定为什么。我试着用一个不同的名字来称呼“e”,当然没有什么区别。我一直在寻找拼写错误。不走运。

我想你的代码中有atypo。您正在变量canvas中存储对画布的引用,但是无论您在哪里使用myCanvas,它都非常适合我。我在JSFIDLE中测试了它,当画布具有焦点时,它可以完美地工作

在重新绘制矩形之前,请记住使用
clearCanvas()
函数


编辑:更新了我的JSFIDLE,以便画布立即获得焦点。还添加了箭头键支持。

您需要做的是:

jQ:
$(文档).ready(函数(){
函数cool(){
$(“div”).animate({左:'500px'});
}
]);

我想这就是如何做到的。

Focus 我在@Spedwards jsfiddle中尝试了您的示例,在单击canvas元素后,它就工作了,因此@Spedwards指出,画布具有焦点是至关重要的

如果您想让键事件处理程序在不首先关注画布的情况下工作,可以尝试将其附加到某个父元素,例如文档窗口本身

$(document).ready(function() {
  var canvas = document.getElementById('myCanvas');
  canvas.addEventListener("keydown", doKeyDown, false);

  var context = myCanvas.getContext("2d");
  context.fillRect(100, 100, 50, 30);

  var canvasWidth = myCanvas.width;
  var canvasHeight = myCanvas.height;

  var x = 100;
  var y = 100;

  function doKeyDown(e) {       
    switch(e.keyCode) {
    case 87:
      y = y - 10;
      context.fillRect(x, y, 50, 30);
      break;
    case 83:
      y = y + 10;
      context.fillRect(x, y, 50, 30);   
      break;
    case 65:
      x = x - 10;
      context.fillRect(x, y, 50, 30);
  break;
    case 68:
      x = x + 10;
      context.fillRect(x, y, 50, 30);       
      break;
    }
  }

  function clearCanvas() {
    context.clearRect(0, 0, canvasWidth, canvasHeight);
  }

});
Canvas元素的两个引用 我从你的问题中学到了@Spedwards这个有趣的浏览器行为,这是我以前没有意识到的(或者同时忘记了:-)

14.7文档元素作为窗口属性

如果使用id属性命名HTML文档中的元素,并且 窗口对象没有该名称的属性,窗口对象为 给定一个名称为id属性值且 值是表示该文档元素的HtmleElement对象

[…]这意味着您在 HTML文档成为脚本可访问的全局变量

(摘自《JavaScript:权威指南》,大卫·弗拉纳根第六版)

这解释了为什么你的东西能用

正如@Acyut所指出的,您使用了两个JavaScript变量:“myCanvas”(通过引用中解释的带有id属性的Canvas HTML元素的HTML声明而变得生动)和“Canvas”变量,它是对同一画布的引用


我建议您坚持在代码中引用实例的一种方式,这是更好的样式。

您是否尝试过在画布上设置tabindex-例如
,或者将事件侦听器绑定到
文档.body
@mvw画布是用HTML创建的。
。不需要Javascript来实例化它。我忘记了tabindex="0"在我的canvas标记中。它现在可以使用。myCanvas是html中的的的id。我应该为canvas变量和canvas标记id使用相同的名称吗?不是这样做的。我们使用的是canvas,您刚刚发布的示例移动了一个div元素。很高兴我可以帮助您实现这一点。我实际上不知道canvas必须是foc也用过。我试过了,没用,不小心点击了画布使它聚焦,它神奇地工作了!
window.addEventListener("keydown", doKeyDown, false);