ユーザーがリンクをクリックしたときに表示されることになるものです。
問題は、同じリンクをクリックしてドラッグし、再配置できることです。この場合、私は血栓を表示する必要はありません。実際にどこかへ行くのを待っている場合にのみ表示される必要があります。
どうすれば、jQueryを使用して、クリックアンドドラッグではなく、リンクへのクリックスルーの場合のみ、スロバーが表示されるようにするイベントリスナーを作成できますか?
ユーザーがリンクをクリックしたときに表示されることになるものです。
問題は、同じリンクをクリックしてドラッグし、再配置できることです。この場合、私は血栓を表示する必要はありません。実際にどこかへ行くのを待っている場合にのみ表示される必要があります。
どうすれば、jQueryを使用して、クリックアンドドラッグではなく、リンクへのクリックスルーの場合のみ、スロバーが表示されるようにするイベントリスナーを作成できますか?
回答:
mousedownで状態の設定を開始し、mousemoveイベントが発生した場合はそれを記録し、最後にmouseupでマウスが移動したかどうかを確認します。移動した場合は、ドラッグしています。動かなかったら、それはクリックです。
var isDragging = false;
$("a")
.mousedown(function() {
isDragging = false;
})
.mousemove(function() {
isDragging = true;
})
.mouseup(function() {
var wasDragging = isDragging;
isDragging = false;
if (!wasDragging) {
$("#throbble").toggle();
}
});
ここにデモがあります:http : //jsfiddle.net/W7tvD/1399/
mousemove
は、何もmouseup
動かなくても少なくとも1回は起動されることがわかったので、移動時に変数をインクリメントし、jsfiddle.net / W7tvD / 1649で特定のしきい値を確認するように変更しました 今、私にとって魅力のように機能します、ありがとう!
何らかの理由で、上記の解決策は私にとってはうまくいかなかった。私は次のように行きました:
$('#container').on('mousedown', function(e) {
$(this).data('p0', { x: e.pageX, y: e.pageY });
}).on('mouseup', function(e) {
var p0 = $(this).data('p0'),
p1 = { x: e.pageX, y: e.pageY },
d = Math.sqrt(Math.pow(p1.x - p0.x, 2) + Math.pow(p1.y - p0.y, 2));
if (d < 4) {
alert('clicked');
}
})
距離制限を好きなように微調整したり、ゼロまで調整したりできます。
sqrt
数百回やったとしても、遅くはなく、UXには影響しません。
jQuery UIでこれを行うだけです!
$( "#draggable" ).draggable({
start: function() {
},
drag: function() {
},
stop: function() {
}
});
$(".draggable")
.mousedown(function(e){
$(this).on("mousemove",function(e){
var p1 = { x: e.pageX, y: e.pageY };
var p0 = $(this).data("p0") || p1;
console.log("dragging from x:" + p0.x + " y:" + p0.y + "to x:" + p1.x + " y:" + p1.y);
$(this).data("p0", p1);
});
})
.mouseup(function(){
$(this).off("mousemove");
});
このソリューションでは、「オン」および「オフ」関数を使用して、バインド解除のマウスムーブイベントをバインドします(バインドおよびバインド解除は非推奨です)。2つのマウスムーブイベント間のマウスのxとyの位置の変化を検出することもできます。
承認された回答から分岐して、クリックが保留されてドラッグされているときにのみ実行されるようにしました。
マウスを押していなかったときに、機能が実行されていました。この機能も必要な場合の更新コードは次のとおりです。
var isDragging = false;
var mouseDown = false;
$('.test_area')
.mousedown(function() {
isDragging = false;
mouseDown = true;
})
.mousemove(function(e) {
isDragging = true;
if (isDragging === true && mouseDown === true) {
my_special_function(e);
}
})
.mouseup(function(e) {
var wasDragging = isDragging;
isDragging = false;
mouseDown = false;
if ( ! wasDragging ) {
my_special_function(e);
}
}
);
Simen Echholtの回答に基づくjQueryプラグイン。私はそれをシングルクリックと呼んだ。
/**
* jQuery plugin: Configure mouse click that is triggered only when no mouse move was detected in the action.
*
* @param callback
*/
jQuery.fn.singleclick = function(callback) {
return $(this).each(function() {
var singleClickIsDragging = false;
var element = $(this);
// Configure mouse down listener.
element.mousedown(function() {
$(window).mousemove(function() {
singleClickIsDragging = true;
$(window).unbind('mousemove');
});
});
// Configure mouse up listener.
element.mouseup(function(event) {
var wasDragging = singleClickIsDragging;
singleClickIsDragging = false;
$(window).unbind('mousemove');
if(wasDragging) {
return;
}
// Since no mouse move was detected then call callback function.
callback.call(element, event);
});
});
};
使用中で:
element.singleclick(function(event) {
alert('Single/simple click!');
});
^^
要素のdraggable属性をfalseに設定して、mouseupイベントをリッスンするときに副作用がないことを確認してください。
<div class="thing" draggable="false">text</div>
その後、jQueryを使用できます。
$(function() {
var pressed, pressX, pressY,
dragged,
offset = 3; // helps detect when the user really meant to drag
$(document)
.on('mousedown', '.thing', function(e) {
pressX = e.pageX;
pressY = e.pageY;
pressed = true;
})
.on('mousemove', '.thing', function(e) {
if (!pressed) return;
dragged = Math.abs(e.pageX - pressX) > offset ||
Math.abs(e.pageY - pressY) > offset;
})
.on('mouseup', function() {
dragged && console.log('Thing dragged');
pressed = dragged = false;
});
});
タイマーを設定する必要があります。タイマーがタイムアウトしたら、スローバーを開始してクリックを登録します。ドラッグが発生したら、タイマーをクリアして完了しないようにします。
jQueryUIを使用している場合-onDragイベントがあります。そうでない場合は、リスナーをclick()ではなくmouseup()にアタッチしてください。
// here is how you can detect dragging in all four directions
var isDragging = false;
$("some DOM element").mousedown(function(e) {
var previous_x_position = e.pageX;
var previous_y_position = e.pageY;
$(window).mousemove(function(event) {
isDragging = true;
var x_position = event.pageX;
var y_position = event.pageY;
if (previous_x_position < x_position) {
alert('moving right');
} else {
alert('moving left');
}
if (previous_y_position < y_position) {
alert('moving down');
} else {
alert('moving up');
}
$(window).unbind("mousemove");
});
}).mouseup(function() {
var wasDragging = isDragging;
isDragging = false;
$(window).unbind("mousemove");
});
常にマウスの位置を追跡し、左、右、上、下のドラッグを検出する機能が必要でした。クリックしてもトリガーされませんが、15px以上の移動が必要です
/**
* Check for drag when moved minimum 15px
* Same time keep track of mouse position while dragging
*/
// Variables to be accessed outside in other functions
var dragMouseX;
var dragMouseY;
var myDragging = false; // true or false
var dragDirectionX = false; // left or right
var dragDirectionY = false; // top or bottom
$(document).on("mousedown", function(e) {
// Reset some variables on mousedown
var lastDirectionCheck = e.timeStamp;
var dragStartX = e.pageX;
var dragStartY = e.pageY;
dragMouseX = e.pageX;
dragMouseY = e.pageY;
myDragging = false;
dragDirectionX = false;
dragDirectionY = false;
// On the move
$(document).on("mousemove", function(e) {
dragMouseX = e.pageX;
dragMouseY = e.pageY;
// Recalculate drag direction every 200ms in case user changes his mind
if (e.timeStamp > (lastDirectionCheck + 200)) {
dragStartX = dragMouseX;
dragStartY = dragMouseY;
lastDirectionCheck = e.timeStamp;
}
// Check for drag when moved minimum 15px in any direction
if (!myDragging && Math.abs(dragStartX - dragMouseX) > 15 || Math.abs(dragStartY - dragMouseY) > 15) {
myDragging = true;
}
if (myDragging) {
// Check drag direction X
if (dragStartX > dragMouseX) dragDirectionX = 'left';
if (dragStartX < dragMouseX) dragDirectionX = 'right';
// Check drag direction Y
if (dragStartY > dragMouseY) dragDirectionY = 'top';
if (dragStartY < dragMouseY) dragDirectionY = 'bottom';
// console.log(dragDirectionX + ' ' + dragDirectionY);
}
});
});
// Reset some variables again on mouseup
$(document).on("mouseup", function() {
$(document).off("mousemove");
myDragging = false;
dragDirectionX = false;
dragDirectionY = false;
});