2014-09-12 46 views
1

我有一种情况,在这里我必须限制用户在4个textarea字段的组合上只输入300个字符。例如,如果他第一个输入300,他就不能在第二个输入任何内容,或者他也可以在每个输入75个单词。如何做JavaScript来计算剩余字数在4个textarea字段的组合上有多少

我试图做一个JS计算剩余的话,也限制了现场不接受更多的单词时,剩余的词变成0

谁能帮助?如果这种结构会出现这种情况,那将会很好。

<textarea id="MyTextBox1" class="MyTextBox" cols="60" rows="8"></textarea> 
<textarea id="MyTextBox2" class="MyTextBox" cols="60" rows="8"></textarea> 
<textarea id="MyTextBox3" class="MyTextBox" cols="60" rows="8"></textarea> 
<textarea id="MyTextBox4" class="MyTextBox" cols="60" rows="8"></textarea> 

<p><span id="remainingWords"></span> Words Remaining</p> 

我得到了一个工作示例但只有一个第一textarea的,现在我种股票。

http://jsfiddle.net/vinicius5581/waayh7xu/2/

回答

1

试着这么做

$(document).ready(function() { 
     $('.MyTextBox').live("keyup", function (e) { 
      var v = ""; 
      $('.MyTextBox').each(function() { v = v + " " + $(this).val().trim(); } 
      var WordsUsed = v.replace(regex, ' ').split(' ').length; 
      WordsRemaining = parseInt(WordsLimit) - parseInt(WordsUsed); 
      if (WordsUsed == WordsLimit) { 
       $('#remainingWords').html("0 Words remaining."); 
       $('#ExtraWords').html(""); 
      } 
      else if (WordsUsed > WordsLimit) { 
       $('#remainingWords').html("0"); 
       var extraWord = parseInt(WordsUsed) - parseInt(WordsLimit); 
       $('#ExtraWords').html("You have entered " + extraWord + " extra Words!!"); 
      } else { 
       $('#remainingWords').html(WordsRemaining); 
      } 
     }); 
    }); 

以上将与所有.MyTextBox类元素工作,张数每个词中使用的词。它也很好地跟踪总量利用你现有的代码。

见小提琴 - http://jsfiddle.net/2b6agtt9/

针对OP的意见我已经加入,试图阻止限制后附加文本进入一些额外的代码。原始代码试图使文本框只读,但当然这会阻止编辑。所以我提出了一个基于按键操作的解决方案。

为了防止多余的话之后极限尝试这样的事情

 $('.MyTextBox').live("keydown", function (e) { 
      console.log(e); 
      if (WordsRemaining == 0) { 
       // Allow all characters except space 
       if (e.keyCode == 32) return false; 
      } else if (WordsRemaining < 0) { 
       if (e.keyCode > 46 || e.keyCode == 32) return false; 
      } 
     }); 

上面的代码没有完全傻瓜证明,但将防止明显的错误。

它将防止增加一个额外的单词并达到单词限制,用户可以根据需要编辑现有的单词。如果字数限制以某种方式规避,也许通过粘贴大量文本,则可以防止添加其他文本,同时允许编辑和突出显示额外的字数。

更新小提琴在:http://jsfiddle.net/2b6agtt9/2/

+0

干得好Kami!它的工作原理与它应该一样。 – 2014-09-12 13:03:20

+0

在玩了一会之后,我注意到它不会将单词限制在限制数字,而是在数字达到0后继续添加单词。对此有何想法? – 2014-09-12 16:10:26

+0

@ViniciusSantana我已经更新了代码,并提供了如何防止文本超出限制的示例。您可以进一步调整此代码以满足您的需求。 – Kami 2014-09-12 16:31:49

1

这个人是不是很辛苦,你就必须让你有充分的文本区域计数。为了便于使用,我假设页面上只有四个文本区域,否则可以使用类选择器。这是对我工作:

$('textarea').live("keyup", function (e) { 
    var WordsUsed = 0; 
    function countWords(textarea){ 
     // be sure to check if theres a value, as split.length will return 1 if it didn't split anywhere. 
     return textarea.val() != "" 
      ? textarea.val().trim().split(' ').length 
      : 0; 
    } 
    WordsUsed += countWords($('#MyTextBox1')); 
    WordsUsed += countWords($('#MyTextBox2')); 
    WordsUsed += countWords($('#MyTextBox3')); 
    WordsUsed += countWords($('#MyTextBox4')); 
    // do the rest of your code here - I'm not going to repeat it but it works 
}); 

我用了一个临时的函数调用countWords - 我把它在这里的当地情况,但它是在全球也是有用的。然后我浏览所有的文本区域(你也可以通过for循环运行其中的al,并在本地范围内没有函数)。现在使用的单词数量是所有文本字段的组合,并且一旦您击中了多个单词,就可以禁用所有这些单词。

+0

这一个是好的,但它违背了,我没有列出的要求。页面上还有另一个textarea,不应该包含在这里,所以我想我们必须坚持使用类的计划。你怎么看? – 2014-09-12 13:10:42

+0

你可以很容易地用'$('textarea.Class')'或$('。textareaClass')'代替'$('textarea')',然后它只会用于那个类的文本区域。然后你甚至可以用foreach循环替换四个'WordsUsed + = countWords($('#MyTextBox1'));''('textarea.Class')。each(function(){WordsUsed + = countWords($ (this));});' - 这将删除重复的代码。 (另外,我在文章的顶部提到了这个问题,但是有一点说明了这一点) – somethinghere 2014-09-12 13:16:26

0

你可以试试这一个,要简单得多:)

var limit = 300; 
$("textarea").on('keydown',function(e){ 
    var count=0; 

    $("textarea").each(function(index,elem){  
     count += $(elem).val().length; 
    }) 

    if (count>= limit) 
    { 
     e.preventDefault(); 
     e.stopPropagation(); 
    } 

    $('#ExtraWords').html(limit - count); 
}) 

http://jsfiddle.net/waayh7xu/7/

+0

你的脚本正在计算字符而不是单词。 – 2014-09-12 13:04:06

+0

通过将其与我在答案中提到的内容相结合进行了简单修改,否则这也相当优雅。 – somethinghere 2014-09-12 14:15:49