1

可動 div がクリックされたかドラッグされたかを判断する必要があります。この問題には複数の解決策があることは知っていますが、プロジェクト全体の性質と使用しているスクリプトにより、他の方法を適用することはできません。これらはいくつかの jQuery メソッドに干渉するためです。

これは私のコードです:

$('.textFieldOuter').mousedown(function(e) {
    var oldMousePos = [e.pageX,e.pageY];
    fieldMouseDown(oldMousePos,$(this));
});

function fieldMouseDown(oldMousePos,field) {
    field.bind("mouseup",function(e) {
        var newMousePos = [e.pageX,e.pageY];
        console.log("oldMousePos: " + oldMousePos);
        console.log("newMousePos: " + newMousePos);
        if(oldMousePos == newMousePos) { console.log("Mouse did NOT move!") }
        else if(oldMousePos != newMousePos) { console.log("Mouse MOVED!") }
        $(this).unbind("mouseup");
    });
}

このコードが常に "Mouse MOVED!" をログに記録するのはなぜですか? 実際には、「マウスアップ」イベントの前にマウスがクリックされただけで動かされていないのですか? コンソールでは、変数「oldMousePos」と「newMousePos」がまったく同じ座標を格納していることがわかります。マウスがドラッグされていない場合でも、「Mouse MOVED!」です。が記録されます。どうしてこれなの?

4

1 に答える 1

2

ここでは 2 つの配列を比較していますが、配列はオブジェクトです。したがって、JavaScript では両方とも、両方のオペランドが実際に同じオブジェクトである場合にのみ戻り==ます。===true

ただし、ここでは 2 つの異なる配列があるため、そうではありません。1 つ目はハンドラーでoldMousePos作成され、 2 つ目は関数で作成されます。mousedownnewMousePosfieldMouseDown

それらを比較するには、各フィールドを個別に比較します。

if ( oldMousePos[0] === newMousePos[0] && oldMousePos[1] === newMousePos[1] ) {
  // ..
}

...または、各座標を個別のパラメーターとしてその関数に送信するだけです。

于 2013-06-09T18:42:06.980 に答える