Абсолютно позиционированная проблема jquery sortable в «дескрипторе» - не влияет на сортировку, хотя и не входит в область действия сортируемого элемента - PullRequest
2 голосов
/ 25 августа 2010

У меня проблема, которую я не могу решить.

У меня есть список элементов Basecamp с небольшим меню слева с иконками Drag, Edit и Trash.

Ручка есть. Он сидит за пределами сферы действия сортируемого элемента, и поэтому он вообще не влияет на сортировку.

The problem demonstration

Как видите, мой значок перетаскивания находится слева. Он находится за пределами области действия {LI}. Окончания LI там, где заканчивается символ, поэтому Handle находится вне его родителя и не будет влиять на сортировку и не будет ее инициировать.

Когда я перетаскиваю его, но перемещаю мышь внутри границ LI, это влияет и сортирует, как и предполагалось.

Что я могу сделать. Я сломал голову и искал свойство смещения ручки или какой-либо способ определить для него, что моя ручка находится за пределами вашей области видимости.

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

Спасибо

Ответы [ 2 ]

5 голосов
/ 02 мая 2011

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

Просто поместите это после вашего основного jquery.ui.js включения и перед вашим сортируемым кодом, чтобы перезаписать метод:

// UI Fix for draggable
$.extend($['ui']['sortable'].prototype, {
    _intersectsWithPointer: function(item) {

        var isOverElementHeight = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
            verticalDirection = this._getDragVerticalDirection(),
            horizontalDirection = this._getDragHorizontalDirection();

        if (!isOverElementHeight)
            return false;

        return this.floating ?
            ( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
            : ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );

    }
});

Очевидно, что это нарушает функциональность для горизонтальной сортировки, поэтому вам нужно будет включить ее только в ваш особый случай.

Уважаемая команда jQuery UI : вызов функции для обработки этого с использованием параметра.:)

SammyK

4 голосов
/ 22 ноября 2013

У меня была такая же проблема.

Я заметил, что здесь представлена ​​открытая ошибка: http://bugs.jqueryui.com/ticket/3022#comment:9

А также запрос на удаление, который утверждает, что исправил проблему: https://github.com/jquery/jquery-ui/pull/915

Немного боли, что это все еще не исправлено после всех этих лет.

В любом случае, я рассматривал возможность внесения изменений, как предлагает SammyK, но потом заметил, что в v1.10.3 есть опция axis. Я не уверен, существовало ли это в предыдущих выпусках jQuery UI.

Но настройка axis устраняет проблему для меня:

$('.items').sortable({
  containment:'parent',
  handle:'.move',
  opacity:0.5,
  axis:'y'
});

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

...