【问题标题】:Limit words in a textarea限制文本区域中的单词
【发布时间】:2010-11-30 22:57:38
【问题描述】:

我已经对此进行了一些搜索。找到了很多计算字符甚至计算单词的脚本,但找不到一个删除任何超过字数限制的单词的脚本....

到目前为止,这是我的脚本...:

var maxWords = 10;
function countWordsLeft(field) {    
    totalWords = field.value.split(' ');    
    if (totalWords.length > maxWords)
        field.value = field.value.substring(0, maxWords);
    else
        document.getElementById('description_count').innerHTML = maxWords - totalWords.length;
}

我从字符计数脚本中复制了以下行,但显然这行不通,因为我正在计算单词

if (totalWords.length > maxWords)
   field.value = field.value.substring(0, maxWords);

如何让脚本删除超出限制添加的任何额外单词?我需要这个,特别是如果他们粘贴在描述中......它需要计算单词,然后删除任何超过限制的单词。

感谢您的帮助!

【问题讨论】:

  • 定义单词。这些词是“独立的”、“43rd”、“café”、“курица”吗?

标签: javascript


【解决方案1】:
field.value = field.value.split(' ').splice(0, maxWords).join(' ');

更新
我注意到这也将n 连续的空格算作n-1 单词,这是由这个固定的:

var a = field.value.split(' ');
var words=0, i=0;
for(; (i<a.length) && (words<maxWords); ++i)
  if(a[i].length) ++words;
field.value = a.splice(0,i).join(' ');

【讨论】:

    【解决方案2】:

    我可能会使用这个:

    var maxWords = 10;
    function limitLengthInWords(field) {
        var value = field.value,
            wordCount = value.split(/\S+/).length - 1,
            re = new RegExp("^\\s*\\S+(?:\\s+\\S+){0,"+(maxWords-1)+"}");
        if (wordCount >= maxWords) {
            field.value = value.match(re);
        }
        document.getElementById('description_count').innerHTML = maxWords - wordCount;
    }
    

    这将保留单词开头和单词之间的空格。

    【讨论】:

      【解决方案3】:

      jQuery 简单可数插件
      为任何文本输入或文本区域提供字符或单词计数器(和限制器)。在键入或粘贴文本时工作。

      @版本 0.4.2
      @主页http://github.com/aaronrussell/jquery-simply-countable/
      @作者亚伦·拉塞尔http://www.aaronrussell.co.uk

      版权所有 (c) 2009-2010 Aaron Russell
      麻省理工学院双重许可http://www.opensource.org/licenses/mit-license.php
      和 GPL http://www.opensource.org/licenses/gpl-license.php 许可证。

      【讨论】:

        【解决方案4】:

        这个好帮手

        function limit_words($post_content, $word_limit=30)
        {
        $words = explode(" ",$post_content);
        return implode(" ",array_splice($words,0,$word_limit));
        }
        

        【讨论】:

          【解决方案5】:
          <script language="javascript" type="text/javascript">
          function limitText(limitField, limitCount, limitNum) {
              if (limitField.value.length > limitNum) {
                  limitField.value = limitField.value.substring(0, limitNum);
              } else {
                  limitCount.value = limitNum - limitField.value.length;
              }
          }
          </script>
          

          【讨论】:

            【解决方案6】:
            function wordlimit(s, n){
             var rx= RegExp('([a-zA-Z]+\\S+\\s+){'+n+'}','g'); 
             while(rx.test(s)){
              return s.substring(0, rx.lastIndex);
             }
             return s;
            }
            

            //测试

            s= 'the quick red fox jumps over the lazy brown dog\'s back';
            alert(wordlimit(s, 8)); 
            

            // field.value=wordlimit(field.value,8);

            【讨论】:

              【解决方案7】:

              或者你可以这样做:

              function truncateStringToMaxWords(string, maxWords)
              {
                var whitespace = string.match(/\s+/g);
                var words = string.split(/\s+/);
              
                var finished = [];
                for(var i = 0; i < maxWords && words.length > 0; i++)
                {
                  if (words[0] == "") { i--; }
                  finished.push(words.shift());
                  finished.push(whitespace.shift());
                }
                return finished.join('');  
              }
              field.value = truncateStringToMaxWords(field.value, 5);
              

              这将使您的空白保持完整。

              【讨论】:

                【解决方案8】:

                此功能将限制,不允许更多的单词:

                function limitWords(id) {
                    var maxWords=5;
                    var d=document.getElementById(id);
                    if ( d.value.split(' ').length > maxWords ) {
                        t=d.value.substring(0,d.value.lastIndexOf(' '));
                        d.value=t.substring(0,t.lastIndexOf(' ')+1);
                    }
                }
                

                示例 HTML

                <textarea id='txt' rows="2" onkeyup="limitWords(this.id)"></textarea>
                

                【讨论】:

                  【解决方案9】:

                  我是这样做的

                  function limitWord(myString, limit){
                   return myString
                    .replace(/\s+/g, ' ') // remove extra spaces between words
                    .split(' ')           // split string into array (using spaces as seperator)
                    .splice(0, limit)     // splice the array to the desired word limit
                    .join(' ');           // join it back into string (using spaces as seperator)
                  }
                  

                  【讨论】:

                  • 此答案已被标记为质量审查,因为它的长度。 SO 更喜欢带有一些文字的答案,解释此代码如何解决 OP 的问题。请阅读How to Answer。谢谢。
                  • 现在更好@EngineerDollery?
                  • 就我个人而言,我认为解决方案很简单,不需要太多的冗词。但是,它被标记了,不幸的是它会再次被标记。我认为标记系统着眼于文本与代码之间的平衡,而您使代码变得更长,因此您的平衡更加不平衡。
                  • 我以前回答过这样的帖子。几乎没有任何文字。 stackoverflow.com/a/14731922/382536
                  • 就像我说的,标记这些答案的不是我,而是 SO 系统。我不确定算法,所以高票帖子可能根本不会被标记。如果您阅读How to Answer 的帖子,您就会明白我的意思。
                  猜你喜欢
                  • 2017-02-15
                  • 2016-06-18
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-10-08
                  • 2012-04-21
                  • 2015-06-08
                  • 2011-07-28
                  • 1970-01-01
                  相关资源
                  最近更新 更多