【问题标题】:Counting input chars - use onkeyup or onkeydown?计算输入字符 - 使用 onkeyup 还是 onkeydown?
【发布时间】:2011-08-23 17:44:24
【问题描述】:

我需要为用户设置最大字符输入,类似于 stackoverflow.com 的工作方式。我计划使用 javascript 向用户提供反馈并计算字符数。只允许不超过最大字符数的提交。我不打算使用 xhtml 输入属性来限制此数量,因为只要未提交字符,我将允许字符超额。在后端,我将 mysql 中的 varchar 字段设置为charmax。

问题是,我如何计算字符输入,我是基于 onkeydown() 还是 onkeyup()。我不太清楚为什么有两个函数,因为一个向下的键必须出现,所以我应该使用哪个来进行计数?

【问题讨论】:

  • 你实际上应该只使用一个插件,比如roy-jin.appspot.com/jsp/textareaCounter.jsp。但要回答您的问题,您应该绑定 keyUp 以及其他事件(如粘贴),并且可能应该设置 0 毫秒的超时以产生更新文本。
  • This question 似乎是相关的。

标签: javascript


【解决方案1】:

HTML:

<input type='text' id='text'/>

JS:

function textLength(value){
   var maxLength = 144;
   if(value.length > maxLength) return false;
   return true;
}

document.getElementById('text').onkeyup = function(){
     if(!textLength(this.value)) alert('text is too long!');
}

这是一个小提琴演示:http://jsfiddle.net/maniator/L2LRK/

【讨论】:

  • &lt;input type="text"&gt;,不是&lt;input id="text"&gt;
  • @Matt -- 我没有为输入输入一个类型......如果你觉得我需要它,我可以添加一个......
  • Question is, how do I count character inputs, do I base it off of onkeydown() or onkeyup() 答案应该是否定的。有更简单、更可靠的方法可以做到这一点。例如。 @GolezTrol 回答。
【解决方案2】:

使用document.getElementById('YourInputBoxId').value.length获取文本长度。

不要使用键盘事件来跟踪字符数。 Ctrl+V 是一个按键(或两个可能),但它会导致您的文本增长兆字节。 :) 您可以使用这些事件来使用当前字符数更新标签。

除了onkeyup,您还可以使用oninput事件,当您在输入框中输入时触发。

记住,还要经常检查服务器。 Javascript 可能会失败或被故意禁用。您的服务器应始终执行必要的检查。虽然我相信 MySQL 会自动截断太大的文本...

一个不错的选择是设置输入的 maxlength 属性。这样,即使没有 javascript,也会强制执行最大长度。然后,您可以删除该标志并从 javascript 添加必要的事件。这样,您将拥有适用于 javascript 浏览器的可用解决方案,同时对非 javascript 浏览器进行更严格的检查,我认为这总比不检查要好。

【讨论】:

  • 谢谢,我可以用它来拉取值。所以使用 onkeyup() 进行反馈显示,但字符实际上显示在 onkeydown() 上,所以如果你想以细节为导向 onkeydown()更准确。
  • @Chris .value.length 不会总是在 keyDown 事件上更新(或者至少在大约 5 个月前我这样做时不在 Chrome 上),这就是 keyUp 通常被绑定的原因。无论是谁在进行全面的否决票,都应该停止或给出解释。我已将两者都投回 0,因为两者都是非常好的答案。
  • 谢谢。我认为有些混乱,因为我写了“不要使用键盘事件”。我认为 Chris 的意思是计算对这些事件的调用以获取字符数,而不是获取框中文本的实际长度。
  • 添加了一些关于oninput的内容。
【解决方案3】:

我在您的建议中发现了错误。这是我的测试模式:

如果限制最大字符为 05 个字符。 测试值:123456,ABCDEF

1:使用键盘,正常输入文字

对于 123456,将删除 6 个

对于 ABCDEF,F 将被删除

结果:正常

2:使用键盘,从其他地方复制粘贴123456和ABCDEF

对于 123456,粘贴 ​​(Ctrl V): "123456123456" => 456123456 将被删除

对于 ABCDEF,粘贴 (Ctrl V): "ABCDEFABCDEF" => DEFABCDEF 将被删除

结果:正常

3:使用鼠标,从其他地方复制粘贴123456和ABCDEF

对于 123456,粘贴(右键单击 + 粘贴):“123456123456” => 不会删除任何字符

对于 ABCDEF,粘贴(右键单击 + 粘贴):“ABCDEFABCDEF” => 不会删除任何字符

结果:假;

4:使用鼠标,在输入其他内容后从其他地方复制粘贴 123456 和 ABCDEF

对于 123456,粘贴(右键单击 + 粘贴):“123456123456” => 不会删除任何字符,使用键盘输入“123” => 将删除所有文本。

对于 ABCDEF,粘贴(右键单击 + 粘贴):“ABCDEFABCDEF” => 不会删除任何字符,使用键盘输入“ABC” => 将删除所有文本。

结果:假;

我在我的项目中以相同的功能给你我的错误。在我的函数中,这种模式对于 ALL 都是错误的。这里是我的:jsfiddle这个功能是我在网上找到的,不好意思忘记出处了,如果你是楼主,请在这里公开。

HTML:

//Count content
  maxL = 2000;
  var bName = navigator.appName;

  function taLimit(taObj) {
    if (taObj.value.length == maxL) return false;
    return true;
  }

  function taCount(taObj, Cnt) {
    objCnt = createObject(Cnt);
    objVal = taObj.value;
    if (objVal.length > maxL) objVal = objVal.substring(0, maxL);
    if (objCnt) {
      if (bName == "Netscape") {
        objCnt.textContent = maxL - objVal.length;
      } else {
        objCnt.innerText = maxL - objVal.length;
      }
    }
    return true;
  }

  function createObject(objId) {
    if (document.getElementById) return document.getElementById(objId);
    else if (document.layers) return eval("document." + objId);
    else if (document.all) return eval("document.all." + objId);
    else return eval("document." + objId);
  } //End Count content
You have <b><label id="myCounter">2000</label></b> characters left
<br/>
<textarea class="inputtextfield" onKeyPress="return taLimit(this)" onKeyUp="return taCount(this,'myCounter')" id="content" name="content" rows=7 wrap="physical" cols=40></textarea>

我很困惑如何修复我的错误。

【讨论】:

    【解决方案4】:

    有两个函数,因为有两个不同的事件。例如,如果您想知道有人按下Ctrl + Enter 的时间,您需要确切知道每个键何时按下以及何时松开。

    在您的情况下(达到限制时显示警告)我会使用keydown,因为这是首先发生的事情,这样您就可以在用户超过 X 个字符的那一刻知道。如果您使用keyup,用户可能会按下一个键几秒钟而看不到任何消息。

    要计算你可以做的字符:

    document.getElementById("myInput").value.length
    

    【讨论】:

    • neato...我要放入一个“复活节彩蛋”
    猜你喜欢
    • 2020-08-04
    • 2017-01-01
    • 2015-07-21
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多