Меню триггера Jquery UI-ContextMenu при выделении текста

Я использую плагин https://github.com/mar10/jquery-ui-contextmenu. У меня есть несколько динамически генерируемых div-ов, каждый с предварительным тегом. Я хочу инициализировать плагин один раз, когда пользователь выделяет текст и отпускает левую кнопку мыши, чтобы вызвать контекстное меню, расположенное в позиции мыши.

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

Вот моя скрипка в качестве примера

$("div.editor").contextmenu({
  delegate: "pre",
  menu: [
    {title: "Copy", cmd: "copy", uiIcon: "ui-icon-copy"},
    {title: "----"},
    {title: "More", children: [
        {title: "Sub 1", cmd: "sub1"},
        {title: "Sub 2", cmd: "sub1"}
        ]}
    ],
   select: function(event, ui) {
    alert("select " + ui.cmd + " on " + ui.target.text());
  }
});

$("pre").bind("mouseup",function(e){
     $("div.editor").contextmenu('open',$("pre"));
});

<div class="editor"><pre></pre></div>

Это просто пример кода, но он очень похож на то, что я использую. У каждого элемента div есть форма, в которой есть несколько полей, которые мы хотим заполнить большим текстом, который содержится в пред теге. И может быть до 20 тегов div.editor каждый со своей формой.

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

Любая помощь будет принята с благодарностью.

еще раз спасибо

1 ответ

Решение

Я нашел решение, надеюсь, это поможет кому-то еще, кто захочет сделать то же самое, что и я.

Таким образом, вы должны добавить в позицию, когда вы определяете свое контекстное меню. Затем сделайте привязку к mouseup, чтобы запустить метод open. Я использовал функцию extraData, чтобы передать исходное событие мыши. Это то, что сделало это положение мыши, а не в верхнем левом углу экрана.

 $("div.editor").contextmenu({
            delegate: "pre",
            position: function(event, ui){
               return {my: "left top", at: "left bottom", of: ui.extraData, collision: "fit"}; 
            }, 
...});

Затем после определения контекстного меню привязайтесь к событию mouseup, чтобы получить выделенный текст. Я использую несколько функций, чтобы получить выделенный текст и отменить выбор текста (ошибка IE)

$("pre").bind("mouseup",function(e){
            mytext = getSelectionHtml(), t = $(e.target), p = $('#' + t.prop('id'));

            if(mytext.length > 0){
                deselHTML();
                console.log(mytext + ' selected, calling open on the context menu. ' + $(p).prop('class'));
                $("div.editor").contextmenu('open',$(t),e);

            }
        });
Другие вопросы по тегам