mouseup () в mousedown () вызывается несколько раз - PullRequest
2 голосов
/ 21 ноября 2011
$("#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);
    });
});

Проблема, с которой я столкнулся, заключается в том, что после первого вызова функции (первый раз работает нормально и, как и ожидалось), функция mouseup вызывается несколько раз (то есть вместо нескольких предупреждений будет отображаться несколько предупреждений). первый). Есть ли способ предотвратить это или лучший способ кодировать это?

Спасибо

Ответы [ 6 ]

7 голосов
/ 21 ноября 2011

Ваш код присоединяет обработчик new 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);
});

Но лучшим решением было бы использование переменной состояния (и правильной области видимости):

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;
    }
});
4 голосов
/ 21 ноября 2011

потому что событие mouseup связывается каждый раз, когда срабатывает событие mousedown.
Вы можете просто добавить $("#canvas").unbind('mouseup'); в конце функции mouseup.

$("#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);
            $("#canvas").unbind('mouseup');
        });
});
2 голосов
/ 21 ноября 2011

Правильный код:

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

Вы переписываете мышку все время, когда вызываете mousedown.

EDIT

Извините, храните вещи там, где хотите:

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

    $(this).mouseup(function(e){
        var X2 = (e.pageX - this.offsetLeft) - 8;
        var Y2 = (e.pageY - this.offsetTop) - 8;
        alert(X1 + " " + X2 + " " Y1 + " " + Y2);
        $(this).unbind("mouseup");
    });
});
1 голос
/ 21 ноября 2011

Это потому, что вы регистрируете нового слушателя для mouseup каждый раз, когда запускается mousedown.Вы должны переместить код для mouseup вне функции mousedown.

С уважением
Tobias

0 голосов
/ 06 августа 2016
$(document).unbind('mouseup');
0 голосов
/ 21 ноября 2011

В итоге мы использовали комбинацию из нескольких разных ответов:

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

    $(this).mouseup(function(e){
        var X2 = (e.pageX - this.offsetLeft) - 8;
        var Y2 = (e.pageY - this.offsetTop) - 8;
        alert(X1 + " " + X2 + " " + Y1 + " " + Y2);
        $(this).unbind("mouseup");
    });
    $(this).unbind("mousedown);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...