用于文本输入的Javascript字符限制计数器函数
Javascript character limit counter function for text input
我用javascript制作了一个计数器,向用户显示某些文本输入或文本区域的剩余字符数(从设置的限制)。这是代码:
<script type="text/javascript">
function CountRemaining()
{
var limit = 1000;
var count = document.getElementById('press-form-body').value.length;
document.getElementById('counter').innerHTML = ((limit-count) + " characters left");
var timer = setTimeout("CountRemaining()",50);
}
</script>
我上面令人厌恶的功能很好,但我的问题是,我需要多次使用它,每次需要时都制作一个单独的函数,至少可以说这是不切实际的。
我试过了,但没用:
<script type="text/javascript">
function CountRemaining(string, targetcounter, limit)
{
var count = document.getElementById(string).value.length;
document.getElementById(targetcounter).innerHTML = ((limit-count) + " characters left");
var timer = setTimeout("CountRemaining()",50);
}
然后我想我把计时器的语句放错了,所以我把它改成了这个,但仍然不起作用:
var timer = setTimeout("CountRemaining(string, targetcounter, limit)",50);
我迷路了。如有任何帮助,我们将不胜感激。非常感谢。
我认为更好的想法是对这些类型的元素使用"onchange"事件。
基本上,只要文本区域/文本输入失去焦点并发生更改,就可以绑定一个函数来计算剩余的字符数。
document.getElementById('press-form-body').onchange = function() {
// your stuff (double check this to make sure the "this" value is right
// use this as an example
document.getElementById(targetcounter).innerHTML = this.value.length - 1000
}
另一种解决方案是使用"键"事件来监听输入中的任何按键。
document.getElementById('press-form-body').onkeypress = function() {
// your stuff (double check this to make sure the "this" value is right
// use this as an example
document.getElementById(targetcounter).innerHTML = this.value.length - 1000
}
function limittxt()
{
var tval = document.getElementById('press-form-body').value;
tlength = tval.length;
set = 100;
remain = parseInt(set - tlength);
document.getElementById('counter').innerHTML = remain + " characters left";
if (remain <= 0) {
document.getElementById('press-form-body').value = tval.substring(0, tlength - Math.abs(remain)))
}
}
在输入元素中调用此函数,如下所示:
<input type='text' onkeypress='limittxt()' onkeyup='limittxt()' onkeydown='limittxt()'>
我想错误发生在以下行:
var timer = setTimeout("CountRemaining(string, targetcounter, limit)",50);
在这里,我认为它应该是这样的:
var str = "CountRemaining(" + string + "," + targetcounter + "," + limit + ")";
var timer = setTimeout(str,50);
如果你想继续使用计时器定期运行函数,那么你需要类似以下的代码(灵感来自@Sameera Thilakasiri):
function CountRemaining(string, targetcounter, limit){
var count = document.getElementById(string).value.length;
document.getElementById(targetcounter).innerHTML = ((limit-count) + " characters left");
}
setInterval(function() {
// call the function for each of the inputs on the page you need a counter for
CountRemaining('press-form-body', 'counter', 1000);
// etc
}, 50);
然而,我相信@amchang87的方法总体上更好,所以如果可能的话,我建议你这样做。
跟踪剩余的字符数总是有点困难。使用keyup或keypress是一个很好的事件,但这并不包括拖放到元素中的文本,因此人们最终会使用计时器。
如果要监视许多元素,请考虑将它们放入一个数组中,然后在每个间隔调用计时器并检查所有元素。不过,要注意性能,每50毫秒运行一次该函数可能会消耗相当多的浏览器性能,因此请尽量将处理量降至最低。
这意味着可以缓存任何内容,并保持逻辑简单。
编辑
下面的run
和stop
方法可用于在特定元素获得焦点时启动计时器,然后在它们失去焦点时停止计时器。这样你就不会在不需要的时候占用资源。
/编辑
var keyCountCheck = (function() {
var elementArray, timerRef;
return {
// Initialise once
init: function() {
var input, inputs;
// Initialise elementArray if hasn't been done already
// If adding and removing elements, create new aray
// instead each time.
if (!elementArray) {
elementArray = [];
inputs = document.getElementsByTagName('input');
for (var i=0, iLen=inputs.length; i<iLen; i++) {
input = inputs[i];
if (input.type == 'text') {
elementArray.push(input);
}
}
}
timerRef = window.setInterval(keyCountCheck.run, 50);
},
// Run timer
run: function() {
// If setInterval not running, start it
if (!timerRef) {
keyCountCheck.init();
}
var el;
for (var i=0, iLen=elementArray.length; i<iLen; i++) {
checkLength(elementArray[i]);
}
},
// In case there is a reason to stop this thing.
stop: function() {
if (timerRef) {
window.clearTimeout(timerRef);
timerRef = null;
}
}
};
}());
window.onload = keyCountCheck.init;
function checkLength(el) {
// Character limit can be set as a data- attribute or
// class or various other ways. This is the simple way
var limit = 10;
var msgEl = document.getElementById(el.id + '_limitMsg');
if (msgEl) {
msgEl.innerHTML = (limit - el.value.length) + ' characters left. ' + (new Date());
}
}
一些支持HTML的游戏:
<input id="i0" value="1"><span id="i0_limitMsg"></span>
<br>
<input id="i1" value="2"><span id="i1_limitMsg"></span>
<br>
<button onclick="keyCountCheck.stop()">stop</button>
<button onclick="keyCountCheck.run()">run</button>
setInterval(
function CountRemaining(string, targetcounter, limit){
var count = document.getElementById(string).value.length;
document.getElementById(targetcounter).innerHTML = ((limit-count) + " characters left");
},50
);
试试这个方法。
此解决方案的基本概念
var f = function() {function_name(arg1); };
setTimeout(f, msec);
- 函数式编程 - 用于递增计数器的简单 for 循环
- 如何在 JavaScript 中编写仅使用条件语句的硬币计数器函数
- JS计数器:在一个函数中设置不同的速度(间隔)
- 正在更新/检索函数中的专用计数器
- 为什么函数只运行一次?在上一次调用完成后,尝试使用计数器函数多次运行函数
- 函数调用中的循环计数器可视性
- 使用闭包和自调用函数制作计数器
- TypeError:$(..).maxlength不是函数-maxlength插件计数器
- 用于文本输入的Javascript字符限制计数器函数
- 被回调函数中计数器的行为弄糊涂了
- 循环函数不适用于元音计数器.如何将计数器文本加粗
- 函数计数器JavaScript
- 将计数器添加到javascript函数循环中
- Javascript计数器函数,计算文本中的单词数
- for循环的计数器变量在函数中使用时未定义
- firefox上的Javascript函数问题没有通过jquery键盘输入启动计数器(在Chrome和IE上工作)
- 如何在回调setTimeout函数后增加计数器变量
- 如何在Rails中重写简单的.js页面查看计数器cookie函数
- 概念性:在外部函数中创建计数器
- 如何在jquery中使用.on从外部函数清除点击计数器