我有2张桌子, 左边的一个是空的,应该可以排序, 正确的一个作为来源,不应该是可排序的,我希望这些条目总是按字母数字排序。
该函数现在应该是:将项目从源表移动到空表中(然后它们从源表中消失),并在“空”表中对它们进行排序。
如果您不再需要它们,则将项目移回源表中,因此它们会再次出现在源表中,但源表始终按字母数字排序。
到目前为止,我最好的尝试是使用connectWith选项,因为我可以在两个表之间移动项目,但是如何防止源表可以排序?
修改
我可以接近我需要的东西,但是有一个问题我找不到解决方案。
到目前为止,我可以对列表1进行排序, 我可以将可拖动的项目从list2移动到list1并对它们进行排序,它们会在列表2中消失, 我可以将list1中的项目移到list2上并删除它们,它们会从list1中删除。
但是如果我将list2中的draggable-item悬停在list1上并让它回退到list2(可能是错误的项目或其他),然后在list1中移动sortable-item(甚至到同一个地方),然后这将从list2中删除该draggable-item,尽管可排序list1没有“收到”。
那我怎么能阻止这个呢?只有掉入可排序列表1的项目才能从可拖动列表2中删除。
http://jsbin.com/yafakuje/14/edit
HTML:
<h2>#sortable</h2>
<ul id="sortable">
<li id="no_1" class="ui-state-default da">Item 1</li>
<li id="no_2" class="ui-state-default da">Item 2</li>
<li id="no_3" class="ui-state-default da">Item 3</li>
<li id="no_4" class="ui-state-default da">Item 4</li>
<li id="no_5" class="ui-state-default da">Item 5</li>
</ul>
<h2>#draggable</h2>
<ul id="draggable">
<li id="no_6" class="ui-state-default dr">Item 6</li>
<li id="no_7" class="ui-state-default dr">Item 7</li>
<li id="no_8" class="ui-state-default dr">Item 8</li>
<li id="no_9" class="ui-state-default dr">Item 9</li>
<li id="no_10" class="ui-state-default dr">Item 10</li>
</ul>
JS
$( "#sortable" ).sortable({
receive: function( event, ui ) {
$(ui.item).remove();
},
over: function( event, ui ) {
$(ui.helper).css('cursor',"move");
},
stop: function( event, ui ) {
$(ui.item).css('cursor','auto');
},
out: function( event, ui ){
$(ui.helper).css('cursor','no-drop');
},
update: function () {
var order = $('#sortable').sortable('serialize');
//order later on send to the server via jquery-ajax $post
alert(order);
}
}).disableSelection();
$( ".dr" ).draggable({
connectToSortable: "#sortable",
helper: "clone",
start: function( event, ui ){
$(ui.helper).css('cursor','no-drop');
}
}).disableSelection();
$( "#draggable" ).droppable({
accept: ".da",
drop: function(event,ui) {
$(ui.draggable).remove();
},
over: function( event, ui ) {
$(ui.helper).css('cursor',"alias");
},
out: function( event, ui ){
$(ui.helper).css('cursor','no-drop');
}
});
EDIT2:
对于那些喜欢有一些工作代码而不是硬可读语法的业余爱好者来说,这里是我的一些代码。这是一种解决方案,可能还有其他更好的方法,但它对我有用。
代码调用弹出窗口,弹出窗口中是可排序和可拖动的列表。每次移动或拖动某些内容时我都会刷新完全弹出,因此所有弹出代码都在我的ajax.php中,并且它会递归调用自身。 从表字段调用弹出窗口,确保有多行,每行都有自己的id,可以将正确的数据调用到弹出窗口中。
php / html包含表格和弹出模板
<table>
<tbody>
<tr dataID="'.$row['id'].'">
<td></td>
<td class="call_popup"> some data </td>';
</tr>
</tbody>
</table>
<div id="popup">
<div class="background"></div>
<div class="popup">
</div>
</div>
JS(调用弹出窗口)
jQuery(function($) {
$(document).ajaxError(function(event, jqxhr, settings, exception){
alert("An error occurred! Unable to get/set data!\nError: "+exception);
});
$(".call_popup").click(function() {
var ID = $(this).parent("tr").attr('dataID');
$.post("ajax.php",{action:'getpopup',id:ID},
function(popup_content){
$("#popup").children("div.popup").html(popup_content);
$("#content").css("overflow","hidden");
$("#popup").children(".popup").fadeIn(700);
$("#popup").children(".background").css("opacity", "0.7");
$("#popup").children(".background").fadeIn(700);
}
);
});
$(".background").click(function() {
$(this).fadeOut(600);
$(".popup").fadeOut(600);
$("#content").css("overflow","auto");
});
});
ajax.php从/向服务器获取/设置数据并创建带有可排序/可拖动列表的弹出窗口
<?php
session_start();
if (isset($_SESSION['user']) && $_SESSION['user']=='admin')
{
require_once("sql_database.php");
$action = $_POST['action'];
$data = @$_POST['data'];
$id = $_POST['id'];
if ($action=='setsomething') {
//some code
} elseif ($action=='setothersomething') {
//some code
} elseif ($action=='setpopup') {
parse_str($data,$part_data);
mysql_query("DELETE FROM table WHERE id = '$id'") or die(header('HTTP/1.1 503'));
$i=0;
if (!empty($part_data)) {
foreach($part_data['no'] as $part_data_id ) {
$i++;
mysql_query("INSERT INTO table SET
id = '".mysql_real_escape_string($id)."',
sequence = '$i',
data_id = '".mysql_real_escape_string($part_data_id)."'
") or die(header('HTTP/1.1 503'));
}
}
} elseif ($action=='getsomething') {
//some code
} elseif ($action=='getothersomething') {
//some code
} elseif ($action=='getpopup') {
$result_sortable = mysql_query("SELECT data_id,data_name FROM table
WHERE id = $id
ORDER BY sequence ") or die(header('HTTP/1.1 503'));
$result_draggable = mysql_query("SELECT data_id,data_name FROM table
") or die(header('HTTP/1.1 503'));
header('HTTP/1.1 200 server');
echo '
<div id="left">
<ol id="sortable">';
while ($data = mysql_fetch_assoc($result_sortable)) {
echo '
<li pos="no_'.$data['data_id'].'" class="da">'.$data['data_name'].'</li>
';
}
echo '
</ol>
</div>
<div id="right">
<ul id="draggable">';
while ($data = mysql_fetch_assoc($result_draggable)) {
echo '
<li pos="no_'.$data['data_id'].'" class="dr">'.$data['data_name'].'</li>
';
}
echo '</ul>
</div>';
echo '
<script>
$("#sortable").sortable({
receive: function(event,ui) {
//$(ui.item).remove();
},
over: function(event,ui) {
$(ui.helper).css("cursor","move");
},
stop: function(event,ui) {
$(ui.item).css("cursor","auto");
},
out: function(event,ui) {
$(ui.helper).css("cursor","no-drop");
},
update: function() {
var order = $("#sortable").sortable("serialize",{attribute:"pos"});
var scrollPosition = $("#right").scrollTop();
$.post("ajax.php",{action:"setpopup",data:order,id:'.$id.'},
function() {
$.post("ajax.php",{action:"getpopup",id:'.$id.'},
function(popup_content){
$("#popup").children("div.popup").html(popup_content);
$("#right").scrollTop(scrollPosition);
}
);
}
);
}
}).disableSelection();
$(".dr").draggable({
connectToSortable: "#sortable",
helper: "clone",
start: function(event,ui){
$(ui.helper).css("cursor","no-drop");
}
}).disableSelection();
$("#draggable").droppable({
accept: ".da",
drop: function(event,ui) {
$(ui.draggable).remove();
},
over: function(event,ui) {
$(ui.helper).css("cursor","alias");
},
out: function(event,ui) {
$(ui.helper).css("cursor","no-drop");
}
});
</script>';
die;
}
header('HTTP/1.1 200 server');
header('Content-Type: application/json');
$array = array('success' => true);
echo json_encode($array);
} else {
header('HTTP/1.1 401');//Unauthorized
}
?>