JavaScript IEでElement.insertBeforeがうまく動かない!

JavaScript IEでElement.insertBeforeがうまく動かない!

世の中でスマートフォン開発が主流のようですが、弊社では、まだまだPC系の開発も盛んに行なっています。

昔から開発員は決まって「IEの仕様は他のブラウザとえらい違う」という怒りをぶつける対象になってきました。
今回もそんなIEに関するお話です。

insertBefore調査

DOM構造に変更をかける際に、よく使う命令の「insertBefore」で、IEだけ、何故か見え方が違っていたので調査したところ、、他ブラウザと仕様が違っていました。

商用サービスでは、全てのブラウザ(主要ブラウザ「IE」「Chrome」「Firefox」「Opera」)において、同じ挙動を求められるので、開発側としては、同じコードで行なったほうが、バージョン管理も楽になるので、その方法を追求してみました。

構文

var insertedElement = parentElement.insertBefore(newElement,referenceElement);

  • insertedElement 挿入されたノード。
  • parentElement 新しく挿入されるノードの親ノード
  • newElement 挿入されるノード
  • referenceElement newElement が挿入される前にあるノード

ブラウザサポート

Chrome Internet Explorer Firefox (Gecko) Opera Safari (WebKit)
OK OK
※下位verに問題あり。
OK OK OK

上記のようになっています。

IEに関しては、一部に問題があるようです。

私が直面した問題は、挿入したいノードに、子要素を持たない場合、IE8で追加されないということ。

これは、少々厄介な問題でした。

insertBeforeの仕様

要素が最初の子要素を持たない場合、firstChild は null となります。

その場合でも、子要素はparentElement の唯一の子要素として追加されます。

要するに、子要素を持たない場合、firstChildにnullを明示的に入れてやればOKということです。

解決方法

これで、全てのブラウザで正常動作したので、この記述を行うとトラブルがなくなるでしょう。

どんどんシェアを落しているIEではありますが、特に企業ユーザにはまだまだ、必須のブラウザと言えます。当面はこうした問題を地道に解決して行くしかないですね。

コメント