【JavaScript】IE6でTABLE要素内をHTMLで書換える関数
IE6でTABLE/THEAD/TFOOT/TR要素内をHTML表記で書換えることができるような関数を作ってみました。
element.innerHTML='(HTML)';とする代わりに、
replaceInnerHtml(element,'(HTML)');として使用します。
上記要素以外の場合でも使えると思います(HEADとかBODYなどはダメですが)。
function replaceInnerHtml(tgtElm, innerHTML) {
for (;;) {
if (typeof innerHTML!='string'||typeof tgtElm!='object'||tgtElm.nodeType!=1/*ELEMENT_NODE*/) break;
try {
tgtElm.innerHTML=innerHTML;
}
catch (e) {
var chld;
while (chld=tgtElm.firstChild) tgtElm.removeChild(chld); // remove all child elements
if (innerHTML.match(/^\s*$/) ) break; // clear only
var tagName=tgtElm.tagName.toLowerCase(), tmp, html='<'+tagName+'>'+innerHTML+'</'+tagName+'>';
switch (tagName) {
case 'thead' :
case 'tbody' :
case 'tfoot' :
tmp=document.createElement('table');
replaceInnerHtml(tmp, html);
break;
case 'tr' :
tmp=document.createElement('table');
replaceInnerHtml(tmp, '<tbody>'+html+'</tbody>');
tmp=tmp.firstChild;
break;
default :
tmp=document.createElement('div');
tmp.innerHTML=html;
break;
}
var tmpElm=tmp.firstChild;
while (chld=tmpElm.firstChild) tgtElm.appendChild(chld);
}
break;
}
return tgtElm;
}
for (;;) {
if (typeof innerHTML!='string'||typeof tgtElm!='object'||tgtElm.nodeType!=1/*ELEMENT_NODE*/) break;
try {
tgtElm.innerHTML=innerHTML;
}
catch (e) {
var chld;
while (chld=tgtElm.firstChild) tgtElm.removeChild(chld); // remove all child elements
if (innerHTML.match(/^\s*$/) ) break; // clear only
var tagName=tgtElm.tagName.toLowerCase(), tmp, html='<'+tagName+'>'+innerHTML+'</'+tagName+'>';
switch (tagName) {
case 'thead' :
case 'tbody' :
case 'tfoot' :
tmp=document.createElement('table');
replaceInnerHtml(tmp, html);
break;
case 'tr' :
tmp=document.createElement('table');
replaceInnerHtml(tmp, '<tbody>'+html+'</tbody>');
tmp=tmp.firstChild;
break;
default :
tmp=document.createElement('div');
tmp.innerHTML=html;
break;
}
var tmpElm=tmp.firstChild;
while (chld=tmpElm.firstChild) tgtElm.appendChild(chld);
}
break;
}
return tgtElm;
}
【テーブル置換サンプル】
THEAD要素 |
---|
下のボタンを押して試して下さい。 |
TFOOT要素 |
【JavaScript】IE6におけるtable要素の初期化で、TABLE要素のinnerHTMLを直接書換えようとするとIE6ではエラーになってしまうと書きましたが、Microsoftによるとこれはやはり『仕様』とのこと。
■PRB: Internet Explorer に Table.innerHTML を設定しているエラー
■PRB: Internet Explorer に Table.innerHTML を設定しているエラー
原因
TABLE と TFOOT と THEAD と TR 要素の innerHTML プロパティは、読み取り専用です。
状況仕様といわれてしまってはそれまでですが、やっぱり直接書換えたいような場合もあるんじゃないかなぁ、と思って上記のような関数を作成してみたしだい。
この動作は、仕様です。
余談ですが、リンク(A)要素のinnerHTMLはIE6でも通常は書き込み可能ですが、
linkElement.innerHTML='<a href="http://~">hoge</a>';のようにすると『未知の実行時エラーです。』と出ることに、『りんくぽっぷ』を作っていて気が付きました。
まぁ、リンク要素内にリンク要素を書くようなことは推奨されないとは思うんですが。Wikipediaなんかで実際にこうなっていたりする箇所があって、りんくぽっぷでエラーが出てしまい、原因究明にてこずりました(苦笑)。
« 【JavaScript】IE6のString.split()の不具合と対策 | トップページ | 【JavaScript】function定義方法による動作の差異(覚書) »
「パソコン・インターネット」カテゴリの記事
- Twitter 原寸びゅー:PC版ブラウザ用・Twitterの画像閲覧と保存がはかどる拡張機能の紹介(2016.02.12)
- スマートフォンをPC上の音楽を再生するためのリモコンとして使いたい(2016.01.10)
- BIGLOBE光ネクスト(大阪)の通信速度問題 - プロバイダ選びは難しい……(2015.08.13)
- BOOK☆WALKER さんに関して最近経験した不安と不満(2015.08.10)
- 『#鳥獣戯画制作キット』が楽しい(2015.07.01)
「おもいつき」カテゴリの記事
- ココログをTwitterカードに対応させてみる(2016.11.23)
- 神使の兎 ~宇治神社にて~(2016.07.10)
- Twitter 原寸びゅー:PC版ブラウザ用・Twitterの画像閲覧と保存がはかどる拡張機能の紹介(2016.02.12)
- スマートフォンをPC上の音楽を再生するためのリモコンとして使いたい(2016.01.10)
- 【覚書】風柳亭(ココログプロ)をレスポンシブWebデザイン化(Bootstrap3使用)(2015.10.09)
「覚書」カテゴリの記事
- 鍛高譚 ~ カレイにまつわる物語(2018.05.25)
- ココログをTwitterカードに対応させてみる(2016.11.23)
- 神使の兎 ~宇治神社にて~(2016.07.10)
- Twitter 原寸びゅー:PC版ブラウザ用・Twitterの画像閲覧と保存がはかどる拡張機能の紹介(2016.02.12)
- スマートフォンをPC上の音楽を再生するためのリモコンとして使いたい(2016.01.10)
« 【JavaScript】IE6のString.split()の不具合と対策 | トップページ | 【JavaScript】function定義方法による動作の差異(覚書) »
コメント