mousemove
イベントで不要なループが発生することは望ましくありません。だから私は、パフォーマンス/ベストプラクティスの観点から、_mousedown == true
_の間にのみmousemove
を実行するための最良の方法は何でしょうか?現在使用しているもの:
_var pressedMouse = false;
myObject.addEventListener("mousedown", function(e){
mouseDownFunction(e);
pressedMouse = true;
myObject.onmousemove = function(e) {
if(pressedMouse == true){
mouseMoveFunction(e);
}
}
});
myObject.addEventListener("mouseup", function(e){
pressedMouse = false;
});
_
pressedMouse
変数が原因で、mouseMoveFunction()
が呼び出されていません。 onmousemove
が使用されていない場合、mousedown
イベントの発生を防ぐことはできますか?
OnMouseMove-Functionをリスナーから削除することで、呼び出されないようにすることができます。
myObject.addEventListener("mousedown", function(e){
mouseDownFunction(e);
myObject.onmousemove = function(e) {
mouseMoveFunction(e);
}
});
myObject.addEventListener("mouseup", function(e){
myObject.onmousemove = null
});
イベントハンドラーを追加してから削除するので、場合によっては何度も何度も削除するので、最初にイベントオブジェクトを受け入れる準備ができているmouseMove関数を定義します。
function mouseMoveFunction(e) {
//stuff
}
これで、mousedownがアクティブになるたびに呼び出す新しい匿名関数を作成するのではなく、その関数への参照を追加するだけで済みます。さらに、その参照があるので、標準のadd/remove-EventListenerメソッドを使用することもできます。
myObject.addEventListener("mousedown", function(e){
mouseDownFunction(e);
this.addEventListener("mousemove", mouseMoveFunction);
});
myObject.addEventListener("mouseup", function(e){
this.removeEventListener("mousemove", mouseMoveFunction);
});
イベントオブジェクトには、マウスの移動中にどのボタンが押されたかを示す「which」というプロパティがあります。これを使用して、mousemove中に何らかの操作を行うかどうかを判別します。
myObject.addEventListener("mousedown", function(e){
myObject.onmousemove = function(e) {
if(pressedMouse == true){
mouseMoveFunction(e);
}
}
});
上記で行っていることは、ブラウザがマウスダウンイベントを検出するたびに、マウス移動用のイベントリスナーを追加することです。
これにより、パフォーマンスが低下する可能性があります。たとえば、マウスを1000回押した後、ブラウザがmousemoveイベントを1,000回追加するとします。
Mousemove用に別のイベントリスナーを作成します(1回)