Verhindern, dass Listenelement in JqueryUI sortierbar ist

Lesezeit: 3 Minuten

Benutzeravatar von user1038814
Benutzer1038814

Ich habe zwei Listen #sortable1 und #sortable 2 die verbundene Sortables sind, wie hier gezeigt Beispiel.

Sie können Listenelemente per Drag-and-Drop verschieben sortable1 zu sortable 2. Wenn jedoch ein Artikel in sortierbar 1 die Klasse “Nummer” enthält, möchte ich verhindern der Tropfen auf Sortierbar2 und so das gezogene Element wieder hineinfallen lassen sortierbar 1.

Ich habe Folgendes auf sortable2 verwendet:

receive: function (event, ui) {
            if ($(ui.item).hasClass("number")) {
                $(ui.item).remove();
            }

aber es löscht das Listenelement aus beiden Tabellen insgesamt. Jede Hilfe wird geschätzt.

Benutzeravatar von TJ
TJ

Für jeden, der dies in Zukunft liest, wird, wie von Briansol in Kommentaren für die akzeptierte Antwort erwähnt, ein Fehler ausgegeben

Uncaught TypeError: Cannot read property 'removeChild' of null

Das sagt die Dokumentation besonders

cancel()

Bricht eine Änderung an der aktuellen Sortierung ab und setzt sie auf den Zustand vor dem Start der aktuellen Sortierung zurück. Nützlich in der Pause und erhalten Callback-Funktionen.

Das Abbrechen der Sortierung während anderer Ereignisse ist unzuverlässig. Verwenden Sie daher besser die receive Ereignis wie in Mj Azanis Antwort gezeigt oder verwenden Sie die stop Veranstaltung wie folgt:

$('#list1').sortable({
  connectWith: 'ul',
  stop: function(ev, ui) {
    if(ui.item.hasClass("number"))
      $(this).sortable("cancel");
   }
}); 

$('#list2').sortable({
   connectWith: 'ul',
});  

Demo

Richards Benutzeravatar
Richard

Sie können eine Kombination aus den verwenden stop und sortable('cancel') Methoden zur Validierung des verschobenen Elements. Im dieses Beispielwenn ein Gegenstand abgelegt wird, überprüfe ich, ob der Gegenstand gültig ist, indem ich:

  1. Überprüfen, ob das Element die Klasse hat number
  2. und Überprüfen, ob das Listenelement abgelegt wurde list2

Dies ist etwas fester codiert, als ich möchte. Alternativ können Sie also das übergeordnete Element des abgelegten Elements überprüfen this, um zu prüfen, ob die Listen unterschiedlich sind. Dies bedeutet, dass Sie möglicherweise einen Artikel von haben könnten number in list1 und list2aber sie sind nicht austauschbar.

jsFiddle-Beispiel

$(function() {
    $('ul').sortable({
        connectWith: 'ul',
        stop: function(ev, ui) {
            if ($(ui.item).hasClass('number') && $(ui.placeholder).parent()[0] != this) {
                $(this).sortable('cancel');
            }
        }
    });        
});​

  • Mit dieser Methode scheine ich JS-Fehler zu bekommen. Ich habe einen Fehlerbericht auf der jQUI-Site aktualisiert, der möglicherweise damit zusammenhängt. bugs.jqueryui.com/ticket/4904?cnum_edit=9#comment:9

    – BReal14

    7. März 2014 um 19:10 Uhr


  • Stornieren ist nur zuverlässig in der stop und receive Ereignisse wie in dieser anderen Antwort erwähnt

    – NDM

    20. August 2015 um 10:47 Uhr

  • this.sortable hat bei mir nicht funktioniert, aber beim Wechsel zu ui.sender.sortable(“cancel”); id funktioniert einwandfrei

    – Mimouni

    26. Mai 2016 um 9:12 Uhr

  • Fehlermeldung: Uncaught TypeError: Eigenschaft „removeChild“ von null kann nicht gelesen werden. Es bricht das sortierbare …

    – Lönix

    21. März 2017 um 4:49 Uhr

  • @Mr.Jo Ich habe das obige Beispiel aktualisiert, um den Fehler hoffentlich zu beheben.

    – Richard

    28. Juni 2021 um 18:48 Uhr


Benutzeravatar von Mj Azani
Mj Azani

Versuchen dieses Beispiel

$('#list1').sortable({
    connectWith: 'ul'
});    

$('#list2').sortable({
    connectWith: 'ul',
    receive: function(ev, ui) {
        if(ui.item.hasClass("number"))
          ui.sender.sortable("cancel");
    }
});    

Nach ein paar Experimenten habe ich festgestellt, dass die bei weitem einfachste Methode die Verwendung des remove-Ereignisses ist, das im Wesentlichen nur ausgelöst wird, wenn Sie versuchen, ein Element in eine neue sortierbare Datei zu verschieben (die zuvor mit connectWith als Ziel verfügbar gemacht wurde).

Fügen Sie dies einfach zu Ihrem sortierbaren Aufruf hinzu:

remove:function(e,ui) {
    if(ui.item.hasClass('your_restricted_classname')) return false;
},

Wenn Sie die Elemente mit der Klasse “Nummer” überhaupt nicht ziehen können müssen, können Sie die gesamte Drag-and-Drop-Funktionalität auch auf Elemente beschränken, die nicht die Klasse “Nummer” haben:

$("#sortable1, #sortable2").sortable({
    connectWith: ".connectedSortable",
    items: "li:not(.number)"
});

Hier kannst du es ausprobieren: http://jsfiddle.net/60gwjsgb/1/

Benutzeravatar von TanvirChowdhury
TanvirChowdhury

beforeStop: function(ev, ui) {
                if ($(ui.item).hasClass('number') && 
                    $(ui.placeholder).parent()[0] != this) {
                    $(this).sortable('cancel');
                }
            }

Versuche dies.

Benutzeravatar von Narges Ahani
Narges Ahani

Wenn Sie a) nur diese 2 Listen haben und b) es Ihnen egal ist, dass Ihre “Nummer” tatsächlich gezogen wird und dann zurückfällt, können Sie einfach verhindern, dass sie dadurch gezogen wird:

 sort: function(event, ui) {
if(ui.item.hasClass('number')) return false;
}

1431270cookie-checkVerhindern, dass Listenelement in JqueryUI sortierbar ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy