IEとFFでtextarea内の改行コードが違うっていう話があるので、
s = s.replace("\r\n","\n");
みたいなのを書いてIEでもFFでも透過的に改行コードを扱えるようにしてみて、わーい動いたー、とかって思ってたんですが、IEだと対象文字列中のCRLFしか変更されてませんでしたorzコレ自体は正規表現で指定するメソッドなので
というか、むしろ、こんな記述で影響が対象文字列全体に波及するFFでの挙動が謎。
って、CRLFなのをまとめてLFにして扱うためにこの処理してんだから、FFで動いてなくて当たり前じゃん。俺のバカ!恥ずかしい!><
なんか最近集中力が落ちててダメだ。仕事にも集中できてないし。
正しくは
s = s.replace(/\r\n/g,"\n");
と書いて、スッキリ動きました。
書いたコードはこんなん。textareaがあれば問答無用で文字数カウンタをくっつけるスクリプト。FFだとIME有効時にkeyupイベントが発生しないので監視するようにしてる。
(function() { var loaded = function() { function count_character(s) { s = s.replace(/\r\n/g,"\n"); var r = 0; var c = ""; for (var i = 0; i < s.length; i++) { // charCodeAtはunicodeを返す c = s.charCodeAt(i); if (c == 0x000A) { // 改行コードはFFだとLF、IEだとCRLFだが、リクエスト時にはCRLFとして送られるため、2バイトとしてカウントする r += 1; } else if (c <= 0x007E || (0xFF61 <= c && c <= 0xFF9F)) { r += 0.5; } else { r += 1; } } return r; } var get_closure = function(counter_area, text_area) { return function() { counter_area.innerHTML = count_character(text_area.value); }; }; var textarea_elems = document.getElementsByTagName("textarea"); for (var i = 0; i < textarea_elems.length; i++) { var display_area = document.createElement("div"); display_area.innerHTML = " "; display_area.className = "counter-area"; var parent_elem = textarea_elems[i].parentNode; parent_elem.insertBefore(display_area, textarea_elems[i].nextSibling); var func_count = get_closure(display_area, textarea_elems[i]); func_count(); if (textarea_elems[i].addEventListener) { textarea_elems[i].addEventListener("keyup", func_count, true); } else { textarea_elems[i].attachEvent("onkeyup", func_count); } } function survey_textarea() { for (var i = 0; i < textarea_elems.length; i++) { var textarea_elem = textarea_elems[i]; var counter_area = textarea_elem.nextSibling; counter_area.innerHTML = count_character(textarea_elem.value); } setTimeout(survey_textarea,1000); } if (textarea_elems.length != 0) { setTimeout(survey_textarea, 1000); } }; if (window.addEventListener) { window.addEventListener("load", loaded, true); } else { window.attachEvent("onload", loaded); } })();