1

Сервер работает с Ruby on Rails. Javascript написан с использованием Coffeescript.Использование плагина contextMenu с плагином fileTree без потери поддержки перетаскивания

В настоящее время я использую плагин jQuery File Tree с плагином контекстного меню. Оба работают в настоящий момент с одной незначительной проблемой. У меня также есть draggable включен в дереве файлов, и он не будет отменен после отпускания левого клика. На рисунке ниже мышь уже выпущена.

Mouse up but draggable hasn't cancelled

страница это загружается на есть один DIV:

<div id="file_tree"></div> 

И это ДИВ заполняется другой страницы из другого контроллера. Код:

<ul class="jqueryFileTree" style="display: none;"> 
    <% @contents[0].each do |directory| %> 
    <li class="directory collapsed"><a href="#" rel="<%= @root + directory %>/"><%= directory %></a></li> 
    <% end %> 
    <% @contents[1].each do |file| %> 
    <li class="file ext_<%= File.extname(file)[1..-1] %>"><a href="#" rel="<%= @root + file %>"><%= file %></a></li> 
    <% end %> 
</ul> 

Эта страница также загружает перетаскиваемую код:

$ -> 
@settings = 
    revert: true 
    helper: "clone" 
    containment: "#file_tree" 
    axis: "y" 
    scroll: true 
    cursorAt: 
    top: -2 

$(".directory").draggable(@settings) 
$(".file").draggable(@settings) 

и контекстное меню добавляется как это:

$("#file_tree").contextMenu { menu: 'filetree_context_menu' }, (action, element, position) => 
    @on_context_menu(action, element, position, data.root_directory) 

Где @on_context_menu это просто функция (он не имеет никакого отношения к этой проблеме).

Проблема может быть остановлена ​​(клон возвращается к исходному), если вы нажмете вне div #file_tree. Тем не менее, похоже, что операции щелчка, мыши и мыши автоматически обрабатываются. Кроме того, контекстное меню не имеет проблем и не вызовет проблемы с перетаскиванием.

Что касается моих поисков исправлений, я ничего не нашел. Плагин File Tree имеет достаточное количество информации, плавающей вокруг, но в Контекстном меню, кажется, почти ничего (должно быть непопулярно?). И никто из них не имеет одновременно. Если вам нужна другая информация, пожалуйста, укажите.

EDIT: Я понял, что это на самом деле потому, что плагин должен вызвать e.stopPropogation() в событии mouseup, чтобы он не открывал реальное контекстное меню. Кто-нибудь знает, как вручную выполнить событие stopdrag()? Он не работает, если я вызову $ (this) .trigger ('stopdrag'), если вы собираетесь это предложить.

ответ

0

В конечном итоге исправлена ​​эта проблема (довольно долгое время, и, затягиваясь, чтобы получить Tumbleweed). Просто добавлена ​​проверка, что на нее была нажата правая кнопка, потому что она ломала ловушку, запустив e.stopPropagation() на BOTH кликах. Это намного чище, чем моя оригинальная работа, которую я сломал.

if(e.button == 2) { 
    e.stopPropagation(); 
}