Ich versuche, ein Widget für eine Webanwendung zu entwickeln, in dem der Benutzer Elemente aus einer hierarchischen Liste in ein div ziehen und ablegen kann. Für die Liste verwende ich die bekannten bootstrap-treeview plugin und für die Drag & Drop-Funktion JQuery UI ziehbare und Drop-fähige Funktionen.Draggable-Eigenschaft verloren nach dem Expandieren Knoten mit bootstrap-treeview
Es funktioniert gut nach dem Laden der Seite können die Elemente in der Liste gezogen werden. Sobald ich jedoch eines der Listenelemente expandiere, können sie nicht mehr gezogen werden.
Ich habe versucht, das ziehbare Handle mit dem Ereignisereigniserweiterung expandNode wieder hinzuzufügen, aber es funktioniert nicht. Ich habe auch überprüft, dass das Ereignis ausgelöst wird, aber aus irgendeinem Grund wird die ziehbare Bedingung nicht erneut an die Listenelemente angehängt.
Sie können den minimalen Code, der den Fehler reproduziert, in this JSFiddle überprüfen.
Irgendeine Idee über was mache ich falsch?
Unter allen Code für die Vollständigkeit.
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-treeview/1.2.0/bootstrap-treeview.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js" type="text/javascript"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-treeview/1.2.0/bootstrap-treeview.min.js" type="text/javascript"></script>
<style>
.item-list {
height: 8em;
color: black;
}
.droppable-area {
height: 8em;
outline: 2px dashed blue;
}
</style>
</head>
<body>
<div class="container">
<div class="row">
<p>
Item list:
</p>
</div>
<div class="row">
<div class="col-md-6" id="item-list">
</div>
<div class="col-md-6 droppable-area">
</div>
</div>
</div>
</body>
<script type="text/javascript">
var enableDraggables = function(event, data) {
$(".node-item-list").draggable({
opacity: 0.7,
helper: "clone",
revert: true
});
return true;
};
var itemTree = [
{ text: "item 1", nodes:[{text: "subitem 1-1"},{text: "subitem 1-2"}]},
{ text: "item 2", nodes:[{text: "subitem 2-1"},{text: "subitem 2-2"},{text: "subitem 2-3"}]},
{ text: "item 3" }
];
$("#item-list").treeview({
data: itemTree,
expandIcon: "glyphicon glyphicon-chevron-right",
collapseIcon: "glyphicon glyphicon-chevron-down",
onNodeSelected: enableDraggables,
onNodeUnselected: enableDraggables,
onNodeChecked: enableDraggables,
onNodeUnchecked: enableDraggables,
onNodeCollapsed: enableDraggables,
onNodeExpanded: enableDraggables
});
$("#item-list").treeview('collapseAll', {
silent: true
});
enableDraggables();
$(".droppable-area").droppable({
accept: ".node-item-list"
});
</script>
</html>
Interessante Lösung, scheint es das Problem zu lösen. Es hat jedoch zwei Nachteile. Erstens muss ich die Bibliothek modifizieren, und zweitens können alle Knoten ziehbar gemacht werden, und ich brauche nur Blattknoten, um ziehbar zu sein. Der erste Nachteil ist etwas, mit dem ich leben könnte, aber das zweite muss ich lösen. – joanlofe
Danke Jason. Schließlich habe ich eine leicht modifizierte Form Ihrer Lösung verwendet, aber im Grunde hat es funktioniert. – joanlofe