2012-01-04 4 views
16

Я хочу отслеживать правую мышь Нажмите + Удалить событие на вводе текста HTML. Я Преуспеть в отображении правой кнопки мыши + Paste/Cut/Copy, как показано нижеКак обнаружить правую мышь Нажмите + Удалить с помощью JQuery/Javascript

  $("#evalname").bind('paste/cut/copy', function(e) 
      { 
      do something 

      }); 

Здесь «evalname» является идентификатор моего ввода HTML текста. Я пробовал как

  $("#evalname").bind('delete', function(e) 
      { 
      do something 

      }); 

но не работает. Есть ли способ сопоставить правую мышь Нажмите + Удалить событие в JQuery/Javascript?

+1

Хороший вопрос :) +1 – abuduba

+1

Не уверен, что я understans ваш вопрос, что вы имеете в виду «Удалить»? Кнопка в контекстном меню на выбранном тексте? Не было бы достаточно использовать «событие изменения» и сравнить значение с пустой/пустой строкой? – Stefan

ответ

7

Как уже ответил, что это не возможно подобрать в браузерах Контекстное удаления используется, на самом деле, используя .bind('copy', func....) не только слушать копии Контекстное, но и CTRL+c, как это на самом деле связывания в буфер обмена.

я соединил плагин, который, честно говоря, немного рубить, но это позволит вам поймать:

  • Контекстное копирование, вырезание, вставка, удаление - ТОЛЬКО
  • Контекстное копирование, вырезание, вставка, удаление - и - CTRL + C, CTRL + X, CTRL + v
  • или только один, два, три или четыре элемента (s) в любом из указанных выше способов ,Конечно, одной из проблем был 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); 
    

    Одним из примеров использования, ContextMenu удалить + контекст копирования ТОЛЬКО:

    $('#evalname').contextDelete({ 
        contextDelete: function(e) { 
         alert('You just deleted something!'); 
        }, 
        copy: function(e) { 
         alert('You just copied something!'); 
        }, 
        contextOnly: true, 
    }); 
    

    Click Here for a DEMO

    +0

    Второй пример не работает с Firefox 25.0.1 на Xubuntu. –

    +0

    Также не работает для контекстного меню delete в Chrome 42.0.2311 – GrantD71

    +0

    Я только что протестировал на Firefox 47 на Windows 7, и это сработало для меня. –

    1

    На сегодняшний день я не верю, что браузеры внедрили его.

    События для копирования, вставки и вырезания были добавлены как функциональные возможности для взаимодействия с Pasteboard, и поскольку удаление не является частью картонной карты, оно не было реализовано.

    Browser Support Таблица (2011/04) http://codebits.glennjones.net/editing/setclipboarddata.htm

    WebKit Docs http://developer.apple.com/library/mac/#documentation/AppleApplications/Conceptual/SafariJSProgTopics/Tasks/CopyAndPaste.html

    Firefox Docs https://developer.mozilla.org/en/DOM/element#Event_Handlers

    2

    Чтобы расширить комментарий Стефана, и ответ UberNeet в:

    Вы не можете определить выбор «Удалить» из контекстного меню.

    может обнаружить изменения в содержимом ввода, либо в keyup (что поймает ключ удаления), либо при изменении или размытии (это обнаружит, пустуют ли они поле и нажмите где-нибудь еще).

    Если вы хотите узнать момент опорожнения, даже если они не покинули поле, вы можете попробовать установить таймер для опроса каждые полсекунды и проверить, не пустое поле. Остерегайтесь использовать слишком тугой таймер, опасаясь переутомления браузера бедных пользователей.

    Ни один из них не является идеальным решением, но это радость работы внутри браузера!

    0

    Try проверить значение 'evalname' после определенного временного интервала. С помощью этого мы можем в состоянии обнаружить вырезать/копировать/вставить/удалить из контекстного меню

    var evalnameLength=$("#evalname").val().length; 
        var enableSave; 
         enableSave=setInterval(function(){ 
          if(evalnameLength!=$("#evalname").val().length){ 
           do something; 
           clearInterval(enableSave); 
          } 
         },500); 
    
    Смежные вопросы