сортировка jquery в сортируемом виде - PullRequest
0 голосов
/ 20 ноября 2011

Хорошо, я работал над вопросом, но вопрос исчез, поэтому я просто работаю над тем, чтобы что-то сделать независимо. К вашему сведению, это не главный приоритет, поэтому не чувствую себя обязанным.

В любом случае, мне нужно несколько советов о том, куда идти с этим, потому что я не могу заставить его работать правильно. У меня есть узел подкачки вниз, но я не могу заставить его вернуться должным образом. Я не думаю, что я обращаюсь с элементами должным образом.

Первым шагом было получить обмен с движущимся элементом, поэтому в основном:

1 2 3 4 5

если 1 больше 2, то (x держит ячейку для 1):

2 X 3 4 5

если 1 больше 3, то:

3 2 X 4 5

Это то, что у меня есть до сих пор. В "сортируемом" ($)

_NodeHold_pos: false,

// return what n1 get's replaced with
nodeSwap: function( n1, n2) {
    // not null and not same node and both have parents
    //  hmm, !n1.isSameNode(n2) doesn't work here for some reason
    if ( n1 && n2 && n1 != n2 && n1.parentNode && n2.parentNode ) {
        // if they don't have same parent, we need to make sure they don't contain each other (untested)
        if ( !n1.parentNode.isSameNode(n2.parentNode) ) {
            prnt = n1.parentNode;
            while ( prnt ) {
                if ( prnt.isSameNode(n2) ) return;
            }
            prnt = n2.parentNode;
            while ( prnt ) {
                if ( prnt.isSameNode(n1) ) return;
            }
        }
        n1h = n1.cloneNode(true);
        n1.parentNode.replaceChild(n1h,n1);
        n2.parentNode.replaceChild(n1,n2);
        n1h.parentNode.replaceChild(n2,n1h);
        //sn2.parentNode.removeChild(n1h);
        return n2;
    }
    return n1;
},

_rearrange2: function(event, i) {
    var n1 = this.placeholder[0];
    var n2 = (this.direction == 'down' || !i.item[0].nextSibling? i.item[0] : i.item[0].nextSibling);

    if ( n2 && !this._NodeHold_pos) {
        this._NodeHold_pos = this.nodeSwap(n1,n2);
    } else if ( n2 ) {
        var hold = n1;
        this.nodeSwap(n1,this._NodeHold_pos);
        this._NodeHold_pos = this.nodeSwap(n1,n2);
    }

    //Various things done here to improve the performance:
    // 1. we create a setTimeout, that calls refreshPositions
    // 2. on the instance, we have a counter variable, that get's higher after every append
    // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
    // 4. this lets only the last addition to the timeout stack through
    this.counter = this.counter ? ++this.counter : 1;
    var self = this, counter = this.counter;

    window.setTimeout(function() {
        if(counter == self.counter) self.refreshPositions(true); //Precompute after each DOM insertion, NOT on mousemove
    },0);
},

в функции "_mouseDrag", замененный вызов "_rearrange" будет переключаться на добавление "_rearrange2"

                //* <-- add '/' in front for this or remove for next
                this._rearrange(event, item);
                /*/
                this._rearrange2(event,item);
                //*/

в функции "_mouseStop" установите для _NodeHold_pos значение false

Я думаю, это было все, что я сделал, чтобы настроить его. В любом случае, протестировал обмен и, кажется, работает, но когда я пытаюсь вернуться обратно, я получаю отправленные нулевые узлы, и они продолжают зависать из-за этого. Я думаю, что это также вызывает странное поведение, поэтому я не уверен, куда идти с этим.

О, HTML (это из демо):

<html>
<head>
<script src="../jquery-1.7.min.js" type="text/javascript"></script>
<script src="../jquery-ui-1.8.16.custom.min.js" type="text/javascript"></script>
<link rel="stylesheet" href="../jquery-ui-1.8.16.custom.css"></link>
<script src="../jquery/development-bundle/ui/jquery.ui.sortable.js" type="text/javascript"></script>
</head>
<body>
<meta charset="utf-8">
    <style>
    #sortable2 { list-style-type: none; margin: 0; padding: 0; zoom: 1; }
    #sortable2 li { margin: 0 5px 5px 5px; padding: 3px; width: 90%; }
    </style>
<script>
    $(function() {
        $( "#sortable2" ).sortable({ tolerance: 'pointer',
            //items: "li:not(.ui-state-disabled)",
            cancel: ".ui-state-disabled",
        });
        $( "#sortable2 li" ).disableSelection();
    });
</script>
<div class="demo">
<h3 class="docs">Cancel sorting (but keep as drop targets):</h3>

<ul id="sortable2">
    <li class="ui-state-default">Item 1</li>
    <li class="ui-state-default">Item 2</li>
    <li class="ui-state-default">Item 3</li>
    <li class="ui-state-default ui-state-disabled">(I'm not sortable)</li>
    <li class="ui-state-default ui-state-disabled">(I'm not sortable)</li>
    <li class="ui-state-default">Item 4</li>
</ul>

</div>
</body>
</html>

edit : если вы закомментируете деталь вrange (и она вызывается) и просто вызовите swap:

    this.nodeSwap(n1,n2);
    /*
    if ( n2 && !this._NodeHold_pos) {
        this._NodeHold_pos = this.nodeSwap(n1,n2);
    } else if ( n2 ) {
        var hold = n1;
        this.nodeSwap(n1,this._NodeHold_pos);
        this._NodeHold_pos = this.nodeSwap(n1,n2);
    }
    */

Вы можете видеть, что этот тип обмена работает. Может быть, я должен решить это в первую очередь. Иногда зависает, а иногда просто толкает все, но работает по большей части. При тестировании узлы иногда оказываются неопределенными, даже когда я их вижу. Нужно ли обновлять DOM или что-то еще?

1 Ответ

2 голосов
/ 30 ноября 2011

Ну, давно не трогал, и с тех пор никто не отвечает.Хорошо, я сделал функцию свопа работающей.Самая большая проблема заключалась в том, что перестановка вызывалась из нескольких мест, которые я не видел (именно поэтому я отбросил две переменные, переданные функции), и что n2 был установлен для другого типа сортировки.Кроме того, своп не должен проверять родителей на основании того, что я могу сказать о настройке JQuery.

Чтобы настроить его, вот HTML-код, который я использовал для теста:

<html>
<head>
<script src="jquery-1.7.1.min.js" type="text/javascript"></script>
<script src="jquery-ui-1.8.16.custom.min.js" type="text/javascript"></script>
<link rel="stylesheet" href="jquery-ui-1.8.16.custom.css"></link>
<!-- this is from the development bundle so that it can be seen easier -->
<script src="jquery.ui.sortable.js" type="text/javascript"></script>
<meta charset="utf-8">
<style>
#sortable1, #sortable2 { list-style-type: none; margin: 0; padding: 0; zoom: 1; }
#sortable1 li { margin: 0 5px 5px 5px; padding: 3px; width: 40%; }
#sortable2 li { margin: 0 5px 5px 5px; padding: 3px; width: 30%; }
</style>
<script>
    $(function() {
        $( ".sortable" ).sortable({ tolerance: 'pointer',cancel: ".ui-state-disabled",});
        $( ".sortable li" ).disableSelection();
    });
</script>
</head>
<body>
<ul class="sortable" id="sortable1">
    <li class="ui-state-default">Item 1</li>
    <li class="ui-state-default">Item 2</li>
    <li class="ui-state-default">Item 3</li>
    <li class="ui-state-default ui-state-disabled">(I'm not sortable 1)</li>
    <li class="ui-state-default ui-state-disabled">(I'm not sortable 2)</li>
    <li class="ui-state-default">Item 4</li>
    <ul class="sortable" id="sortable2">
        <li class="ui-state-default">sub 2</li>
        <li class="ui-state-default">sub 3</li>
    </ul>
</ul>
</body>
</html>

Я использовал несколько подузлов для проверки некоторых других вещей.

В файле jquery.ui.sortable.js, который я включил, я внес следующие изменения:

Для функции_rearrange, я заменил на следующее:

_NodeHold_pos: false,

// return what n1 get's swapped with
nodeSwap: function( n1, n2 ) {
    if ( n1 && n2 && n1 !== n2 ) {
        var n1h = n1.cloneNode(false);
        n1.parentNode.replaceChild(n1h,n1);
        n2.parentNode.replaceChild(n1,n2);
        n1h.parentNode.replaceChild(n2,n1h);
        return n2;
    }
    return n1;
},

// _rearrange rework for specific sort
_rearrange: function(event, i, a, hardRefresh) {

    if ( a ) {
        a[0].appendChild(this.placeholder[0]);
        return;
    }

    var n1 = this.placeholder[0];
    var n2 = i.item[0];
    /*
    // swap in place, from where you were last (during mouseovers)
    this.nodeSwap(n1,n2);
    /*/
    // swap from original position (before picking up node)
    if ( this._NodeHold_pos === false ) {
        this._NodeHold_pos = this.nodeSwap(n1,n2);
    } else if ( n2 === this._NodeHold_pos ) {
        this.nodeSwap(n1,n2);
        this._NodeHold_pos = false;
    } else if ( n1 !== this._NodeHold_pos ) {
        this.nodeSwap(n1,this._NodeHold_pos);
        this._NodeHold_pos = this.nodeSwap(n1,n2);
    } else {
        alert("here");
        this._NodeHold_pos = false; // shouldn't really reach this
    }
    //*/
    this.counter = this.counter ? ++this.counter : 1;
    var self = this, counter = this.counter;

    window.setTimeout(function(){
        if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
    },0);
},

Я добавил эту строку в _mousestop:

this._NodeHold_pos = false;

Работает нормально сейчас.Я использовал два разных свопа (потому что я не знал, что будет глючить), но оба, кажется, работают одинаково, поэтому просто выбрал тот, у которого меньше кода.

Я действительно не закончил отвечатьисходный вопрос, который я начал, но он работает, поэтому на этот вопрос дан ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...