4

私は素晴らしい解決策を見つけました(最後の答え):

jQuery Sortable - 複数のリスト項目を選択してドラッグ

http://jsfiddle.net/hQnWG/480/

HTML:

<ul>
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
</ul>
<ul>
    <li>Four</li>
    <li>Five</li>
    <li>Six</li>
</ul>

JavaScript (jQuery および jQuery UI を使用):

$("ul").on('click', 'li', function (e) {
    if (e.ctrlKey || e.metaKey) {
        $(this).toggleClass("selected");
    } else {
        $(this).addClass("selected").siblings().removeClass('selected');
    }
}).sortable({
    connectWith: "ul",
    delay: 150, //Needed to prevent accidental drag when trying to select
    revert: 0,
    helper: function (e, item) {
        var helper = $('<li/>');
        if (!item.hasClass('selected')) {
            item.addClass('selected').siblings().removeClass('selected');
        }
        var elements = item.parent().children('.selected').clone();
        item.data('multidrag', elements).siblings('.selected').remove();
        return helper.append(elements);
    },
    stop: function (e, info) {
        info.item.after(info.item.data('multidrag')).remove();
    }

});

うまく機能しますが、2 つ以上の要素をドラッグすると、Google Chrome の JS コンソールに次のエラーが表示されます。

キャッチされていない TypeError: null のメソッド 'insertBefore' を呼び出せません

どうすれば修正できますか?

4

1 に答える 1

4

jquery-UI _rearrange 関数のバグだと思います...そのメソッドをオーバーライドするハックを行いました... dom ready の後に以下のコードを挿入します...問題を修正します

$.ui.sortable.prototype._rearrange = function (event, i, a, hardRefresh) {

                a ? a[0].appendChild(this.placeholder[0]) : (i.item[0].parentNode) ? i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === "down" ? i.item[0] : i.item[0].nextSibling)) : i.item[0];
                this.counter = this.counter ? ++this.counter : 1;
                var counter = this.counter;

                this._delay(function () {
                    if (counter === this.counter) {
                        this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
                    }
                });

            }

ここにフィドルがあります

http://jsfiddle.net/r83zY/

于 2013-07-09T13:49:49.420 に答える