Đây là ví dụ sử dụng giải pháp tọa độ XY.
Working example on jsfiddle
Ví dụ có thể được cải thiện, nhưng là một điểm khởi đầu tốt.
Chỉ cần theo dõi vị trí chuột và kiểm tra xem nó có nằm trong bất kỳ hộp giới hạn nào của đối tượng có thể phân tách hay không. Do đó, nếu sự kiện mouseup kích hoạt trên bất kỳ một trong số chúng, đối tượng kéo sẽ bị loại bỏ. Bạn cũng có thể sử dụng tọa độ của đối tượng mà bạn đang kéo để phát hiện nếu nó nằm trên hộp có thể di chuyển được, nhưng nó đòi hỏi mã nhiều hơn một chút để tìm kiếm các thanh co hẹp và sử dụng chuột đủ cho tôi.
Mã sử dụng jQuery nhưng không có jQueryUI. Tôi đã thử nghiệm trong Chrome, Firefox và Opera, nhưng không phải là IE :)
Tôi cũng đang thêm mã vào đây nếu không thể truy cập jsfiddle.
HTML
<p>Drag orange boxes to grey ones</p>
<div class="droppable"></div>
<div class="droppable"></div>
<div class="droppable"></div>
<div class="droppable"></div>
<div class="draggable"></div>
<div class="draggable"></div>
<div class="draggable"></div>
CSS
.droppable {
width:50px;
height:50px;
float: left;
background-color: #DDD;
margin: 5px;
}
.draggable {
width:40px;
height:40px;
float: right;
background-color: #FC0;
margin: 5px;
cursor: pointer;
}
.dropped {
background-color: #FC0;
}
.somethingover {
background-color: #FCD;
}
JS
var dragged, mousex, mousey, coordinates = [];
var continueDragging = function(e) {
// Change the location of the draggable object
dragged.css({
"left": e.pageX - (dragged.width()/2),
"top": e.pageY - (dragged.height()/2)
});
// Check if we hit any boxes
for (var i in coordinates) {
if (mousex >= coordinates[i].left && mousex <= coordinates[i].right) {
if (mousey >= coordinates[i].top && mousey <= coordinates[i].bottom) {
// Yes, the mouse is on a droppable area
// Lets change the background color
coordinates[i].dom.addClass("somethingover");
}
} else {
// Nope, we did not hit any objects yet
coordinates[i].dom.removeClass("somethingover");
}
}
// Keep the last positions of the mouse coord.s
mousex = e.pageX;
mousey = e.pageY;
}
var endDragging = function(e) {
// Remove document event listeners
$(document).unbind("mousemove", continueDragging);
$(document).unbind("mouseup", endDragging);
// Check if we hit any boxes
for (var i in coordinates) {
if (mousex >= coordinates[i].left && mousex <= coordinates[i].right) {
if (mousey >= coordinates[i].top && mousey <= coordinates[i].bottom) {
// Yes, the mouse is on a droppable area
droptarget = coordinates[i].dom;
droptarget.removeClass("somethingover").addClass("dropped");
dragged.hide("fast", function() {
$(this).remove();
});
}
}
}
// Reset variables
mousex = 0;
mousey = 0;
dragged = null;
coordinates = [];
}
var startDragging = function(e) {
// Find coordinates of the droppable bounding boxes
$(".droppable").each(function() {
var lefttop = $(this).offset();
// and save them in a container for later access
coordinates.push({
dom: $(this),
left: lefttop.left,
top: lefttop.top,
right: lefttop.left + $(this).width(),
bottom: lefttop.top + $(this).height()
});
});
// When the mouse down event is received
if (e.type == "mousedown") {
dragged = $(this);
// Change the position of the draggable
dragged.css({
"left": e.pageX - (dragged.width()/2),
"top": e.pageY - (dragged.height()/2),
"position": "absolute"
});
// Bind the events for dragging and stopping
$(document).bind("mousemove", continueDragging);
$(document).bind("mouseup", endDragging);
}
}
// Start the dragging
$(".draggable").bind("mousedown", startDragging);
Bạn có đang sử dụng jQuery UI không? – Purag
Không, tôi đang sử dụng kéo được tạo tùy chỉnh – user969724
Nó sẽ giúp thấy mã đó. Hoặc đặt nó trong câu hỏi hoặc dán nó vào một [jsfiddle] (http://jsfiddle.net). – Purag