Нелегко реализовать в контекстном меню такие команды, как «Копировать», «Вставить», ... поэтому я решил изменить мою демонстрацию с ответ на ваш предыдущий вопрос. В новая демонстрация контекстное меню появляется, только если на странице нет выделенного текста.
Первая проблема заключается в том, что исходный код 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()
и создавать контекстное меню, только если текст не выделен. В результате вы увидите свое пользовательское контекстное меню, только если текст не выделен, и увидите стандартное контекстное меню (которое зависит от веб-браузера), если выбор текста существует:
ОБНОВЛЕНО : Я изменил свой отчет об ошибке о 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() === '') {
...
см. Еще одну демонстрацию , где встроенное редактирование будет активировано двойным щелчком мыши.