Проблема с вложенными сортируемыми файлами jQuery - PullRequest
8 голосов
/ 08 февраля 2010

Вот основная структура HTML для моей страницы:

<div id="selectedItemsTop">
    <ul>
        <li>
            Root element
            <ul>
                <li>Level One a</li>
                <li>Level One b</li>
                <li>
                    Level One parent
                    <ul>
                        <li>Level Two a</li>
                        <li>
                            Level Two parent
                            <ul>
                                <li>Level Three a</li>
                                <li>Level Three b</li>
                            </ul>
                        </li>
                        <li>Level Two b</li>
                    </ul>
                </li>
                <li>Level One c</li>
            </ul>
        </li>
    </ul>
</div>

например:

  • Корневой элемент
    • Первый уровень
    • Первый уровень b
    • Уровень Один родитель
      • Второй уровень
      • Родитель второго уровня
        • Уровень третий a
        • Уровень третий b
      • Второй уровень b
    • Первый уровень c

На каждом уровне отступа после корня может быть любое количество элементов, но когда-либо будет только 3 уровня и только один родительский уровень (т. Е. Под корнем всегда ровно 3 <ul> s, но число <li> s является переменным).

Я разрешаю пользователю переупорядочивать эту структуру с помощью плагина jQuery UI Sortable. Чтобы добавить новый элемент, есть три группы элементов (элементы первого уровня, элементы второго уровня, элементы третьего уровня), которые располагаются рядом на странице с этим деревом. Пользователь может перетащить оттуда в список, чтобы добавить его, но он должен быть добавлен на соответствующем уровне.

У меня это уже работает, используя draggable с опцией connectToSortable:

$('ul.availableItems').each(function(i) {
    var selector = "#selectedItemsTop > ul";
    for (var j = 0; j <= i; ++j) { // count from 0 to [0, 1, 2]
        selector += " > li > ul";
    }
    // eg: selector == "#selectedItemsTop > ul > li > ul"
    // eg: selector == "#selectedItemsTop > ul > li > ul > li > ul"
    // eg: selector == "#selectedItemsTop > ul > li > ul > li > ul > li > ul"
    $(this)
        .find('li')
        .draggable({
            connectToSortable : selector
        })
    ;
});
$('#selectedFieldsTop > ul > li ul').sortable();

Как я уже сказал, это работает ... во всем, кроме IE. Предметы первого уровня работают отлично, однако никакие предметы уровня 2 или 3 не будут добавлены в сортируемую. Попытка отсортировать один из предметов уровня 2 или 3, которые уже есть, заставляет его взять весь «Уровень один родительский» и переместить все это вокруг.

Есть ли что-нибудь, о чем вы могли бы подумать, чтобы это работало в Firefox, но не в IE? Не могли бы вы придумать другой способ справиться с этим?

Версии: Firefox 3.6, IE7, jQuery 1.3.2, jQuery UI 1.7.2

Update
Вот рабочий код на JSBin: http://jsbin.com/ixabo/edit - Неудивительно, что он не работает в IE, но я думаю, что это проблема с JSBin ("_console is undefined"). Чтобы увидеть его наполовину работающим, возможно, скопируйте / вставьте в локальный файл и откройте его в IE.

Ответы [ 2 ]

1 голос
/ 09 февраля 2010

Также были проблемы с сортируемым ранее: мой случай был Аккордеоном и сортируемым внутри. Я не мог получить четкий ответ, но если вы посмотрите на любую из реализаций дерева, они используют перетаскивание и не сортируются.

Основываясь на этом опыте - не очень точном, я знаю - я согласен с akiller и скажу: возьмите хороший плагин для дерева вместо того, чтобы пытаться сделать это самостоятельно с помощью сортируемого. jsTree достаточно хорош и должен выполнять свою работу - есть и другие, если по какой-то причине jsTree не соответствует вашим потребностям.

1 голос
/ 08 февраля 2010

Вы можете использовать другие плагины? jsTree очень хорошо справляется с подобными вещами.

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