【问题标题】:jQuery: Count words in real timejQuery:实时计算单词
【发布时间】:2011-09-15 04:45:02
【问题描述】:

我正在使用以下 jQuery 功能来实时统计单词:

$("input[type='text']:not(:disabled)").each(function(){
            var input = '#' + this.id;
            word_count(input);

            $(this).keyup(function(){
                word_count(input);
            })

        });

var word_count = function(field) {
        var number = 0;
        var original_count = parseInt($('#finalcount').val());
        var matches = $(field).val().match(/\b/g);
        if(matches) {
            number = matches.length/2;
        }
        $('#finalcount').val(original_count + number)
    }

我遇到的问题是,当我开始在输入字段中输入时,计数会立即增加 2,即使在空格和我的删除键上也是如此。任何想法为什么会发生这种情况?

我正在关注本教程:http://www.electrictoolbox.com/jquery-count-words-textarea-input/

输入: <input class="widest" id="page_browser_title" name="page[browser_title]" size="30" type="text" value="">

显示输入: <input class="widest" disabled="disabled" id="finalcount" name="page[word_count]" size="30" type="text" value="662">

【问题讨论】:

  • 你可以输入你的html来输入和显示div吗?
  • 你有jsfiddle 吗?
  • 这里是 jsfiddle 的链接...jsfiddle.net/M7Jny
  • 小提琴没有为我运行 - 我在控制台中得到undefined is not a function。有人看到它工作了吗?
  • @adam 您必须将word_count 声明移到each 调用上方。

标签: javascript jquery


【解决方案1】:

每次按键都会增加,因为你告诉它:

$('#finalcount').val(original_count + number)

如果再添加一个词,你会发现它不是加2,而是加3。想必你在页面上有几个输入,你打算让finalcount输入显示每个输入的词数.将计数存储在变量中并将变量加在一起以获得最终计数值。或者每次计算每个输入中的单词。

var wordCounts = {};

function word_count (field) {
    var number = 0;
    var matches = $(field).val().match(/\b/g);
    if (matches) {
        number = matches.length / 2;
    }
    wordCounts[field] = number;
    var finalCount = 0;
    $.each(wordCounts, function(k, v) {
        finalCount += v;
    });
    $('#finalcount').val(finalCount)
}

工作演示:http://jsfiddle.net/gilly3/YJVPZ/

编辑:顺便说一句,您有一些机会通过删除一些冗余来简化您的代码。您可以将您发布的所有 JavaScript 替换为:

var wordCounts = {};
$("input[type='text']:not(:disabled)").keyup(function() {
    var matches = this.value.match(/\b/g);
    wordCounts[this.id] = matches ? matches.length / 2 : 0;
    var finalCount = 0;
    $.each(wordCounts, function(k, v) {
        finalCount += v;
    });
    $('#finalcount').val(finalCount)
}).keyup();

http://jsfiddle.net/gilly3/YJVPZ/1/

【讨论】:

  • 我唯一感到困惑的是多余的键位绑定..你能解释一下吗?
  • .keyup() 带有传入的函数参数将 keyup 事件绑定到该函数。但是,如果您省略函数参数,.keyup() 会触发 keyup 事件,调用绑定函数。它是.trigger("keyup") 的等价物。我将其包括在内以匹配您在代码中具有的功能,其中在绑定事件的同时调用 word_count()
  • 最佳答案。如果我想在@出现时将其计为 4 个单词,我该如何写?
【解决方案2】:

编辑

检查this example


为什么不使用split(" ") 而不是匹配和分割结果呢?您将拥有一个包含所有单词的数组,数组的长度将是单词的数量。

var matches = $(field).val().split(" ");

另外,为什么每次都将匹配项添加到旧结果中?

$('#finalcount').val(original_count + number)

这不是每次都加两次吗?

【讨论】:

  • 您可以使用number = matches.filter( function(word) { return word.length > 0}).length; 来避免将多个空格算作单词。
  • @Jose - 感谢您的评论!执行 match(\b\g) 与我正在寻找的完全匹配,它只是由于某种原因无法在 keyup 上正常工作。它计算每个按键操作
  • @Dennis:很好的接触,添加到答案中!
  • @dennismonsewicz:尝试删除最后一行代码中对 original_num 的添加。我还必须更改函数 word_count,使其成为普通函数,而不是存储到变量中。
  • 这是我的新号码 var; number = matches.filter(function(word){ word.length > 0 }).length; 出于某种原因(即使输入的单词长度为五个字符),如果您 console.log 输入数字 var,它会返回 0
猜你喜欢
  • 2013-12-06
  • 1970-01-01
  • 2022-01-06
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 2018-06-16
相关资源
最近更新 更多