2013-07-28 6 views
10

私はこの小さなjquery関数を使って、textareaフィールドに入力された単語の数を数えました。テキストエリアの単語を数えて制限する

here is the fiddle

、ここのコードです:

のjQuery:

$(document).ready(function() 
{ 
var wordCounts = {}; 
$("#word_count").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; 
    }); 
    $('#display_count').html(finalCount); 
    am_cal(finalCount); 
}).keyup(); 
}); 

、ここでHTMLコードが

私はそれで変更が持つように作ることができる方法を
<textarea name="txtScript" id="word_count" cols="1" rows="1"></textarea> 
Total word Count : <span id="display_count">0</span> words. 

ですこのような出力は

総件数:0語。左の単語:200

そして200ワードに達すると、それを貼り付けたり、textareaフィールドにもっと多くの単語をjqueryで入力することはできません。すなわち、ユーザは、それ以下の単語を正確に入力するように制限する。

助けてください。

ありがとうございます。

編集:私はプラグインをよく知っているので、このコードでのみ変更が必要ですが、メインコードに干渉する可能性があります。

+0

あなたはそれが言葉や文字であるかどうかを確認しますか? – Praveen

+1

p.s. \ bはutfの単語(ヘブライ語、アラビア語、ギリシャ語など)に問題があります – yoavmatchulsky

+0

@yoavmatchulskyあなたは他に何をお勧めしますか? – ashis

答えて

28

keyupイベントは、ユーザーがキーを解放したときに発生し、の後にのキーアクションが実行された後に発生します。

あなたがプログラム#wordcountとしてtextareaあなたが持っているの値を編集する必要があります

$(document).ready(function() { 
    $("#word_count").on('keyup', function() { 
    var words = this.value.match(/\S+/g).length; 

    if (words > 200) { 
     // Split the string on first 200 words and rejoin on spaces 
     var trimmed = $(this).val().split(/\s+/, 200).join(" "); 
     // Add a space at the end to make sure more typing creates new words 
     $(this).val(trimmed + " "); 
    } 
    else { 
     $('#display_count').text(words); 
     $('#word_left').text(200-words); 
    } 
    }); 
}); 

http://jsfiddle.net/7DT5z/9/

+0

私の元の答えはあなたのブロッキングコピー貼り - 200以上のアカウントを考慮しませんでした。これで切り捨てられます。あなたは何が起こっているのかをユーザーにもっと認識させるために、いくつかのUI作業をしたいと思うと思います。 – Michal

+0

は?あなたは何を提案したいですか? – ashis

+0

それは私に働いて良いようです... – ashis

2

単純なプラグインは、ここで見つけることができます:

Simple Textarea Word Counter using jQuery

+1

私はインターネット上で多くのプラグインを知っていますが、私はこれらのコードをわずかに変更して使用することはしません。しかし、私は同じことを理解できませんでした。したがって私はここに質問を掲載しました。 – ashis

+0

プラグインが適切でない場合(または上記の例から関連するコードを抽出できない場合)は、質問にこれを指定する必要があります。 – Sparko

+0

されています。ご質問をご確認ください。提案ありがとう。 – ashis

1

はシンプルif conditionはあなたの問題を解決する追加します。

$.each(wordCounts, function(k, v) { 
    if(finalCount <= 200) { 
     //Todos 
    } 
    else { 
     return false; //prevent keyup event 
    } 
}); 
+0

あなたはそのフィドルを更新できますか?それは大いに感謝してください。 – ashis

+1

@ user1671639 'return false;'はユーザの入力を妨げません。キーアップイベントを防止しますが、キーがすでに解放されてキーのデフォルトアクションが実行された後にイベントが発生します。 – Michal

3

私はこのようにしますか?この場合には、イベントがすでに解雇されたため、イベントをブロックしませんkeyupイベントを停止するreturn falseを使用し

$("#word_count").on('keydown', function(e) { 
    var words = $.trim(this.value).length ? this.value.match(/\S+/g).length : 0; 
    if (words <= 200) { 
     $('#display_count').text(words); 
     $('#word_left').text(200-words) 
    }else{ 
     if (e.which !== 8) e.preventDefault(); 
    } 
}); 

FIDDLE

+0

総件数:213ワード。左の言葉:-13 .. – ashis

+0

限界を超えたときにユーザーを制限していますか? – ashis

+0

@ user2057047 - 私の悪い、それを気付かなかった、答えを編集! – adeneo

0

$(ドキュメント).ready(関数(){ $( "テキストエリア") .on( 'keyUpイベント'、関数(){

   var value = $('textarea').val(); 
       var wordCount = 0; 

       if(value == ""){ 
        $('textarea').empty(); 
       } 
       else{ 

        var regex = /\s+/gi; 
        var wordCount = value.trim().replace(regex, ' ').split(' ').length; 
       } 

        if(wordCount > 25){ 
        var trimmed = $(this).val().split(/\s+/,25).join(" "); 
        $(this).val(trimmed + " "); 
      } 
      else{ 
       $('#display_count').html(25- wordCount +" words left"); 
      } 


       }); 

});

+1

あなたの答えに関する説明や情報を追加して、尋ねられた問題をどのように解決するかを明記して、他の人が簡単に理解できるようにしてください – koceeng

0

正の先読み正規表現を使用して空白を保持することができます。その結果、戻りコードとタブは1つのスペースに縮小されません。このような何か:

var wordLimit = 5; 
 
    var words = 0; 
 
    var jqContainer = $(".my-container"); 
 
    var jqElt = $(".my-textarea"); 
 

 
function charLimit() 
 
{ 
 
    var words = 0; 
 
    var wordmatch = jqElt.val().match(/[^\s]+\s+/g); 
 
    words = wordmatch?wordmatch.length:0; 
 

 
    if (words > wordLimit) { 
 
     var trimmed = jqElt.val().split(/(?=[^\s]\s+)/, wordLimit).join(""); 
 
     var lastChar = jqElt.val()[trimmed.length]; 
 
     jqElt.val(trimmed + lastChar); 
 
    } 
 
    $('.word-count', jqContainer).text(words); 
 
    $('.words-left', jqContainer).text(Math.max(wordLimit-words, 0)); 
 
} 
 
    
 
jqElt.on("keyup", charLimit); 
 
charLimit();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<div class="my-container"> 
 
    <textarea class="my-textarea"></textarea> 
 
    <span class="words-left"></span> words left 
 
<div>

関連する問題