【JavaScript】IE6のString.split()の不具合と対策
IE6のString.split()では、区切り文字(delimiter)を正規表現で指定したときに不具合があるようです。
具体的には、例えば『javascript:alert(',,'.split(/,/).length)』を実行すると、結果が「0」になってしまいます(正しくは「3」)。
具体的には、例えば『javascript:alert(',,'.split(/,/).length)』を実行すると、結果が「0」になってしまいます(正しくは「3」)。
ちなみにIE6でも『javascript:alert(',,'.split(',').length)』のように、正規表現を使わなかった場合には、結果が正しく「3」となります。
どうも、区切り文字で正規表現を指定した場合には、結果の文字列が ""(null) になるものは候補から外れてしまう、という動作になっているように思われます。これはどう考えても仕様じゃなくてバグだよなぁ……。
そんなわけで、String.split() を使う場合には注意が必要です。
対策としては、次のようにして String.prototype.split を置換してやるとよいかもしれません。
↓
【2007/12/11追記】
他にもいろいろ問題がありそうなので(例えばString.split()のブラウザでの差異 - ?D of K)、ちゃんとした対策が必要なら、『JavaScript split Inconsistencies & Bugs: Fixed!』を使用するのがよいと思われます。
対策としては、次のようにして String.prototype.split を置換してやるとよいかもしれません。
↓
【2007/12/11追記】
他にもいろいろ問題がありそうなので(例えばString.split()のブラウザでの差異 - ?D of K)、ちゃんとした対策が必要なら、『JavaScript split Inconsistencies & Bugs: Fixed!』を使用するのがよいと思われます。
if (navigator.userAgent.match(/msie/i)) {
String.prototype.split=function(sreg){
var text=this, reg=(typeof sreg=='string')?RegExp(sreg,'g'):RegExp(sreg.source,'g'+((sreg.ignoreCase)?'i':'')+((sreg.multiline)?'m':''));
if (!reg.source) return [text];
var sindex=0, eindex, elms=[];
do {
reg.exec(text);
eindex=reg.lastIndex;
elms.push(text.substring(sindex,(eindex)?eindex:text.length).replace(sreg,''));
sindex=eindex;
} while (sindex);
return elms;
}
}
String.prototype.split=function(sreg){
var text=this, reg=(typeof sreg=='string')?RegExp(sreg,'g'):RegExp(sreg.source,'g'+((sreg.ignoreCase)?'i':'')+((sreg.multiline)?'m':''));
if (!reg.source) return [text];
var sindex=0, eindex, elms=[];
do {
reg.exec(text);
eindex=reg.lastIndex;
elms.push(text.substring(sindex,(eindex)?eindex:text.length).replace(sreg,''));
sindex=eindex;
} while (sindex);
return elms;
}
}
ちなみに、これも『404 Blog Not Found:Google Code Chart - 折れ線グラフうぃざ~ど』で気付きました。
【2007/12/09追記】
IE6限定ということで、
IE6限定ということで、
elms.push(text.substring(sindex,(eindex)?eindex:text.length).replace(sreg,''));の部分は
elms.push(text.substring(sindex,(eindex)?RegExp.index:text.length));に変えた方が速くなりそうですね。
IE以外だとRegExp.indexがundefinedなので使えないですが……。
« 【JavaScript】IE6におけるtable要素の初期化 | トップページ | 【JavaScript】IE6でTABLE要素内をHTMLで書換える関数 »
「パソコン・インターネット」カテゴリの記事
- Twitter 原寸びゅー:PC版ブラウザ用・Twitterの画像閲覧と保存がはかどる拡張機能の紹介(2016.02.12)
- スマートフォンをPC上の音楽を再生するためのリモコンとして使いたい(2016.01.10)
- BIGLOBE光ネクスト(大阪)の通信速度問題 - プロバイダ選びは難しい……(2015.08.13)
- BOOK☆WALKER さんに関して最近経験した不安と不満(2015.08.10)
- 『#鳥獣戯画制作キット』が楽しい(2015.07.01)
「覚書」カテゴリの記事
- 鍛高譚 ~ カレイにまつわる物語(2018.05.25)
- ココログをTwitterカードに対応させてみる(2016.11.23)
- 神使の兎 ~宇治神社にて~(2016.07.10)
- Twitter 原寸びゅー:PC版ブラウザ用・Twitterの画像閲覧と保存がはかどる拡張機能の紹介(2016.02.12)
- スマートフォンをPC上の音楽を再生するためのリモコンとして使いたい(2016.01.10)
« 【JavaScript】IE6におけるtable要素の初期化 | トップページ | 【JavaScript】IE6でTABLE要素内をHTMLで書換える関数 »
コメント