2011-06-10 37 views
3
$('#sometextarea') 
    .change(function(){console.log($(this).val());}) 
    [0].onpaste=function(){ 
     var self=$(this); 
     var intr=setInterval(function(){ 
      if(self.val().length) { 
       clearInterval(intr); 
       self.blur();                  
      } 
     },10);       
    } 

onpaste在Opera中不起作用。Opera中的onpaste解決方案<= 11.11

有人可以提出更好的解決方案來完成這項任務嗎?

因爲我不喜歡我必須使用setInterval/setTimeout並模擬更改事件。 因爲如果使用triggerHandler('change')使得第二事件觸發用戶模糊,不知道爲什麼實際上,它不應該被主意,因爲數據不經過第一triggerHandler('change')

改變需要一個解決方案來捕捉val()用戶退出之前的textarea ,鼠標粘貼也應該被捕獲。

+0

是啊,我想這是唯一的解決方法。你能把它作爲這個話題的答案張貼,所以我可以接受它嗎? – Somebody 2011-06-10 12:37:51

回答

1

你不能,它根本不被支持。我能想到的唯一解決方法是使用setInterval來檢測這些變化。

2

我知道這對聚會來說有點晚,但我一直在研究在瀏覽器中捕獲粘貼事件。我仍在編寫代碼,但到目前爲止我的代碼是http://jsfiddle.net/JgU37/42/

代碼的要點低於:

$(document).ready(function() { 
    // Fake paste 
    var doFakePaste = false; 
    $(document).on('keydown', function(e) { 
     $('#status').html('metaKey: ' + e.metaKey + 
          ' ctrlKey: ' + e.ctrlKey + 
          ' which: ' + e.which); 

     // These browser work with the real paste event 
     if ($.client.browser === "Chrome") 
      return; 
     if ($.client.os === "Windows" && $.client.browser === "Safari") 
      return; 

     // Check for patse keydown event 
     if (!doFakePaste && 
      ($.client.os === "Mac" && e.which == 86 && e.metaKey) || 
      ($.client.os !== "Mac" && e.which == 86 && e.ctrlKey)) { 
      doFakePaste = true; 
      // got a paste 
      if (!$("*:focus").is("input") && 
       !$("*:focus").is("textarea")) { 
       $('#status').html('fake paste'); 

       // Focus the offscreen editable 
       $('#TribblePaste').focus(); 

       // Opera doesn't support onPaste events so we have 
       // to use a timeout to get the paste 
       if ($.client.browser === "Opera") 
       { 
        setTimeout(function() { 
         doFakePaste = false; 
         var html = $('#TribblePaste').html(); 
         var text = $('#TribblePaste').text(); 
         if (text == '') text = $('#TribblePaste').val(); 
         $('#resultA').text('[o] '+html); 
         $('#resultB').text('[o] '+text); 
         $('#TribblePaste').val(''); 
         $('#TribblePaste').text(''); 
         $('#TribblePaste').blur(); 
        }, 1); 
       } 
      } 
     } 
    }).on('paste', function (e) { 
     // Firefox is not supported - they don't 
     // expose the real clipboard 
     if ($.client.browser === 'Firefox') 
      return; 

     $('#status').html('paste event'); 

     // real pasteing 
     var html = ''; 
     var text = ''; 
     if (window.clipboardData) // IE 
     { 
      text = window.clipboardData.getData("Text"); 
     } 
     if (e.clipboardData && e.clipboardData.getData) // Standard 
     { 
      text = e.clipboardData.getData('text/plain'); 
      text = e.clipboardData.getData('text/html'); 
     } 
     if (e.originalEvent.clipboardData && 
      e.originalEvent.clipboardData.getData) // jQuery 
     { 
      text = e.originalEvent.clipboardData.getData('text/plain'); 
      html = e.originalEvent.clipboardData.getData('text/html'); 
     } 
     $('#resultA').text(html); 
     $('#resultB').text(text); 
    }); 

    // Setup the offscreen paste capture area 
    $('<textarea contenteditable id="TribblePaste"></textarea>').css({ 
     'position': 'absolute', 
     'top': '-100000px', 
     'width': '100px', 
     'height': '100px' 
    }).on('paste', function(e) { 
     setTimeout(function() { 
      doFakePaste = false; 
      var html = $('#TribblePaste').html(); 
      var text = $('#TribblePaste').text(); 
      if (text == '') text = $('#TribblePaste').val(); 
      $('#resultA').text(html); 
      $('#resultB').text(text); 
      $('#TribblePaste').val(''); 
      $('#TribblePaste').text(''); 
      $('#TribblePaste').blur(); 
     }, 1); 
    }).appendTo('body'); 

    $('#data').html('os: ' + $.client.os + ' browser: ' + $.client.browser); 
});