多次调用mousedown()中的mouseup()

Sam*_*nch 2 javascript jquery mouseevent

$("#canvas").mousedown(function(e){
    var X1 = (e.pageX - this.offsetLeft) - 8;
    var Y1 = (e.pageY - this.offsetTop) - 8;
        
    $("#canvas").mouseup(function(e){
        var X2 = (e.pageX - this.offsetLeft) - 8;
        var Y2 = (e.pageY - this.offsetTop) - 8;
        alert(X1 + " " + X2 + " " Y1 + " " + Y2);
    });
});
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,在第一次调用函数后(第一次正常工作,并且正如预期的那样),mouseup函数似乎被多次调用(即显示多个警报而不是第一次) .有没有办法防止这种情况发生,或者更好的方法来编写代码?

谢谢

Ble*_*der 7

每次移动鼠标时,您的代码都会为元素附加一个新的 mouseup处理程序.用于仅将处理程序附加一次:#canvas.one()

$(this).one('mouseup', function(e){
    var X2 = (e.pageX - this.offsetLeft) - 8;
    var Y2 = (e.pageY - this.offsetTop) - 8;
    alert(X1 + " " + X2 + " " Y1 + " " + Y2);
});
Run Code Online (Sandbox Code Playgroud)

但更好的解决方案是使用状态变量(和适当的范围):

var clicked = false;
var X1, Y1, X2, Y2;

$("#canvas").mousedown(function(e){
    X1 = (e.pageX - this.offsetLeft) - 8;
    Y1 = (e.pageY - this.offsetTop) - 8;

    clicked = true;
});


$("#canvas").mouseup(function(e){
    if (clicked) {
        X2 = (e.pageX - this.offsetLeft) - 8;
        Y2 = (e.pageY - this.offsetTop) - 8;
        alert(X1 + " " + X2 + " " Y1 + " " + Y2);

        clicked = false;
    }
});
Run Code Online (Sandbox Code Playgroud)