SMS を送信する目的で、テキストエリアで使用される文字をカウントする次のスクリプトをまとめました。
このコードは、サービス プロバイダーが送信できる最大文字数を許可し、{}^\/|~€\r
通常の文字の 2 倍のスペースを必要とする特殊文字 ( ) も考慮しています。これは、各文字を対応する ASCII に変換し、それを識別された文字の値の配列と比較することによって行われます。次に、画面上のテキスト (#remaining、#messages) が更新され、使用されている文字数が反映されます。
このスクリプトは、FF と Chrome (最新)、および IE9 では問題なく動作しますが、IE8 では完全に失敗します。画面上のテキストが更新または変更されず、エラーが表示されないという点で失敗します。それは単に効果がありません。
2 つ目の問題は、どのブラウザーでも最終的な ASCII 比較 (128、€ 記号) が取得されないことです。テキスト ボックスに「€」と入力すると、カウントは 2 ではなく 1 だけ増加します。128 は正しい値であり、.charCodeAt()
€ が関数に渡されたときに関数によって生成されます。他のすべてのシンボルは、必要に応じて 2 ずつ増加します。
では、なぜこのコードは IE8 で失敗し、最終的な ascii 比較が失敗するのでしょうか?
すべての助けに感謝します。
$('#sms-message').keyup(function(){
$('#msg-validation').hide();
var chars = $(this).val(),
arr_chars = chars.split(''),
remaining = $('#remaining'),
messages = $('#messages'),
count = 0;
$.each(arr_chars, function(i, l){
var ascii = l.charCodeAt(0),
arr = [13, 47, 92, 94, 123, 124, 125, 126, 128];
if($.inArray(ascii, arr) !== -1) { count = count + 2; }
else { count = count + 1; }
});
var units = Math.ceil(count / 160),
remaining_chars = 459 - count;
remaining.text(count + ' characters (' + remaining_chars + ' remaining)');
messages.text(units + ' text unit(s)');
if(remaining_chars < 0) {
$(remaining).css('color', 'red');
}
else {
$(remaining).css('color', 'black');
}
});