Jquery UI Drag Drop, определяющий, что можно, а что нельзя перемещать - PullRequest
1 голос
/ 04 февраля 2012

У меня есть пользовательский интерфейс Drag Drop, здесь , созданный из этого урока http://net.tutsplus.com/tutorials/javascript-ajax/inettuts/

У меня возникают проблемы, когда я не хочу, чтобы виджет был необратимым или несортируемым.На данный момент установлено, что «Виджет 1» нельзя перетаскивать.Если я удаляю его из объекта widgetIndividual, это нарушает всю функциональность.В идеале они должны быть определены на странице, а не в отдельном js-файле.

Если я удаляю следующий код из widgetIndividual, он ломает все.1011 *

Вы можете скачать код здесь

Спасибо

1 Ответ

1 голос
/ 06 февраля 2012

В методе makeSortable есть ошибка, которая приводит к неверному селектору jQuery.

Вот метод (я удалил не соответствующий код):

makeSortable : function () {

    var iNettuts = this,
        ...
        $sortableItems = (function () {

            var notSortable = '';

            $(settings.widgetSelector,$(settings.columns)).each(function (i) {
                if (!iNettuts.getWidgetSettings(this.id).movable) {
                    if(!this.id) {
                        this.id = 'widget-no-id-' + i;
                    }
                    notSortable += '#' + this.id + ',';
                }
            });

            // when "notSortable" is empty, the selector
            // is "> li:not()" which is invalid
            return $('> li:not(' + notSortable + ')', settings.columns);

        })();

    ...

}

$sortableItems получается (с функцией автозапуска) путем проверки опции movable виджетов и возврата отфильтрованного списка с помощью псевдо-селектора :not().

Проблема в том, что когда все виджетыявляются подвижными, переменная notSortable будет пустой, и это приведет к недопустимому селектору jquery > li:not().

Это происходит при удалении определенных настроек для виджета погоды.Погода имеет movable: false.Если вы удалите настройки, все виджеты будут подвижными, и возникнет ошибка.

Измените оператор возврата, чтобы использовать :not() только когда notSortable не пусто:

return $('> li' + ( notSortable && notSortable !== '' ? ':not(' + notSortable + ')' : '' ), settings.columns);

DEMO

...