我正在计算用户在每个文本区域中键入的单词数量,并将它们相加,然后在用户键入时显示给用户
$("[class^='count[']").bind('keyup click blur focus change paste', function() {
sum = 0;
$("[class^='count[']").each(function() {
var Words = jQuery.trim($(this).val()).split(' ').length;
sum += Number(Words);
if($(this).val() === '') { sum = 0; }
$('#maxwords').children('span').text(sum);
});
});
这是我的HTML:
<ul id="forms">
<li><textarea name="PresentationAbstract1" id="PresentationAbstract1"style="width:700px"></textarea></li>
<li><textarea name="PresentationAbstract2" id="PresentationAbstract2"style="width:700px"></textarea></li>
<li><textarea name="PresentationAbstract3" id="PresentationAbstract3"style="width:700px"></textarea></li>
<li id="maxwords">Total words (<span>0</span>)</li>
</ul>
然而,问题是,直到你到达最后一个文本区域(在本例中是第三个(,这个代码才输出任何内容。一旦你点击最后一个文字区域,它就会计算单词量并输出。
以下是所需项目的URL:http://www.meetingproceedings.com/harvester2/wordcount.html.任何想法都将不胜感激。
使用代码可以改进一些地方,但最突出的是$('#maxwords').children('span').text(sum);
在.each()
迭代中。这将使您的代码在每次计算文本区域中的字数时编写字数。然后是if($(this).val() === '') { sum = 0; }
行,如果文本区域内没有任何内容,它会重置字数(这就是为什么在第三个文本区域上写入时,字数只"输出"到跨度的原因(。
试试这个代码:
$(function() {
var countWords = function () {
var sum = 0;
$("textarea").each(function() {
var words = $(this).val().split(' ');
$.each(words, function(i, v) {
if ($.trim(v) !== '') {sum++;}
});
});
$('#maxwords span').text(sum);
};
// this binds our counting function to the textareas
$("textarea").bind('keyup click blur focus change paste', countWords);
// let's run this on document ready
countWords();
});
这是一个O(n^2)
算法(或者更确切地说是O(nm)
?(,但它可以正确地检查重复的空白。您最好尝试与正则表达式进行匹配,以降低复杂性。
这正在处理我的jsFiddle。
编辑
更新了解决方案,以便在文档就绪时也运行计数功能。或者,您也可以将ready
处理程序添加到textarea
绑定(即$("textarea").bind('ready keyup click blur focus change paste', countWords)
(中,而不是调用函数本身,这也应该上升到文档就绪处理程序,但我只是更喜欢将其写出来,以便它变得清晰。
为什么有这行?尝试删除它。
if($(this).val() === '') { sum = 0; }
如果你遇到一个空字段,它会导致你将总和重置为零,直到填充字段后的所有字段都有内容为止。
$("#form textarea").live('KeyUp', function(){
var sum = 0;
$("#form textarea").each(function(){
sum+= $(this).val().split(' ').length;
});
//put sum in your span
});
若你们想让它是实时的,你们必须在keyup事件上工作。