You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HTML5 Canvas中mouseup事件未触发问题排查求助

问题排查与修复

嘿,我一眼就看到你代码里的问题了!你的mouseup事件明明能触发,但执行到一半就报错了,所以看起来像是没触发一样。

具体来说,在mouseup的回调函数里,你直接写了logger.log("up " + mousePos.x + "," + mousePos.y);,但这个mousePos变量在这个函数的作用域里根本没定义啊!浏览器执行到这里会直接抛出ReferenceError,导致日志代码根本跑不起来。

另外还有个小细节:你的getMousePos函数里计算了缩放后的x和y,但最后return的却是未缩放的坐标(直接返回了mouseEvent.clientX - rect.left这类值),这个虽然不影响事件触发,但会导致你拿到的坐标不是canvas内部的真实坐标,我也一起帮你修正了。

修复后的完整代码

<!DOCTYPE html> 
<html> 
<head> 
<style type="text/css"> 
body {background: #eee;} 
</style> 
</head> 
<body> 
<div style="float:left;"> 
<canvas id="video-canvas" width=320 height=240 style="background:#000;"></canvas> 
</div> 
<pre align="left" id="log"></pre> 
<script> 
function Logger(id) {this.el = document.getElementById('log');} 
Logger.prototype.log = function(msg) { 
  var fragment = document.createDocumentFragment(); 
  fragment.appendChild(document.createTextNode(msg)); 
  fragment.appendChild(document.createElement('br')); 
  this.el.appendChild(fragment); 
}; 
Logger.prototype.clear = function() {this.el.textContent = '';}; 
var logger = new Logger('log'); 
</script> 
<script type="text/javascript"> 
var logelem = document.getElementById("log"); 
var canvas = document.getElementById('video-canvas'); 
function getMousePos(canvasDom, mouseEvent) { 
  var rect = canvasDom.getBoundingClientRect(); 
  var scaleX = canvas.width / rect.width; 
  var scaleY = canvas.height / rect.height; 
  // 返回适配canvas分辨率的坐标
  var x = (mouseEvent.clientX - rect.left)*scaleX; 
  var y = (mouseEvent.clientY - rect.top)*scaleY; 
  return { x: x, y: y }; 
} 
canvas.addEventListener("mousedown", function (e) { 
  var mousePos = getMousePos(canvas, e); 
  logger.log("down " + mousePos.x + "," + mousePos.y); 
}, false); 
canvas.addEventListener("mouseup", function (e) { 
  // 先获取鼠标位置变量,再使用
  var mousePos = getMousePos(canvas, e); 
  logger.log("up " + mousePos.x + "," + mousePos.y); 
}, false); 
canvas.addEventListener("mousemove", function (e) { 
  var mousePos = getMousePos(canvas, e); 
  logger.log("move " + mousePos.x + "," + mousePos.y); 
}, false); 
</script> 
</body> 
</html>

额外提醒

如果之后你还遇到mouseup不触发的情况,要考虑一种常见场景:当你按住鼠标拖动,把鼠标移出canvas区域后再松开,这时mouseup事件会触发在document上,而不是canvas本身。这种情况下,你可以把mouseup事件绑定到document对象上,确保无论鼠标在哪里松开都能捕获到事件。

内容的提问来源于stack exchange,提问作者lucky1928

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:22:43