为什么在预粘贴时将事件粘贴到jquery会触发?

时间:2011-12-19 06:46:21

标签: javascript javascript-events mouseevent jquery

我正在尝试制作类似于 Twitter 的文本框,为此我编写了代码

  • 字数
  • 使用的事件更改,加密和粘贴

Keyup和Change Events工作正常,但粘贴事件有点奇怪,当我在textarea中粘贴一些东西时,字数不会在那一刻发生变化,经过一些调试我发现粘贴事件在粘贴之前会激活文本框上的内容。我不知道他们是如何处理Twitter的。   这是我的代码:   事件:

'click #textboxId'  : 'submitQuestion'
'keyup #textboxId'  : 'wordCounter'
'change #textboxId' : 'wordCounter'
'paste #textboxId'  : 'wordCounter'

wordCounter: ->  
  #Code for Word Count#  

由于粘贴事件的预粘贴性质,该实例的工作计数不会发生变化 您的建议和帮助将不胜感激,谢谢您的时间。

4 个答案:

答案 0 :(得分:9)

见这个例子。

http://jsfiddle.net/urEhK/1

$('textarea').bind('input propertychange', function() {
    $('#output').html($(this).val().length + ' characters');
});

这种行为非常奇怪。您会认为其中一个事件能够正确捕捉到这一点吗?我很惊讶,谷歌没有更多答案。

答案 1 :(得分:2)

   function update()    
   {
       alert($textbox.val().length);
   }


    var $textbox = $('input');
    $textbox.bind('keyup change cut paste', function(){
        update(); //code to count or do something else
    });
    // And this line is to catch the browser paste event
    $textbox.bind('input paste',function(e){ setTimeout( update, 250); });  

答案 2 :(得分:0)

您现在应该使用on()而不是bind()see this post。 创建命名函数也没什么必要,你可以创建一个匿名函数。

$('#pasteElement').on('paste', function() {
    setTimeout(function(){
        alert($('#pasteElement').val());
    }, 100);
});

答案 3 :(得分:0)

你可以做一件事,首先获得原始数据。然后您可以获取事件粘贴数据并添加它们。

  $("#id").on("paste keypress ",function(event){
                // eg. you want to get last lenght
                 var length=$("#id").val().length;
                 if(event.type == "paste"){
                    //then you can get paste event data.=

length+=event.originalEvent.clipboardData.getData('text').length;
                }


            });`