Использование плагина contextMenu с плагином fileTree без потери поддержки перетаскивания
Сервер работает на Ruby on Rails. Javascript написан с использованием Coffeescript.
В настоящее время я использую плагин JQuery File Tree с плагином Context Menu. Оба работают в данный момент, с одной незначительной проблемой. У меня также включено перетаскивание в дереве файлов, и оно не будет отменено после отпускания левой кнопки мыши. На картинке ниже мышь уже выпущена.
Мышь вверх, но перетаскиваемый не отменил
Страница, на которой это загружено, имеет один div:
<div id="file_tree"></div>
И этот 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. Однако кажется, что события click, mousedown и mouseup обрабатываются правильно. Кроме того, контекстное меню не имеет проблем и не вызовет проблем с перетаскиванием.
Что касается моего поиска исправлений, я ничего не нашел. Плагин "Файловое дерево" содержит много информации, но в контекстном меню, похоже, почти ничего нет (должно быть непопулярно?). И ни один из них не имеет обоих одновременно. Если вам нужна другая информация, пожалуйста, укажите.
РЕДАКТИРОВАТЬ: я понял, что это на самом деле, потому что плагин должен вызвать e.stopPropogation() на событие mouseup, чтобы предотвратить открытие реального контекстного меню. Кто-нибудь знает, как вручную выполнить событие stopdrag()? Это не работает, если я назову $(this).trigger('stopdrag'), если вы собираетесь это предложить.
1 ответ
В конце концов исправил эту проблему (через некоторое время, и пока откладывал, чтобы получить Tumbleweed). Просто добавили проверку, что это была правая кнопка, которая была нажата, потому что она ломала сопротивление, выполняя e.stopPropagation() на ОБАХ кликах. Это намного чище, чем мой оригинальный обходной путь, который я пересмотрел.
if(e.button == 2) {
e.stopPropagation();
}