Bind在使用jQuery的第一个KeyPress上不起作用

时间:2013-03-12 23:51:00

标签: javascript jquery html

我有一个表单,当按下一个键或从文本区域粘贴文本时,剩余的字符数量会出现,但在第一个按键上,该功能不起作用,但在第二个键盘上,所以它就是这样。我的代码如下。

$('.Textarea').keypress(function (event) {
    if ($(this).is(':visible')) {
        $(this).bind('paste copy cut keypress', function () {
            var CharsLeft = $(this).parent('div').find('.CharsLeft');
            var Chars = $(this).val().length;
            $('.CharsLeft').text(5000 - Chars);
        });

        if (event.keyCode == 13) {
            var Value = $(this).val();

            $(this).parent('div').find('.SubMessages').append('<div style="border-top:1px solid #EEE; padding:10px 0;">' + 'You: ' + Value + '</div>');
            $(this).val('');

            event.preventDefault();
        }
    }
});
<div class="Message" style="width:100%; text-align:left;">
    <div class="MsgInfo" style="display:block; border-bottom:1px solid #EEE;">
        <span class="InnerMsg">From: Tera</span>
        <span class="InnerMsg">Subject: Welcome To Tera!</span>

        <span class="InnerMsg">When: 2 Hours Ago</span>
        <div style="clear:both;"></div>
    </div>
    <div class="UserMsgContent" style="display:block; padding:10px; line-height:1.5em;">
        <div class="SubMessages">
            <div style="padding:10px 0;">Hello</div>
        </div>
        <textarea style="width:930px;" class="Textarea" placeholder="Reply!" maxlength="5000"></textarea>
        <div style="margin-top:10px;">
            <div class="CharsLeft">5000</div>Characters Left
        </div>
    </div>
</div>

5 个答案:

答案 0 :(得分:5)

使用keyup代替读取keypress上的值的长度并不能提供准确的文本长度。

当您按下该键时,keypress事件将触发,但您的textarea尚未使用新文本进行更新,直到释放该键为止。使用keyup,类似于以下内容:

$(this).bind('paste copy cut keyup', function() {
    var CharsLeft = $(this).parent('div').find('.CharsLeft');
    var Chars = $(this).val().length;

    $(CharsLeft).text(5000 - Chars);    
});

DEMO - 使用密钥更改


我在DEMO中唯一改变的是绑定选择器到$('.Textarea').bind()以使其在小提琴中起作用,因为$(this)在小提琴中不起作用。

答案 1 :(得分:3)

奇怪的行为。
绑定keyup keydown而不是keypress修复了它。 http://jsfiddle.net/np9w5/1/

答案 2 :(得分:0)

$(this).on("keypress", function() {
    var CharsLeft = $(this).parent('div').find('.CharsLeft');
    var Chars = $(this).val().length;

    $(CharsLeft).text(5000 - Chars);    
});

尝试使用.on

答案 3 :(得分:0)

试试这个。

$(this).keypress(function() {
    var CharsLeft = $(this).parent('div').find('.CharsLeft');
    var Chars = $(this).val().length;

    $(CharsLeft).text(5000 - Chars);    
});

答案 4 :(得分:0)

为什么要将CharsLeft包装在另一个$()中?

应该是:

CharsLeft.text(5000 - Chars);  

此外,我相信你应该使用.on()

而不是.bind()(已弃用)

以下是解决方案的jsFiddle:http://jsfiddle.net/FzWaD/

还有更多错误修复。