click
を使用してdivを挿入し、そのdivにmousedown
を使用してドラッグするという特定のシナリオがあります。 click
を親コンテナにバインドし、mousedown
をdiv自体にバインドしました。しかし、divでmousedown
を実行すると、親でもクリックが発生するため、すでに追加されているdivをドラッグする代わりに複数のdivを挿入します。
この問題を解決する方法はありますか? click
を使用して2つのdivを追加し、それらにclick
をバインドする必要があるため、mousedown
をバインド解除できません。
更新:selector.on(event, handler)
タイプのバインディングを使用しています。
この方法を試してください。 event.stopPropagation
は、マウスダウン後のクリックイベントの発生を停止しません。マウスダウンイベントとクリックイベントは互いに関連していません。
var mousedownFired = false;
$("#id").on('mousedown', function(event) {
mousedownFired = true;
//code
});
$("#id").on('click', function(event) {
if (mousedownFired) {
mousedownFired = false;
return;
}
//code
});
更新:
マウスイベントは次のようにトリガーされます。
マウスダウン
クリック
マウスアップ
マウスダウンがトリガーされると、mousedownFired
変数はtrue
に設定されます。次に、クリックイベントでreturn
(つまり、クリックイベントの処理を続行しない)し、mousedownFired
変数がfalseにリセットされるため、今後のクリックイベントは通常どおり発生します。 2つのマウスダウンまたは2つのクリックイベントは考慮しません。
おそらく、個々の子divではなく、親コンテナーにイベントハンドラーをアタッチします。これにより、新しい子が作成されるときに、イベントハンドラーを追加する必要がありません。
例えば:
$("#parentDiv").on('click','.childDiv',function() {
event.stopPropagation();
}).on('mousedown','.childDiv',function() {
// your dragging code
});
.on()関数にセレクターを提供すると、渡された関数がそのセレクターに一致する子孫に対して呼び出されます。
Event.stopPropagation()を使用できます。
例:
$("#button").mousedown(function(event){
event.stopPropagation();
// your code here
});
$("#button").click(function(event){
event.stopPropagation();
// your code here
});
このページを見てください http://api.jquery.com/event.stopPropagation/
var timestamp = 0;
jQuery('ul.mwDraggableSelect a',element).mousedown(function(event){
timestamp = new Date().getTime();
});
jQuery('ul.mwDraggableSelect a',element).click(function(event){
var interval = 400;//if a mousedown/mouseup is longer then interval, dont process click
var timestamp2 = new Date().getTime();
if((timestamp2 - timestamp)>interval){ return false; }
/* your code here */
});