wiki代わりの備忘録なので編集や加筆の制限なしエントリーです、あしからず。

また、以下はIEに特化することが目的ではなく、W3C勧告のHTML標準なページ作成を目指す中で、標準を理解しない(くせにトップシェアの)IEの仕様を何とか回避するが主題です。

cssテクまで考慮するともっとたくさんになると思いますが、それはデザイナーさんに任せます(笑)

.

■ IE互換モード

イントラネットでは互換モード優先がIEのデフォルト設定のため、企業イントラネットではIE7の配慮が必要です。ローカルPCでの開発では互換モードを再現できないので注意が必要です。

強制的に互換モードを排除するには、.htaccessに次を記述してHTTPヘッダを出力するか、

Header set X-UA-Compatible "IE=edge"

メタタグでページごとに指定します。

<meta http-equiv="X-UA-Compatible" content="IE=edge"/>

しかし、企業イントラネットではどちらも禁止されることがあり、そうなるとブラウザシェアに関わらず今後もIE7を切り捨てることができません。

なお、edgeはその時点での最新バージョン対応のことで、MS自身は使用を避けるべきとしていますが、HTML標準を目指すので当然edgeをポリシーとします。

.

■ UA判定

できればUAによるコード分岐はしたくないのですが、回避できないケースが多々あります。

var _ua = (function(){
 return {
  ltIE6:typeof window.addEventListener == "undefined" && typeof document.documentElement.style.maxHeight == "undefined",
  ltIE7:typeof window.addEventListener == "undefined" && typeof document.querySelectorAll == "undefined",
  ltIE8:typeof window.addEventListener == "undefined" && typeof document.getElementsByClassName == "undefined",
  mobile:/android|iphone|ipad|ipod/i.test(navigator.userAgent.toLowerCase())
 }
})();

.

■ nameによるエレメント指定

IEでは以下の書き方はできません。

$('[name="Test"]')

かならず、indexかselectを指定する必要があります。

$('select[name="Test"]')

.

■ optionの非表示

display:noneを指定してもIEでは消えません。

これが必要なケースでは、ページ起動時にオリジナル選択肢を複写しておき、

$('body').append('<select id="copyTest" style="display:none;"></select>');
$('select[name="Test"]').eq(0).children().clone().prependTo('#copyTest');

select要素の再描画が必要なときに、非表示条件を除外して複写することで、ブラウザ共通コードとできます。

var cur = $('select[name="Test"]').val();
$('select[name="Test"]').children().remove();
$('#copyTest').children().each( function () {
    if (非表示の条件) return;
    $('select[name="Test"]').append($(this).clone());
});
$('select[name="Test"]').val(cur);

.

■ trの非表示

trをdisplay:noneとしたとき、互換モードでは枠線が残ります。

2、3行の非表示なら気になりませんが、数十行を非表示にするとその分の枠線が重なり真っ黒となります(笑)

メタタグが禁止され互換モードを排除できなかったイントラネット案件では、非表示にするtrをtbodyでくくるhtml文法的には不適切な方法で回避しました。

.

■ rowSpanの値変化

上記枠線が残るのと同根ですが、rowSpanが変化するような行単位の表示・非表示を行ったとき、IE7以前では考察不能な値での調整が必要です。

IE7以前を切り捨てられない場合は、UA判定で別コードを書かざるをえません。

.

■ Array.indexOf

IEにはArrayにindexOfが実装されていません。使用する場合は自分で追加します。

if(!Array.indexOf){
    Array.prototype.indexOf = function(target){
        for(var i = 0; i < this.length; i++){
            if(this[i] === target){
                return i;
            }
        }
        return -1;
    }
}

.

■ trim

IEにはtrimが実装されていません。使用する場合は自分で追加します。

if(typeof String.prototype.trim !== 'function') {
    String.prototype.trim = function() {
        return this.replace(/^\s+|\s+$/g, '');
    }
} 

.

■ date.getYear()

通常のブラウザでは getYear = getFullYear - 1900 ですが、IEのみは getYear = getFullYear です。

よって、必ずgetFullYear を使用します。

.

■ Chrome Frame

許されるなら、以下のメッセージで現実逃避したいですね(笑)

<?php
if (!defined('MSIE') && isset($_SERVER['HTTP_USER_AGENT'])) {
    if (preg_match('/chromeframe|Opera|Lunascape/', $_SERVER['HTTP_USER_AGENT'])) {
        // これらはUAにMSIEが入るがIEではないので無視する
        // Lunascapeはエンジン切り替え可能である
        // SleipnirもMSIEを含むが、エンジンがIEであるので警告する
    }
    elseif (preg_match('/MSIE [4-8]\./', $_SERVER['HTTP_USER_AGENT'])) {
        // IE 9は除外する
        define('MSIE', 1);
    }
}

if (defined('MSIE') {
  echo 'お使いのブラウザは古いバージョンのIEです。';
  echo 'IE9以上にアップデートするか、';
  echo '<a href="http://www.google.com/chromeframe/?hl=ja&quickenable=true" target="_blank">';
  echo 'パフォーマンス向上のためのプラグイン</a> のインストールを推奨します。';
}
?>

インストールしたChrome Frameを有効にするには、ページに次のメタタグを入れます。

<meta http-equiv="X-UA-Compatible" content="chrome=1">

タグ: ,

コメントをどうぞ

*