我正在尝试在javascript的画布上拖放卡片的图像,但是鼠标事件似乎不起作用,即使它在main()中。选择卡后,它会跟随鼠标移动,但是当我放开鼠标时它似乎不会松开。我也知道图像是在不清除屏幕的情况下重复的。
function main(){
var ctx = cvs.getContext("2d");
var img = new Image();
img.src = "allcards.png";
var imgX = 75;
var imgY = 75;
draw();
function draw(){
ctx.drawImage(img,0,0,97,129,imgX,imgY,100,100);
}
cvs.addEventListener("mouseup", function(ev){
greaterX = false;
lessX = false;
greaterY = false;
lessY = false;
}
);
cvs.addEventListener("mousedown", function(ev){
if(ev.clientX <= (imgX + 97)){
var greaterX = true;
}
if(ev.clientY <= (imgY + 129)){
var greaterY = true;
}
if(ev.clientX >= imgX){
var lessX = true;
}
if(ev.clientY >= imgY){
var lessY = true;
}
if(greaterX == true)
if(greaterY == true)
if(lessX == true)
if(lessY == true)
cvs.addEventListener("mousemove", function(ev){
var offsetX = (ev.clientX - imgX);
var offsetY = (ev.clientY - imgY);
imgX = imgX + offsetX;
imgY = imgY + offsetY;
draw();
});
});
};
答案 0 :(得分:3)
greaterX
,lessX
等都是在var
函数内部使用mousedown
定义的,这意味着它们的范围仅限于mousedown
函数。
因此,尝试将它们设置回false
函数内的mouseup
是没用的。您需要在函数的主要部分声明变量:
function main() {
var greaterX, lessX, greaterY, lessY;
var ctx = cvs.getContext("2D");
//etc...
现在,仅将greaterX
,lessX
等设置为false是不够的,因为mousemove
内的mousedown
事件检查器仍处于活动状态。当您应用事件侦听器时,它将保留在那里直到您将其删除。
因此,下一步是将mousemove
事件函数分离到它自己的函数中(我使用&#34; mouseMoveHandler&#34;作为名称)并使用{{删除事件侦听器3}} mouseup
内部。
mousemove
功能:
function mouseMoveHandler(ev) {
offsetX = (ev.clientX - imgX);
offsetY = (ev.clientY - imgY);
imgX = imgX + offsetX;
imgY = imgY + offsetY;
draw();
}
mousedown
功能(重要部分):
if (greaterX === true) { //you need the brackets for multi-line if statements
if (greaterY === true) {
if (lessX === true) {
if (lessY === true) {
cvs.addEventListener("mousemove",mouseMoveHandler,false);
}
}
}
}
最后,mouseup
函数:
cvs.addEventListener("mouseup", function(ev) {
greaterX = false;
lessX = false;
greaterY = false;
lessY = false;
cvs.removeEventListener('mousemove',mouseMoveHandler,false);
});
这里有一个.removeEventListener(type, listener, useCapture)
的解决方案,但没有使用你的图片。