Ответ 1
Как уже было сказано, невозможно использовать в контекстах браузеров контекстное удаление, которое используется, на самом деле использование .bind('copy', func....)
будет не только прослушивать копию contextmenu, но также и CTRL+c
, поскольку она фактически привязана к буфер обмена.
Я собрал плагин, который, честно говоря, немного взломан, но он позволит вам поймать:
Контекст COPY, CUT, PASTE, DELETE - ТОЛЬКО Контекст COPY, CUT, PASTE, DELETE - И - CTRL + c, CTRL + x, CTRL + v
Или только один, два, три или четыре элемента (ов) любым из указанных способов. Конечно, одной из проблем был IE, он не запускает jQuerys .bind('input', func....
для прослушивания изменений, поэтому мне нужно было запустить его для IE, следовательно, может быть небольшая задержка (миллисекунды).
Плагин:
(function($) {
$.fn.contextDelete = function(options) {
var set = {
'obj': $(this),
'menu': false,
'paste': false,
'cut': false,
'copy': false,
'set': '',
'ie': null,
};
var opts = $.extend({
'contextDelete': function() {},
'paste': function() {},
'cut': function() {},
'copy': function() {},
'contextOnly': false,
}, options);
$(window).bind({
click: function() {
set.menu = false;
},
keyup: function() {
set.menu = false;
}
});
set.obj.bind({
contextmenu: function() {
set.menu = true;
set.paste = false;
set.cut = false;
set.copy = false;
set.val = set.obj.val();
// Hack for IE:
if ($.browser.msie) {
set.ie = setInterval(function() {
set.obj.trigger($.Event('input'));
if (!set.menu) {
clearInterval(set.ie);
}
}, 300);
}
// End IE Hack
},
paste: function(e) {
set.paste = true;
if (opts.contextOnly) {
if (set.menu) {
opts.paste(e);
set.menu = false;
}
}
else {
opts.paste(e);
}
},
cut: function(e) {
set.cut = true;
if (opts.contextOnly) {
if (set.menu) {
opts.cut(e);
set.menu = false;
}
}
else {
opts.cut(e);
}
},
copy: function(e) {
set.copy = true;
if (opts.contextOnly) {
if (set.menu) {
opts.copy(e);
set.menu = false;
}
}
else {
opts.copy(e);
}
},
input: function(e) {
if (set.menu && (!set.paste) && (!set.cut) && (!set.copy)) {
if (set.obj.val().length < set.val.length) {
opts.contextDelete(e);
set.menu = false;
}
}
}
});
};
})(jQuery);
Один пример использования, контекстное меню delete + контекстная копия ТОЛЬКО:
$('#evalname').contextDelete({
contextDelete: function(e) {
alert('You just deleted something!');
},
copy: function(e) {
alert('You just copied something!');
},
contextOnly: true,
});