убедившись, что я получаю событие мыши для каждой мыши вниз - PullRequest
3 голосов
/ 13 февраля 2012

Приведенный ниже код рисует прямоугольник при каждом движении мыши после нажатия кнопки мыши.Когда пользователь отпускает мышь, он должен перестать рисовать.

Я пытаюсь выяснить, как сделать так, чтобы рисование прекращалось, если пользователь отпускает мышь вне элемента canvas.

Я думал, чтоЯ мог бы сделать это, установив обработчик событий onmouseup для моего события внутри onmousedown следующим образом: canvas.onmousedown = function (e) { drawing = true; e.onmouseup = function (v) { drawing = false; } }; , но это не сработало, потому что e.onmouseup никогда не вызывается.Поэтому я в итоге установил window.onmouseup.

Вопросы:

  1. почему мой e.onmouseup никогда не вызывался?
  2. - это мое окончательное решение, лучший способсделать это?

<!DOCTYPE HTML> <html lang="en"> <head> <meta charset="utf-8" /> <script type="text/javascript"> drawing = false;<br> function on_load(e) { var canvas = document.getElementById("canvas");<br> canvas.onmousedown = function (e) { drawing = true; };<br> canvas.onmousemove = function (e) { if (drawing) { var x = e.pageX - canvas.offsetLeft; var y = e.pageY - canvas.offsetTop; var context = canvas.getContext("2d"); context.strokeRect(x, y, 10, 10); } };<br> window.onmouseup = function (e) { drawing = false; }; } </script> </head> <body onload="on_load()"> <canvas id="canvas" width="500" height="500" style="border: 1px solid black;"> </canvas> </body> </html>

Ответы [ 3 ]

1 голос
/ 13 февраля 2012
  1. Почему мой e.onmouseup никогда не вызывался?

e - это объект Event.У него нет определенного поведения для свойства onmouseup

2. Является ли мое окончательное решение лучшим способом сделать это?

Да, но с некоторымикорректировки.Во-первых, подумайте, нужна ли вам глобальная переменная.Тот же эффект может быть достигнут без глобальной переменной, но может быть полезно сохранить ее глобальной для целей отладки.

Во-вторых, ваш неработающий код не нужен.Лучше иметь один всегда существующий прослушиватель событий, который только изменяет безвредную переменную, чем создавать новый прослушиватель событий для каждого mouseup события.Кроме того, в вашем "требуемом" коде предыдущее событие mouseup никогда не удаляется явно.

 function on_load(e) {
    var drawing = false; // <-- Always declare variables
    var canvas = document.getElementById("canvas");
    canvas.onmousedown = function (e) { drawing = true; };
    canvas.onmousemove = function (e) {
      if (drawing) {
        var x = e.pageX - canvas.offsetLeft;
        var y = e.pageY - canvas.offsetTop;
        var context = canvas.getContext("2d");
        context.strokeRect(x, y, 10, 10);
      }
    };
    window.onmouseup = function (e) { drawing = false; };
}
0 голосов
/ 13 февраля 2012

Как ОС может гарантировать что-то вроде сбалансированной мыши вниз / вверх в каком-то виджете. Тогда, если вы работаете с ОС / браузером 'X', откуда вы знаете, что ОС / браузер 'i' или ОС / браузер 'W' будут работать одинаково? Есть много причин, почему вам нужно сделать что-то еще, например, даже таймер. Вероятно, накладные расходы таймера будут небольшими по сравнению с тем, что вы хотите сделать.

0 голосов
/ 13 февраля 2012

Возможно, вы захотите рассмотреть обработчик onmouseout, чтобы остановить рисование, когда мышь покидает ваш элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...