我希望在按下键时获得字符串长度,就像StackOverflow那样。
我尝试使用onblur
执行此操作,但它无效。我该怎么做?
答案 0 :(得分:43)
关于您应该使用哪个事件的问题:use the input
event, and fall back to keyup
/keydown
in older browsers.
这是一个DOM0风格的例子:
someElement.oninput = function() {
this.onkeydown = null;
// Your code goes here
};
someElement.onkeydown = function() {
// Your code goes here
};
另一个问题是如何计算字符串中的字符数。根据您对“字符”的定义,到目前为止发布的所有答案都不正确。当您确定只输入BMP Unicode符号时,string.length
答案仅可靠。例如,'a'.length == 1
,正如您所期望的那样。
然而,对于补充(非BMP)符号,事情有点不同。例如,''.length == 2
,即使那里只有一个Unicode符号。这是因为JavaScript exposes UCS-2 code units as “characters”。
幸运的是,仍然可以通过一些hackery来计算JavaScript字符串中的Unicode符号数。您可以使用Punycode.js的实用程序函数在UCS-2字符串和Unicode代码点之间进行转换:
// `String.length` replacement that only counts full Unicode characters
punycode.ucs2.decode('a').length; // 1
punycode.ucs2.decode('').length; // 1 (note that `''.length == 2`!)
P.S。我刚刚注意到Stack Overflow使用的计数器脚本会出错。尝试输入,您会看到它(错误地)计为两个字符。
答案 1 :(得分:14)
更新:自从我写这篇文章以来,输入事件得到了相当程度的支持。在IE9中它仍然不是100%,所以你必须等待一段时间才能完全淘汰IE9。然而,根据我对这个问题的回答,输入不仅仅是我所提出的方法的替代品,所以我建议切换。
使用keyup
事件
var inp = document.getElementById('myinput');
var chars = document.getElementById('chars');
inp.onkeyup = function() {
chars.innerHTML = inp.value.length;
}
<input id="myinput"><span id="chars">0</span>
对于那些暗示keydown的人来说只是一个注释。那不行。在将字符添加到输入框或textarea之前,keydown触发,因此值的长度将是错误的(落后一步)。因此,唯一有效的解决方案是keyup,在添加字符后触发。
答案 2 :(得分:5)
您应该将函数绑定到keyup事件
textarea.keyup = function(){
textarea.value.length....
}
使用jquery
$('textarea').keyup(function(){
var length = $(this).val().length;
});
答案 3 :(得分:4)
快速而肮脏的方式是简单绑定到keyup
事件。
$('#mytxt').keyup(function(){
$('#divlen').text('you typed ' + this.value.length + ' characters');
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type=text id=mytxt >
<div id=divlen></div>
&#13;
但更好的方法是将可重用函数绑定到多个事件。例如,对于change(),您也可以预期文本更改,例如粘贴(使用上下文菜单,快捷方式也会被keyup
捕获)
答案 4 :(得分:3)
function cool(d)
{
alert(d.value.length);
}
<input type="text" value="" onblur="cool(this)">
它将返回字符串的长度
而不是blur
使用keydown
事件。
答案 5 :(得分:3)
var myString = 'sample String'; var length = myString.length ;
首先你需要定义一个keypressed处理程序或某种事件触发器来监听, 顺便说一句,获得长度非常简单,如上所述
答案 6 :(得分:2)
我不确定你的意思是通过尝试onblur,但要获得任何字符串的长度,使用它的.length属性,所以在文本框或textarea的情况下:
document.getElementById("textarea").value.length
当然,将该ID更改为实际ID。
答案 7 :(得分:2)
基本上:为keyup
元素分配<textarea>
处理程序,在其中计算<textarea>
的长度,如果长度为<div>
,则将计数写入单独的var min = 15;
document.querySelector('#tst').onkeyup = function(e){
document.querySelector('#counter').innerHTML =
this.value.length < min
? (min - this.value.length)+' to go...'
: '';
}
短于最小值。
这是一个例子 -
body {font: normal 0.8em verdana, arial;}
#counter {color: grey}
<textarea id="tst" cols="60" rows="10"></textarea>
<div id="counter"></div>
{{1}}
答案 8 :(得分:1)
留下回复(以及回答到问题标题),对于未来的googlers ......
您可以使用.length
来获取字符串的长度。
var x ='Mozilla'; var empty ='';
console.log('Mozilla是'+ x.length +'代码单位长');
/ *“Mozilla长7个代码单元”* /
console.log('空字符串的长度为'+ empty.length);
/ *“空字符串的长度为0”* /
如果您打算获得textarea
说 id="txtarea"
的长度,那么您可以使用以下代码。
txtarea = document.getElementById('txtarea');
console.log(txtarea.value.length);
您应该可以使用BMP Unicode符号。如果你想支持像()这样的“非BMP符号”,那么它就是一个边缘情况,你需要找到一些解决方法。
答案 9 :(得分:0)
<html>
<head></head>
<title></title>
<script src="/js/jquery-3.2.1.min.js" type="text/javascript"></script>
<body>
Type here:<input type="text" id="inputbox" value="type here"/>
<br>
Length:<input type="text" id="length"/>
<script type='text/javascript'>
$(window).keydown(function (e) {
//use e.which
var length = 0;
if($('#inputbox').val().toString().trim().length > 0)
{
length = $('#inputbox').val().toString().trim().length;
}
$('#length').val(length.toString());
})
</script>
</body>
</html>
答案 10 :(得分:0)
这是我编写的用于获取 Unicode 字符字符串的函数:
function nbUnicodeLength(string){
var stringIndex = 0;
var unicodeIndex = 0;
var length = string.length;
var second;
var first;
while (stringIndex < length) {
first = string.charCodeAt(stringIndex); // returns an integer between 0 and 65535 representing the UTF-16 code unit at the given index.
if (first >= 0xD800 && first <= 0xDBFF && string.length > stringIndex + 1) {
second = string.charCodeAt(stringIndex + 1);
if (second >= 0xDC00 && second <= 0xDFFF) {
stringIndex += 2;
} else {
stringIndex += 1;
}
} else {
stringIndex += 1;
}
unicodeIndex += 1;
}
return unicodeIndex;
}