TEXTAREA フィールドに文字カウンターを追加する作業を行っています。このタスクには、オンラインで利用できる非常に多くのソリューションがあります。
「ストップ アット ゼロ」ソリューション
私が抱えている問題は、事実上すべてのソリューションがユーザー入力を 0 で終了させることです。これは効果的だと思いますが、使いやすさの点では最適ではありません。たとえば、ユーザーがテキストを TEXTAREA に貼り付け、テキストがフィールドの制限を超えた場合、このゼロで停止するソリューションは、余分なテキストを突然切り捨てます。ユーザーは、不足しているコンテンツを見つけてから、メッセージを編集したり、2 番目のフォームを送信したり、その他の負担を負う必要があります。
「負の文字数」ソリューション
他のソリューションでは、ユーザーが必要なすべてを入力できます。文字カウンターは正から負になります。これらのカウンターの問題は、強制力がないことです。ユーザーは、負の文字数でもフォームを送信できます。
Twitter ソリューション
Twitter は正しいと思います。ユーザーは必要なすべてを入力し、余分なテキストを負の文字数で強調表示できます (および、必要のない色付きの背景)。カウントが負の場合、送信ボタンを無効にします。
私の (不完全な) 解決策
Google で見つけたサードパーティのコードを使用して、カウントに関して完全に機能する文字カウンターを考案しました。しかし、私はJSに少し慣れていないので、強制部分をコーディングできませんでした。
これが私の質問です:
カウンターが負の数の場合、フォームの送信を防ぐコードを取得するにはどうすればよいですか?
HTML
<form action="" method="post">
<div>
<textarea name="comments" id="comments" cols="50" rows="10"></textarea>
</div>
<div>
<input type="submit">
</div>
</form>
CSS
form div {
position: relative;
}
form .counter {
position: absolute;
left: 300px;
bottom: -25px;
font-size: 25px;
font-weight: bold;
color: #ccc;
}
form .warning {color: orange;}
form .exceeded {color: red;}
JavaScript
<script src="/js/jquery.js"></script>
<script>
(function($) {
$.fn.charCount = function(options){
// default configuration properties
var defaults = {
allowed: 100,
warning: 25,
css: 'counter',
counterElement: 'span',
cssWarning: 'warning',
cssExceeded: 'exceeded',
counterText: ''
};
var options = $.extend(defaults, options);
function calculate(obj){
var count = $(obj).val().length;
var available = options.allowed - count;
if(available <= options.warning && available >= 0){
$(obj).next().addClass(options.cssWarning);
} else {
$(obj).next().removeClass(options.cssWarning);
}
if(available < 0){
$(obj).next().addClass(options.cssExceeded);
} else {
$(obj).next().removeClass(options.cssExceeded);
}
$(obj).next().html(options.counterText + available);
};
this.each(function() {
$(this).after('<'+ options.counterElement +' class="' + options.css + '">'+ options.counterText +'</'+ options.counterElement +'>');
calculate(this);
$(this).keyup(function(){calculate(this)});
$(this).change(function(){calculate(this)});
});
};
})(jQuery);
</script>
<script>
$(document).ready(function(){
$("#comments").charCount();
});
</script>