2011-12-25 16 views
1

divには別のdivが含まれている「パネル」というdivがあります。ユーザーが「パネル」をクリック(およびマウスを押したまま)して左右にドラッグすると、内側のdivが左右にドラッグされます。ユーザーがクリックを解除すると、内部divのドラッグが停止されます。ほとんどの場合、これは問題なく動作します。マウスアップでDOM要素のドラッグを停止することができません

私が遭遇している問題は、ユーザーがドラッグしているときにマウスが「パネル」を離れるときです。ドラッグが継続されます。このような状況では、ユーザーがマウスボタンを離すと、マウスアップイベントが「パネル」の外で発生しているため、mouseupイベントにおそらく到達していないため、引き続きドラッグが継続されます。ここで

は、私が使用しているコードです:

$(document).ready(function() { 
    $('#panel').bind("mousedown", function (e) { 
        StartDrag();  // Code to drag inner panel goes here     
    }).bind("mouseup", function (e) { 
        StopDrag();  // Code to stop drag goes here 
    }).bind("mouseout", function (e) { 
        $(this).unbind("mousedown"); // This line doesn't help 
     StopDrag();   
    }); 
}); 

私は文書全体にStopDrag()関数をバインドする場合、それはstartDragを(と干渉する)。

どこで発生するかにかかわらず、マウスアップ時にStopDrag()関数をトリガーできるようにするにはどうすればよいですか?

答えて

0

最初に、パネルだけでなく、ドキュメント全体に応答するようにイベントハンドラを広げて、マウスがエスケープするのに十分に速く動いて、イベントがドキュメントに移動しても、それらを処理します。

ただし、マウスがウィンドウを完全に離れると問題は残ります。私は自分自身でこの問題に取り組んできましたが、解決策のないDOM APIで長年の問題であると判断しました。ボタンが押されている間にマウスがウィンドウを離れると、ボタンが離されたときにマウスを検出できなくなります。マウスがウィンドウに再び入ると、マウスボタンがまだダウンしているかどうかを調べる方法がありません。

0

mouseup()をドキュメントオブジェクトに添付します。文書のmouseupハンドラからmousedown()のバインドを解除します。それはそれを解決します。

+0

私はすでにそれを試しましたが、私はすべてのマウスアップでStopDragイベントを発生させるというアイデアは好きではありません。私のページはユーザーとのやりとりを促しており、よりよい解決策が必要であるようです。 StopDragイベントはDOMを操作し、頻繁に起動されるとパフォーマンスの問題が心配です。 –

関連する問題