जैसा कि आपने कहा था, over
(इसके समकक्ष out
की तरह) केवल एक बार छोड़ने योग्य पर उठाया जाता है। दूसरी ओर, खींचने योग्य की drag
घटना हर बार माउस चालें उठाया, और कार्य हेतु उपयुक्त लग रहा है। बहरहाल, इस रणनीति के साथ दो समस्याओं:
drag
उठाया है या नहीं, खींचने योग्य वास्तव में एक droppable पर स्थित है,
- भी उस स्थिति में, droppable ईवेंट हैंडलर तक नहीं पहुंचेगी।
$("tr.droppable").droppable({
over: function(event, ui) {
if (/* mouse is in top half of row */) {
$(this).removeClass("droppable-below")
.addClass("droppable-above");
}
else {
$(this).removeClass("droppable-above")
.addClass("droppable-below");
}
ui.draggable.data("current-droppable", $(this)); // Associate.
},
out: function(event, ui) {
ui.draggable.removeData("current-droppable"); // Break association.
$(this).removeClass("droppable-above droppable-below");
},
drop: function(event, ui) {
ui.draggable.removeData("current-droppable"); // Break association.
$(this).removeClass("droppable-above droppable-below");
if (/* mouse is in top half of row */) {
// Add new row above the dropped row.
}
else {
// Add new row below the dropped row.
}
}
});
अब जब कि: दोनों समस्याओं को हल करने
एक तरह से out
और drop
संचालकों में, droppable और over
हैंडलर में खींचने योग्य संबद्ध करने के लिए jQuery के data() सुविधा का उपयोग कर, और अलग उन्हें है खींचने योग्य droppable इस पर झूठ बोल रही है जानता है, हम एक drag
ईवेंट हैंडलर में तत्व की उपस्थिति को अद्यतन कर सकते हैं:
$(".draggable").draggable({
drag: function(event, ui) {
var $droppable = $(this).data("current-droppable");
if ($droppable) {
if (/* mouse is in top half of row */) {
$droppable.removeClass("droppable-below")
.addClass("droppable-above");
} else {
$droppable.removeClass("droppable-above")
.addClass("droppable-below");
}
}
}
});
जो कोड निम्नानुसार है वह एक साधारण परीक्षण केस है जो इस समाधान को प्रदर्शित करता है (यह मूल रूप से उपरोक्त टिप्पणी किए गए अंतराल को भरता है और सहायक पैटर्न में सामान्य पैटर्न को प्रतिबिंबित करता है)। ड्रॉपपॉबल सेटअप पिछले उदाहरण की तुलना में थोड़ा अधिक जटिल है, मुख्य रूप से क्योंकि नव निर्मित टेबल पंक्तियों को उनके भाई बहनों की तरह छोड़ने योग्य होना चाहिए।
आप परिणाम this fiddle में देख सकते हैं।
HTML:
<div class="draggable">New item 1</div>
<div class="draggable">New item 2</div>
<div class="draggable">New item 3</div>
<div class="draggable">New item 4</div>
<div class="draggable">New item 5</div>
<p>Drag the items above into the table below.</p>
<table>
<tr class="droppable"><td>Item 1</td></tr>
<tr class="droppable"><td>Item 2</td></tr>
<tr class="droppable"><td>Item 3</td></tr>
<tr class="droppable"><td>Item 4</td></tr>
<tr class="droppable"><td>Item 5</td></tr>
</table>
सीएसएस:
p {
line-height: 32px;
}
table {
width: 100%;
}
.draggable {
background-color: #d0ffff;
border: 1px solid black;
cursor: pointer;
padding: 6px;
}
.droppable {
background-color: #ffffd0;
border: 1px solid black;
}
.droppable td {
padding: 10px;
}
.droppable-above {
border-top: 3px solid blue;
}
.droppable-below {
border-bottom: 3px solid blue;
}
जावास्क्रिप्ट:
$(document).ready(function() {
$(".draggable").draggable({
helper: "clone",
drag: function(event, ui) {
var $droppable = $(this).data("current-droppable");
if ($droppable) {
updateHighlight(ui, $droppable);
}
}
});
initDroppable($(".droppable"));
function initDroppable($elements)
{
$elements.droppable({
over: function(event, ui) {
var $this = $(this);
updateHighlight(ui, $this);
ui.draggable.data("current-droppable", $this);
},
out: function(event, ui) {
cleanupHighlight(ui, $(this));
},
drop: function(event, ui) {
var $this = $(this);
cleanupHighlight(ui, $this);
var $new = $this.clone().children("td:first")
.html(ui.draggable.html()).end();
if (isInUpperHalf(ui, $this)) {
$new.insertBefore(this);
} else {
$new.insertAfter(this);
}
initDroppable($new);
}
});
}
function isInUpperHalf(ui, $droppable)
{
var $draggable = ui.draggable || ui.helper;
return (ui.offset.top + $draggable.outerHeight()/2
<= $droppable.offset().top + $droppable.outerHeight()/2);
}
function updateHighlight(ui, $droppable)
{
if (isInUpperHalf(ui, $droppable)) {
$droppable.removeClass("droppable-below")
.addClass("droppable-above");
} else {
$droppable.removeClass("droppable-above")
.addClass("droppable-below");
}
}
function cleanupHighlight(ui, $droppable)
{
ui.draggable.removeData("current-droppable");
$droppable.removeClass("droppable-above droppable-below");
}
});
क्या सीमा प्रतिक्रिया के बजाय क्रमबद्ध विकल्प है? यानी जब आप इसे खींचते हैं तो पंक्ति –
@ गैरी डालने के लिए जगह बनाने के लिए दिखाई देगा: सुझाव के लिए धन्यवाद, लेकिन मुझे नहीं लगता कि सॉर्टबेल मेरी मदद करेंगे। मेरी समस्या पंक्तियों को सॉर्ट करने की बजाय नई पंक्तियों को जोड़ने के लिए विशिष्ट है। मेरा यूआई वास्तव में उपयोगकर्ता को जोड़ने के बाद तालिका पंक्तियों को सॉर्ट करने की अनुमति देता है, और यह tableDnD jQuery प्लगइन का उपयोग करके किया जाता है। –