ppk on javascript第3章ブラウザ

4954 ワード

変換元:http://www.cnblogs.com/bloodmage/archive/2010/06/14/1758208.html
 
 
各ブラウザには、Webページのコードを説明するコードエンジンまたはレンダリングエンジンが含まれています.javascript解釈器はその一部です.
 
Netscape 4が惨敗した後、ネット景会社は1998年にMozillaプロジェクトを創立し、Geckoエンジンを開発し、現在はMozilla、Firefox、Netscape、Caminoなどのブラウザをサポートしている.
ExplorerのコードエンジンはTridentと呼ばれ、1999年3月にリリースされたExplorer 5.0はW 3 C DOMとXMLHttpRequestをサポートする最初のブラウザですが、主要なJavascript更新を含む最後のExplorerバージョンでもあります.
Safariは2003年に発表され、KHTMLコードエンジンを使用し、Macintoshプラットフォームのデフォルトブラウザです.
Operaは独立したブラウザで、ブラウザ大戦中はDHTMLを実現していませんでしたが、今から見れば、これはかなり賢明な決定です.
 
4つの互換性の問題
サポートされていません:これらの問題が発生する機能は「不可または欠」の基礎機能ではなく、オブジェクト検出によって判断することができ、ブラウザもdocumentなどの問題を解消しようと努力しています.SytleSheetsはスタイルシート全体を読み書きし、現在SafariとOperaもサポートを追加しています.
合理的な見方:deferプロパティがスクリプトのロードに要求されるように、Exploerは独特の理解を持っていますが、幸いなことに、この問題は最小限です.
意図的な互換性の問題:通常はブラウザ大戦の残留問題であり、オブジェクト検出によって判断することもでき、マイクロソフトがW 3 Cイベント基準の実現に着手すれば、最後の故意による互換性の問題も解決されるだろう.
ブラウザbug:これはプログラミングの欠陥による予見できないエラーであり、解決できないし測定できない.Exploer 6がnormalize()メソッドによってクラッシュする場合があります.
 
ブラウザの互換性の問題は単純な生活の事実であり、簡単には消えないので、できるだけ早く慣れ、少なくともそれに従うべきだ.
いずれの場合も、ブラウザにスクリプトを書いてから、他のブラウザのサポートを追加しないでください.プロジェクト支出では、これらの互換性の問題を最後に解決する必要があります.
 
オブジェクト検出
オブジェクト検出は、互換性の問題を回避するための最適なアシスタントです.一般的な方法は、使用したいオブジェクトが存在するかどうかを確認し、存在しない場合は関数を終了することです.(if(!オブジェクト)),技術的には,オブジェクト検出は1つのオブジェクトを1つのブール値に変換する.
検査W 3 C DOM:
var W3CDOM = document.createElement && document.getElementsByTagName;
 
W 3 C DOMの検出により、ブラウザもappendChildなどの関連機能をサポートしていると常に仮定することができ、その検査を省くことができます.
イベント処理テスト:

function
addEventSimple(obj, evt, fn) {
if (obj.addEventListener)//W3C
obj.addEventListener(evt, fn, false);
else if
(obj.attachEvent)/マイクロソフト
obj.attachEvent('on' + evt, fn);
}
私たちは将来のバージョンで標準を使用することを望んでいるので、標準のサポートを最初にチェックすべきで、実際にattachEvent、Fxなどのブラウザをチェックするとエラーが発生します.
 
ブラウザ検出
なぜブラウザの検出が通じないのですか?ブラウザの互換性モードは絶えず変化しており、今日サポートされていない属性は、明日サポートされる可能性があります.また、ブラウザは、ブラウザで検出するために自分のアイデンティティを偽装することがよくあります.
ブラウザ検出の軍備競争
navigator.userAgentには、各ブラウザの識別文字列が保存されています.1995年前後のMosaicとNetscape年代では、Netscapeのクッキーや
タグなどのサポートにより、サーバ側のプログラマーがブラウザ検出を用いて2つのブラウザを区別することにし、識別文字列がMozilla/から始まるかどうかを検出することでjavascript世界に不要な苦労をもたらした.ブラウザメーカーは、自分の識別文字列をMozilla/から変更せざるを得ず、Explorerが最初に市場に進出したときもNetscapeに偽装した.ブラウザ大戦が始まった後、Web開発者たちはより多くのブラウザプログラムを作成してNetscapeとExploerを区別したが、戦争が終わったとき、すでに数え切れないほどのウェブサイトが検出スクリプトを設定してExplorerアクセスだけを許可し、歴史が再現され、Operaのような閲覧器があり、自分の識別文字列を修正してExplorerに一致しなければならなかった.識別文字列の設定をユーザーに開放することもできます.
ブラウザ文字列の分解


   
     
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.6
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2)

1つ目はMozilla 1です.7.12、2番目はNT 5です.1(すなわちXP)のExplorer 6.0、3つ目はSafari 1です.3.2、4つ目は偽装後のSafari 1です.3.2.
userAgent:navigatorを使用します.NavigatorではなくappNameとnavigator.appVersion.前者にはいくつかの従うものがあり、後者はすべて嘘である.
Mozilla/:ブラウザが1994年以降にリリースされたことを証明するしかありません.
/[version number]:意味がなく、すべての現代ブラウザが第4版または第5版のMozillaである.
不規則な文字列:通常はカッコで囲まれており、非常に複雑な略語が含まれています.
Opera:windowを唯一サポートします.opera属性は、このオブジェクトを検出して判断することができる.
Safari、iCab、Konqueror:Operaのようにリスクを負うのではなく、完全に自分を偽装することができます.
Gecko:Mozilla識別シリアルは通常Geckoを含むが、不幸にもSafariなども含まれる.
MSIE:意味がなく、ほとんどのブラウザにはMSIEが含まれています.
バージョン番号:ExploerとOperaでは、名前の後ろに自分のバージョン番号を見つけることができますが、Mozillaの非表示バージョンなど、他のブラウザは無効です.
OS:WindowsオペレーティングシステムはすべてWinで始まります.もちろん、偽装された列には適用されません.
( http://www.quirksmode.org/js/detect.html )
ブラウザ検出の正しい使用
サイト統計などのアクセス者のブラウザを知る必要がある場合、これらの検出はスクリプトロジックに影響しません.
オブジェクト検出でブラウザバグなどを排除する必要がある場合は、オブジェクト検出とブラウザ検出を併用して使用できます.
 
デバッグ
Mozillaには最高のエラーメッセージがあるので、Mozillaでデバッグすることが多い.
return、alert、confirmを使用するのは良い方法で、複雑なデバッグは自分でエラーコンソールを作成することができます.
バグをブラウザベンダーに報告します.