jQuery UI sortable('cancel') - this.helper имеет значение null

Я пытаюсь отключить сортировку сортируемого элемента при двойном щелчке. Когда я пытаюсь отключить его, даже без условия, он выдает ошибку «this.helper is null».

$('.roundedBox:first', division).sortable({
    start: function( event, ui ) {
        if( true === true ) {
            $(this).sortable('cancel');
        }

        $(this).parent().data( 'sorting', true ); 
    },
    stop: function() { 
        $(this).parent().data( 'sorting', false ); 
    },
    items: '.department',
    update: function() {},
    placeholder: 'department-placeholder'
})

Любые идеи о том, как я могу это сделать? Мне не нужен этот метод. Буквально все, что останавливает его, сработает.

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


РЕДАКТИРОВАТЬ

После дальнейшего расследования, инициированного Russ C (спасибо), я обнаружил, что проблема не в самой сортировке, а в сочетании с двумя другими плагинами:

jEditable (http://www.appelsiini.net/projects/jeditable) Контекстное меню jQuery ( http://beautifulsite.net/2008/09/jquery-context-menu-plugin/)

Последнее и является причиной проблемы. Поскольку тег jEditable h3 находится внутри сортируемого div, который, в свою очередь, находится в подразделении с контекстным меню jQuery, которое, как мне кажется, что-то делает, чтобы остановить распространение (без этого последнего плагина все работает нормально).

Для воспроизведения проблемы необходимо следующее:

HTML

<div class="division">
    <div class="roundedBox">
        <div class="department" id="dDeppresident_test">
            <h3>Test</h3>
            <a href="#" title="Menu" class="icon menu hover-icon"><img src="/images/icons/menu-colored.png" alt="Menu" height="15" width="15"></a>
        </div>
    </div>
</div>

<ul id="uDepartmentMenu" class="hidden contextMenu">
    <li><a href="#editDepartment" class="edit" title="Edit Department">Edit Department</a></li>
    <li><a href="#removeDepartment" class="remove" title="Remove Department">Remove Department</a></li>
</ul>
<ul id="uDivisionMenu" class="hidden contextMenu">
    <li><a href="#editDivision" class="edit" title="Edit Division">Edit Division</a></li>
    <li><a href="#addDivision" class="add" title="Add Division">Add Division</a></li>
    <li><a href="#removeDivision" class="remove" title="Remove Division">Remove Division</a></li>
    <!--<li><a href="#move" title="Move Division">Move Division</a></li>-->
    <li class="separator"><a href="#addDepartment" class="add" title="Add Department">Add Department</a></li>
</ul>

jQuery

// Add context menu to menu icon
$('.division').contextMenu({
    menu: 'uDivisionMenu'
}, function(){} );

// Add Sorting
$('.roundedBox').sortable({
    start: function( event, ui ) {
        //$(this).parent().data( 'sorting', true ); 
    },
    stop: function() { 
        //$(this).parent().data( 'sorting', false ); 
    },
    items: '.department',
    update: function() {},
    placeholder: 'department-placeholder'
});


// Make the division names editable
$('.department h3').editable( '/ajax/save-department-name.php', {
    indicator   :   'Saving...',
    tooltip     :   'Double click to edit...',
    event       :   'dblclick'
});

// Add context menu to menu icon
$('.department a.menu').contextMenu({
    menu: 'uDepartmentMenu', 
    leftButton: true
}, function(){} );

// Make the departments show remove icon when you hover it
$('.department').live( 'mouseover', function() {
    $( '.hover-icon', $(this) ).show();
}).live( 'mouseout', function() {
    $( '.hover-icon', $(this) ).hide();
});

Вы можете увидеть пример тестирования здесь (ссылка будет удалена позже): http://www.realstatistics.com/testing/

Если вы удалите этот раздел из кода jQuery, все будет работать хорошо:

// Add context menu to menu icon
$('.division').contextMenu({
    menu: 'uDivisionMenu'
}, function(){} );

Я пока продолжу поиск проблемы.


ОБНОВИТЬ

Я исправил эту проблему. Если кто-то столкнется с этой проблемой в будущем, я изменил плагин contextMenu, чтобы пропустить его проверку, если цель была в классе «.department». Сразу после функции «mouseup» добавьте проверку, которая проверяет цель события, например:

$(this).mouseup( function(e) {
    if( !$(e.target).hasClass('department') && !$(e.target).parent().hasClass('department') ) {

person Kerry Jones    schedule 26.05.2010    source источник
comment
Я просто занимаюсь этой проблемой, и я обошел ее, пропустив evt.stopPropagation в обработчике mousedown.   -  person Tuan    schedule 22.09.2011


Ответы (1)


Можете ли вы попробовать добавить задержку: 500 в список сортируемых параметров, возможно, эта задержка может привести к правильному пузырю двойного щелчка?

Точно так же вы можете использовать расстояние: 30, которое сообщит сортируемому не начинать работу, пока перетаскивание не будет продолжаться на 30 пикселей или более. это можно использовать, чтобы убедиться, что события «щелчка» работают.

person Russ Clarke    schedule 28.05.2010
comment
Свойство двойного щелчка вызывает появление редактируемого текстового поля. Я пробовал как задержку: 500, так и расстояние: 30, они все еще срабатывают, если мышь находится в области: \ - person Kerry Jones; 28.05.2010
comment
Ага, хорошо; Возможно ли, чтобы вы разместили HTML-код и событие двойного щелчка? Я хотел бы попытаться воспроизвести это локально. - person Russ Clarke; 28.05.2010
comment
Мм, как-то сложно, я посмотрю, что я могу сделать. - person Kerry Jones; 29.05.2010
comment
Вау, это привело к большому открытию — вы можете увидеть мою правку выше. Я скоро приму ваш ответ - просто хочу убедиться, что действительно могу это исправить. - person Kerry Jones; 29.05.2010
comment
Дополнительная информация: если я смогу получить доступ к разделу ДО начала сортировки, я, вероятно, смогу отключить contextMenu, чтобы это не было проблемой, я просто не знаю, как я могу это сделать. Есть ли способ получить доступ к элементу, по которому щелкнули? - person Kerry Jones; 29.05.2010
comment
Круто, я рад, что смог помочь! - person Russ Clarke; 01.06.2010