Как добавить стандартную текстовую команду в контекстное меню jqgrid - PullRequest
2 голосов
/ 10 декабря 2011

Если контекстное меню добавлено в jqGrid с использованием Пользовательские значения для элементов контекстного меню в JQgrid и используется встроенное редактирование в текстовом поле, стандартное контекстное меню текстового поля недоступно, оно заменяется контекстным меню jqGrid.

Как добавить стандартные команды контекстного меню текстового поля (Отменить, Вырезать, Копировать, Вставить, Удалить, Выбрать все) в контекстное меню jqGrid или как показать стандартное контекстное меню для встроенного редактирования текстового поля?

Обновление

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

two menus

Как это исправить?

1 Ответ

2 голосов
/ 11 декабря 2011

Нелегко реализовать в контекстном меню такие команды, как «Копировать», «Вставить», ... поэтому я решил изменить мою демонстрацию с ответ на ваш предыдущий вопрос. В новая демонстрация контекстное меню появляется, только если на странице нет выделенного текста.

Первая проблема заключается в том, что исходный код jquery.contextmenu.js содержит следующий фрагмент кода:

$(this).bind('contextmenu', function(e) {
  // Check if onContextMenu() defined
  var bShowContext = (!!hash[index].onContextMenu) ? hash[index].onContextMenu(e) : true;
  if (bShowContext) display(index, this, e, options);
  return false;
});

Таким образом, обработчик contextmenu всегда возвращает false и предотвращает создание стандартного контекстного меню. Я исправляю код к следующему (вы можете скачать полный измененный код здесь ):

$(this).bind('contextmenu', function(e) {
  // Check if onContextMenu() defined
  var bShowContext = (!!hash[index].onContextMenu) ? hash[index].onContextMenu(e) : true;
  currentTarget = e.target;
  if (bShowContext) {
    display(index, this, e, options);
    return false;
  }
});

Код createContexMenuFromNavigatorButtons описанных функций здесь Я модифицировал

onContextMenu: function (e) {
    var rowId = $(e.target).closest("tr.jqgrow").attr("id"), p = grid[0].p, i,
        lastSelId;

    if (rowId && getSelectedText() === '') {
        ...
        return true;
    } else {
        return false; // no contex menu
    }
}

использовать getSelectedText() и создавать контекстное меню, только если текст не выделен. В результате вы увидите свое пользовательское контекстное меню, только если текст не выделен, и увидите стандартное контекстное меню (которое зависит от веб-браузера), если выбор текста существует:

enter image description here

ОБНОВЛЕНО : Я изменил свой отчет об ошибке о jquery.contextmenu.js с дополнительной информацией на основе ответа. Я надеюсь, что в скором времени изменения будут внесены в основной код jquery.contextmenu.js, включенный в подкаталог plugins.

ОБНОВЛЕНО 2 : Как вы можете видеть здесь все исправления уже есть в основном коде jqGrid на github и включены в jqGrid 4.3 .

ОБНОВЛЕНО 3 : Если вы хотите иметь стандартное контекстное меню для всех включенных <input type="text" ...>, <input type="textarea" ...> и <textarea ...> элементов, вам просто нужно немного изменить код внутри onContextMenu обратного вызова. Например

onContextMenu: function (e) {
    var p = grid[0].p, i, lastSelId,
        $target = $(e.target),
        rowId = $target.closest("tr.jqgrow").attr("id"),
        isInput = $target.is(':text:enabled') ||
        $target.is('input[type=textarea]:enabled') ||
        $target.is('textarea:enabled');
    if (rowId && !isInput && getSelectedText() === '') {
        ...

см. Еще одну демонстрацию , где встроенное редактирование будет активировано двойным щелчком мыши.

...