Использование плагина contextMenu с плагином fileTree без потери поддержки перетаскивания - PullRequest
1 голос
/ 23 марта 2012

Сервер работает на Ruby on Rails. Javascript написан с использованием Coffeescript.

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

Мышь вверх, но перетаскивание не отменено

На странице, на которой это загружено, есть один 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 обрабатываются правильно. Кроме того, у контекстного меню нет проблем, и оно не вызовет проблем с перетаскиванием.

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

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

1 Ответ

0 голосов
/ 31 марта 2012

В конце концов исправил эту проблему (через некоторое время, и пока откладывал, чтобы получить Tumbleweed).Просто добавили проверку того, что нажата была правая кнопка, потому что она ломала сопротивление, выполняя e.stopPropagation () по ОБЫМ кликам.Это намного чище, чем мой оригинальный обходной путь, который я списал.

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