计算文本区域字符

Posted

技术标签:

【中文标题】计算文本区域字符【英文标题】:Count textarea characters 【发布时间】:2012-12-14 17:10:38 【问题描述】:

我正在这个website 上为我的文本区域开发字符数。现在,它说NaN,因为它似乎找不到字段中有多少个字符的长度,开头是0,所以数字应该是500。在chrome开发人员工具的控制台中,没有错误发生。我所有的代码都在网站上,我什至尝试使用 jQuery 和常规 javascript 来计算 textarea 字段的字符数,但似乎没有任何效果。

请告诉我在我的 contact.js 文件中的 jQuery 和 JavaScript 代码中我做错了什么。

$(document).ready(function() 
    var tel1 = document.forms["form"].elements.tel1;
    var tel2 = document.forms["form"].elements.tel2;
    var textarea = document.forms["form"].elements.textarea;
    var clock = document.getElementById("clock");
    var count = document.getElementById("count");

    tel1.addEventListener("keyup", function (e)
        checkTel(tel1.value, tel2);
    );

    tel2.addEventListener("keyup", function (e)
        checkTel(tel2.value, tel3);
    );

    /*$("#textarea").keyup(function()
        var length = textarea.length;
        console.log(length);
        var charactersLeft = 500 - length;
        console.log(charactersLeft);
        count.innerhtml = "Characters left: " + charactersLeft;
        console.log("Characters left: " + charactersLeft);
    );​*/

    textarea.addEventListener("keypress", textareaLengthCheck(textarea), false);
);

function checkTel(input, nextField) 
    if (input.length == 3) 
        nextField.focus();
     else if (input.length > 0) 
        clock.style.display = "block";
     


function textareaLengthCheck(textarea) 
    var length = textarea.length;
    var charactersLeft = 500 - length;
    count.innerHTML = "Characters left: " + charactersLeft;

【问题讨论】:

【参考方案1】:
$("#textarea").keyup(function()
  $("#count").text($(this).val().length);
);

上面会做你想要的。如果您想倒计时,请将其更改为:

$("#textarea").keyup(function()
  $("#count").text("Characters left: " + (500 - $(this).val().length));
);

或者,您可以使用以下代码在不使用jQuery 的情况下完成相同的操作。 (感谢@Niet)

document.getElementById('textarea').onkeyup = function () 
  document.getElementById('count').innerHTML = "Characters left: " + (500 - this.value.length);
;

【讨论】:

我想让它说“剩余字符:xxx”xxx 是 500 或更低的数字。 更新后说出你想要的。 document.getElementById('textarea').onkeyup = function() document.getElementById('count').innerHTML = "Characters left: "+(500-this.value.length);;替换代码,它的运行速度会快一百倍;) 对于这个操作,我想我们这里说的只有1-2毫秒……所以我不太在意。 @Cassandra 你不能在 cmets 中做代码块。 My code works fine【参考方案2】:

⚠️ 接受的解决方案已过时。

以下是keyup 事件不会被触发的两种情况:

    用户将文本拖入文本区域。 用户通过右键单击(上下文菜单)在文本区域中复制粘贴文本。

使用 HTML5 input 事件来获得更强大的解决方案:

<textarea maxlength='140'></textarea>

JavaScript (demo):

const textarea = document.querySelector("textarea");

textarea.addEventListener("input", event => 
    const target = event.currentTarget;
    const maxLength = target.getAttribute("maxlength");
    const currentLength = target.value.length;

    if (currentLength >= maxLength) 
        return console.log("You have reached the maximum number of characters.");
    
    
    console.log(`$maxLength - currentLength chars left`);
);

如果你绝对想使用 jQuery:

$('textarea').on("input", function()
    var maxlength = $(this).attr("maxlength");
    var currentLength = $(this).val().length;

    if( currentLength >= maxlength )
        console.log("You have reached the maximum number of characters.");
    else
        console.log(maxlength - currentLength + " chars left");
    
);

【讨论】:

这是一个更好的解决方案 我喜欢这个解决方案。谢谢!【参考方案3】:
textarea.addEventListener("keypress", textareaLengthCheck(textarea), false);

您正在调用 textareaLengthCheck,然后将其返回值分配给事件侦听器。这就是为什么它在加载后不更新或做任何事情的原因。试试这个:

textarea.addEventListener("keypress",textareaLengthCheck,false);

除此之外:

var length = textarea.length;

textarea 是实际的文本区域,而不是值。试试这个:

var length = textarea.value.length;

结合前面的建议,你的函数应该是:

function textareaLengthCheck() 
    var length = this.value.length;
    // rest of code
;

【讨论】:

如果您查看我的 jquery 就绪函数的顶部,textarea 是我之前在 javascript 文件中创建的变量。 是的,它包含文本区域本身,而不是它的值。【参考方案4】:

这是简单的代码。希望它有效

$(document).ready(function() 
var text_max = 99;
$('#textarea_feedback').html(text_max + ' characters remaining');

$('#textarea').keyup(function() 
    var text_length = $('#textarea').val().length;
    var text_remaining = text_max - text_length;

    $('#textarea_feedback').html(text_remaining + ' characters remaining');
);

);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea id="textarea" rows="8" cols="30" maxlength="99" ></textarea>
<div id="textarea_feedback"></div>

【讨论】:

它不会在按住任何键时更新计数器。所以我怀疑是否值得为 $("#textarea")keydown( .. ) 添加另一个处理程序 @Wracker 您可以使用on('input') 在按住任意键的同时获取计数器更新【参考方案5】:

此代码从textareamaxlength 属性中获取最大值,并随着用户键入而减小该值。

DEMO>

var el_t = document.getElementById('textarea');
var length = el_t.getAttribute("maxlength");
var el_c = document.getElementById('count');
el_c.innerHTML = length;
el_t.onkeyup = function () 
  document.getElementById('count').innerHTML = (length - this.value.length);
;
<textarea id="textarea" name="text"
 maxlength="500"></textarea>
<span id="count"></span>

【讨论】:

在元素上将&lt;textarea onKeyUp=" 更改为&lt;textarea onKeyDown=",因为有时第一个字符不计算在内——在我的情况下,我在同一页面中有多个文本区域,并在函数中使用了您的代码:function limitInput( id, i ) var el_t = document.getElementById( id ); var length = el_t.getAttribute( "maxlength" ); var el_c = document.getElementById( 'count-' + i ); el_c.innerHTML = length; el_t.onkeyup = function () document.getElementById( 'count-' + i ).innerHTML = (length - this.value.length); ; 【参考方案6】:

对于那些想要一个没有 jQuery 的简单解决方案的人来说,这里有一个方法。

要放入表单的文本区域和消息容器:

<textarea onKeyUp="count_it()" id="text" name="text"></textarea>
Length <span id="counter"></span>

JavaScript:

<script>
function count_it() 
    document.getElementById('counter').innerHTML = document.getElementById('text').value.length;

count_it();
</script>

脚本先对字符进行计数,然后对每次击键进行计数,并将数字放入计数器范围内。

马丁

【讨论】:

简洁优雅。谢谢你。 jQuery 很好,但我真的希望有更多像你这样的纯 javascript 解决方案。【参考方案7】:

我发现接受的答案并不完全适用于textareas,原因是Chrome counts characters wrong in textarea with maxlength attribute 中指出的原因是换行符和回车符,如果您需要知道何时会占用多少空间,这一点很重要将信息存储在数据库中。此外,由于从剪贴板拖放和粘贴文本,keyup 的使用被贬低,这就是我使用inputpropertychange 事件的原因。下面考虑换行符,准确计算textarea的长度。

$(function() 
  $("#myTextArea").on("input propertychange", function(event) 
    var curlen = $(this).val().replace(/\r(?!\n)|\n(?!\r)/g, "\r\n").length;

    $("#counter").html(curlen);
  );
);

$("#counter").text($("#myTextArea").val().replace(/\r(?!\n)|\n(?!\r)/g, "\r\n").length);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<textarea id="myTextArea"></textarea><br>
Size: <span id="counter" />

【讨论】:

【参考方案8】:

var maxchar = 10;
$('#message').after('<span id="count" class="counter"></span>');
$('#count').html(maxchar+' of '+maxchar);
$('#message').attr('maxlength', maxchar);
$('#message').parent().addClass('wrap-text');
$('#message').on("keydown", function(e)
	var len =  $('#message').val().length;
	if (len >= maxchar && e.keyCode != 8)
		   e.preventDefault();
	else if(len <= maxchar && e.keyCode == 8)
		if(len <= maxchar && len != 0)
	   		$('#count').html(maxchar+' of '+(maxchar - len +1));
	   	else if(len == 0)
	   		$('#count').html(maxchar+' of '+(maxchar - len));
	else
		 $('#count').html(maxchar+' of '+(maxchar - len-1)); 
)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea id="message" name="text"></textarea>

【讨论】:

【参考方案9】:
    $(document).ready(function() 
    $('#characterLeft').text('140 characters left');
    $('#message').keydown(function () 
        var max = 140;
        var len = $(this).val().length;
        if (len >= max) 
            $('#characterLeft').text('You have reached the limit');
            $('#characterLeft').addClass('red');
            $('#btnSubmit').addClass('disabled');            
         
        else 
            var ch = max - len;
            $('#characterLeft').text(ch + ' characters left');
            $('#btnSubmit').removeClass('disabled');
            $('#characterLeft').removeClass('red');            
        
    );    
);

【讨论】:

【参考方案10】:

他们说 IE 对 input 事件有问题,但除此之外,解决方案相当简单。

ta = document.querySelector("textarea");
count = document.querySelector("label");

ta.addEventListener("input", function (e) 
  count.innerHTML = this.value.length;
);
<textarea id="my-textarea" rows="4" cols="50" maxlength="10">
</textarea>
<label for="my-textarea"></label>

【讨论】:

【参考方案11】:

此解决方案将响应键盘和鼠标事件,并应用于初始文本。

    $(document).ready(function () 
        $('textarea').bind('input propertychange', function () 
            atualizaTextoContador($(this));
        );

        $('textarea').each(function () 
            atualizaTextoContador($(this));
        );
    );

    function atualizaTextoContador(textarea) 
        var spanContador = textarea.next('span.contador');
        var maxlength = textarea.attr('maxlength');
        if (!spanContador || !maxlength)
            return;
        var numCaracteres = textarea.val().length;
        spanContador.html(numCaracteres + ' / ' + maxlength);
    
    span.contador 
        display: block;
        margin-top: -20px;
    
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea maxlength="100" rows="4">initial text</textarea>
<span class="contador"></span>

【讨论】:

以上是关于计算文本区域字符的主要内容,如果未能解决你的问题,请参考以下文章

文本区域计数字符验证

Javascript通过“输入”计算文本区域内的文本数量

如何使用 MySQL 在 PHP 中创建不断更新的文本区域?

如何在移动设备上调整灵活文本区域的大小?

文本区域字符限制

正则表达式 - 创建正确解释数字的输入/文本区域