JavaScriptの正規表現関係のreplaceメソッドで、IEとFFとで繰り返しに関する挙動が違った訂正:JavaScriptのreplace関数は正規表現

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 = "&nbsp;";
			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);
	}
})();