【问题标题】:How can I count the characters from a textarea?如何计算文本区域中的字符?
【发布时间】:2021-07-11 15:55:52
【问题描述】:

我正在尝试为我的 `textarea` 标签实现一个字符计数器,但某些东西肯定是行不通的。我尝试了几种方法,但都没有成功。我知道网络上有很多实现,但我找不到适用于我的代码的东西。我是这个领域的初学者,我根本无法理解它是如何工作的。 代码:
   ...............
    <div id='id_text' class="control-group">
           <label for="id_text" class="control-label">
                Text
           </label>
          <div class="controls">
              <label for="field"></label>
                 <textarea id="field" onkeydown="countChar(this)" maxlength="800"></textarea>
            </div>
          <span>Char Left:</span>  <span id="charNum"> </span>
   </div>
....................................

脚本:

<script src="http://code.jquery.com/jquery-1.5.js"></script>
    <script>
      function countChar(val) {
        var len = val.value.length;
          $('#charNum').text(800 - len);
        }

    </script>

注意:脚本位于 HTML 页面的底部(我试图将其放在顶部,但没有成功)。 脚本很简单:我只想从 textarea 中获取字符数,然后将剩余的字符显示给用户。

我在这里寻找其他答案,我在其他网站上寻找答案,但我认为我的代码有问题,我不明白。

注意2:文本区域是&lt;form&gt; 的一部分。我正在使用 django 框架。

非常感谢您的帮助和关注!

编辑:

我已经尝试了 Rory 的代码,这就是我所看到的。

【问题讨论】:

    标签: javascript python jquery django django-forms


    【解决方案1】:

    在 JavaScript 中有 2 种方式计算文本区域中的字符

    1. 要使用单词之间的空格计算字符,您只需获取 texarea 的内容,并测量“长度”。请记住:“String 原型对象有一个“length”属性,其初始值为 0”

    //injecting "hello world" (10 characters and 1 space) into the DOM
    let newDiv = document.createElement("div")
    let newContent = document.createTextNode(`hello world`)
    newDiv.setAttribute("id", "Div1")
    newDiv.appendChild(newContent)
    document.body.appendChild(newDiv)  
    let str = document.getElementById("Div1").innerHTML
    //counting the number of characters injected
    alert(`LENGHT = ` + `${str.length}`); // HERE THE PROPERTY LENGTH ..
    1. 这里计算字符时没有单词之间的空格“:

    //injecting "hello world" (10 characters and 1 space) into the DOM
    let newDiv = document.createElement("div")
    let newContent = document.createTextNode(`hello world`)
    newDiv.setAttribute("id", "Div1")
    newDiv.appendChild(newContent)
    document.body.appendChild(newDiv)  
    let str = document.getElementById("Div1").innerHTML
    //first you split the content using String.prototype.split ( separator, limit ) then concatenate the array obtained by the split without spaces using  : Array.prototype.join ( separator )
    alert(str.split(' ').join('').length) 

    更新: 关于性能遵循@jallmer 的思路使用replace + REGEX 方法

    //injecting "hello world" (10 characters and 1 space) into the DOM
    let newDiv = document.createElement("div")
    let newContent = document.createTextNode(`hello world`)
    newDiv.setAttribute("id", "Div1")
    newDiv.appendChild(newContent)
    document.body.appendChild(newDiv)
    
    //testing algorithms perfs
    let str1 = document.getElementById("Div1").innerHTML
    let str2= document.getElementById("Div1").innerHTML
    
    //testing algorithm 1
    console.log(`str1 = ${str1}`)
    const t0 = performance.now();
    console.log(str1.split(' ').join('').length)
    const t1 = performance.now()
    console.log(`algorithm 1 took ${t1 - t0} milliseconds.`);
    
    //testing method 2
    console.log(`str2 = ${str2}`)
    const t2 = performance.now();
    console.log(str2.replace(/\s/g, '').length)
    const t3 = performance.now()
    console.log(`algorithm 2 took ${t3 - t2} milliseconds.`);

    奇怪的是,我的 chrome 开发工具(Chrome for Gnu/Linux,版本 90.0.4430.93(官方构建)(64 位))上的结果不同。需要检查的东西

    【讨论】:

    • 这是一个很酷的观点。非常感谢您的回答! :D 祝你一切顺利
    • 不知道它是否会更快或更少资源密集,但您可以使用 str.replace(/\s/g, '') 替换空格。如果存在的话,这也将摆脱制表符和行尾。另一方面,使用 split 可以获取字数。
    【解决方案2】:

    keydown 事件在字段中的值更新之前触发。因此,您的 JS 显示来自 previous 按键的字符计算。 keyup 是两者中更好的选择。

    但是,话虽如此,您应该改用 input 事件,因为它涵盖了字段值更改而 keydown/keyup 不会更改的所有情况 - 例如使用鼠标复制和粘贴.

    还要注意 jQuery 1.5 已经过时了——事实上已经超过 10 年了。您应该使用在回答时为 3.6 的最新版本。此外,使用onX 事件属性不再是好的做法。寻找不显眼地附加您的事件处理程序,而不在 HTML 中包含任何 JS。由于您已经在使用 jQuery,因此您可以使用 on() 方法来做到这一点

    说了这么多,试试这个:

    jQuery($ => {
      const $charNum = $('#charNum');
    
      $('#field').on('input', e => {
        let len = e.target.value.length;
        $charNum.text(800 - len);
      }).trigger('input');
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
    <div id='id_text' class="control-group">
      <label for="id_text" class="control-label">Text</label>
      <div class="controls">
        <label for="field"></label>
        <textarea id="field" maxlength="800"></textarea>
      </div>
      <span>Char Left:</span> <span id="charNum"> </span>
    </div>

    【讨论】:

    • 嗨罗里!非常感谢您的详尽回答!我是一个完全初学者,我还不知道如何正确使用 JQ。我编辑了我的答案并发布了图片以查看它在我的网页上的外观!我用了我们的sn-p,复制粘贴,把所有东西都放在了它应该在的地方,但还是不行……我认为这是我的浏览器/Python/PyCharm的问题。我不知道..
    • 尝试在浏览器中打开 devtools,通常按 F12,然后检查控制台是否有可以调试的错误。
    • 有两个问题,一个是表单元素必须有标签,另一个是“元素的ID应该是唯一的”。仅此而已。
    • 所以,我尝试了以下方法:我在控制台网页上运行了代码,在那里,它完美无缺,但由于某种原因,我的 IDE 无法正常工作,我完全不知道为什么...... .....
    • 谢谢罗里!经过 2 小时的尝试,我终于发现 JQuery 的导入脚本应该放在我的页面底部,然后是我的脚本。现在它正在工作。非常感谢!
    猜你喜欢
    • 2012-12-14
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    相关资源
    最近更新 更多