フロントエンドブラウザのJavaScriptとCSSの互換性のまとめ
1. getElementById
[標準リファレンス]
getElementByIdは、Documentインターフェースによって提供されるメソッドであり、これによって渡されるパラメータを取得するために使用されます。メソッドはターゲット要素の値である必要があり、ターゲット要素の ID は大文字と小文字が区別される文字列であり、ドキュメント内で一意である必要があります。
【問題内容】
ただし、IE6 IE7 IE8(Q) では、name 属性値が elementName である A APPLET BUTTON FORM IFRAME IMG INPUT MAP META OBJECT EMBED SELECT TEXTAREA 要素を document.getElementById(elementName) によって取得することがサポートされています。 ) そして、ID は大文字と小文字を区別しません。
【影響】
この問題により、IE 以外のブラウザでは対象の要素が取得できなくなります。
【解決策】
document.getElementById メソッドを使用してページ要素を取得する場合、要素の name 属性値の代わりに要素の id 属性値を渡す必要があり、大文字と小文字は厳密に区別されます。同時に、ページ内の要素の id 属性値を他の要素の name 属性値と重複させることはできないことに注意してください。
さらに、getElementById と同様に、標準の getElementsByName では大文字と小文字が区別されますが、IE では大文字と小文字が区別されないため、使用するときは厳密に大文字と小文字を区別することが最善です。
2. IEはDOMツリー作成時に一部の空白文字を無視します
[標準リファレンス]
ノード(ノード)には要素ノードだけでなく、テキストノード、コメントノード、属性ノードなどが含まれます。区別するには、nodeType を使用します。
HTML ソース コードでは、タグ内およびタグ間にあるテキスト (空白文字を含む) がテキスト ノードとして作成されます。
【問題の説明】
IEはDOMツリーを作成する際に一部の空白文字を無視するため、他のブラウザよりも作成されるテキストノードの数が少なくなります。一方、同じドキュメントに対して、他のブラウザは IE よりも多くのテキスト ノードを作成します。
【影響】
ユーザーがIE向けに設計したスクリプトでnodeオブジェクトのnodeList、firstChild、lastChild、previousSibling、nextSiblingメソッドを使用している場合、この問題により他のブラウザでは同じ目的を達成できない可能性があります。エラーが発生したか、間違ったターゲット オブジェクトに対して操作が実行されたなど。
【解決策】
1. 各ラベル間の空白文字が不要な場合は削除してみてください。
ページ スクリプトは主に「要素ノード」で動作するため、要素間にテキスト ノードがないことを確認してください (つまり、ソース コード内のラベル間に空白文字 (スペース、改行、タブを含む) がないこと)、上記のプロパティをブラウザ間で一貫して動作させることができます。
さらに、スクリプトを使用して作成され、順次追加される要素は互いに密接に関連しています。そのため、この場合、次のような上記の互換性の問題を心配する必要はありません。ノード取得時に型判定を行います。
要素間にテキストノードが存在しない保証がない場合は、ノードに対する操作に型判定を追加する必要があります。
さらに、非 IE では、previousElementSibling と nextElementSibling を使用して要素ノードを取得することもできます。たとえば、Element.nextElementSibling を使用して、要素 Element に隣接する次の要素ノードを取得します。
3. document、document.body、documentElement オブジェクトの onscroll イベントの違い
[標準リファレンス]
scroll イベントは、ドキュメントまたは要素がスクロールされたときにトリガーされます。
[問題の説明]
document、document.body、および document.documentElement オブジェクトの onscroll イベントのサポートには、さまざまなブラウザー間で差異があります。
すべてのブラウザーは、ウィンドウと通常の DIV オブジェクトのスクロール イベントをサポートします。 IE と Opera では、 document オブジェクトと document.body オブジェクトがスクロール イベントをサポートします。他のブラウザではサポートされていません。
IE では、 document.documentElement オブジェクトはスクロール イベントをサポートします。他のブラウザではサポートされていません。
【影響】
onscroll イベントを document、document.body、document.documentElement オブジェクトにバインドした後、対応するイベント処理関数が異なるブラウザーで期待どおりにトリガーされない場合があります。
【解決策】
スクロールイベント(scroll)をブラウザウィンドウ全体にバインドする場合は、windowオブジェクトにバインドします。
4. IE の createElement メソッドのみが HTML 文字列をパラメータとして渡すことをサポートしています
[標準リファレンス]
W3C DOM Level2 Core 仕様の説明によると、Document インターフェイスの createElement メソッドは要素ノード オブジェクトを作成できます。実例。 HTML では、このパラメータは任意の形式にすることができ、DOM で実装できる準拠した大文字形式にマップする必要があります。つまり、tagName は正当なタグ名である必要があります。 tagName に不正な文字が含まれている場合は、INVALID_CHARACTER_ERR 例外がスローされます。
【問題の説明】
IE6 IE7 IE8 では、createElement メソッドは正当なタグ名を通じてノード オブジェクトを作成できるだけでなく、正当な HTML コード文字列をパラメータとして渡すことによってノード オブジェクトを作成することもできます。
【影響を与える】
正当な HTML コード文字列をパラメータとして createElement に渡してノード オブジェクトを作成する IE の独自の方法を使用すると、他のブラウザでは例外がスローされ、後続のコードは実行されません。
【解決策】
一般的な置換不可能な要素については、W3C仕様では各ブラウザのcreateElementメソッドにタグ名を渡すという標準的な方法が採用されています。
要素の置き換えに関する一部の IE 処理の問題については、IE の場合、正当な HTML コード文字列をパラメータとして createElement に渡す独自のメソッドを使用するように注意してください。 、例:
互換性のないコード、IE でのみサポート:
Var iframe = document.createElement('
変更:
var iframe = (document.all) ? document.createElement('
iframe.name = "iframe";
5. DOM オブジェクトの innerText と innerText属性
【標準リファレンス】
outerHTML は元々 IE ブラウザで実装されたプライベート プロパティでした。詳細については、MSDN の説明「outerHTML プロパティ」を参照してください。
この属性は、要素自体とその内容を説明する W3C HTML5 仕様ドラフトにも新たに追加されました。このプロパティを文字列を含む DOM 要素に設定すると、その文字列は HTML コードとしてレンダリングされ、DOM 要素を置き換えます。
現在、主流のブラウザの中で、outerHTML 属性をサポートしていないのは Firefox だけです。
【問題の説明】
FirefoxはDOMオブジェクトのouterHTML、innerText、およびouterText属性をサポートしていません
【影響】
FirefoxでouterHTML、innerText、およびouterText属性を使用すると、スクリプトプログラムがエラーを報告します。
【解決策】
現時点では解決策はありません。できるだけ使用を避けてください。
6. IE6 IE7 IE8 Opera は、INPUT 要素と BUTTON 要素を除く他の要素の 'click' メソッドをサポートします
[標準リファレンス]
「click」メソッドは、マウス クリック イベントをシミュレートするために使用され、「 type 属性 値が「button」「checkbox」「radio」「reset」「submit」である INPUT 要素には、他の要素の「click」メソッドの指定は記載されていません。
【問題の説明】
IE6 IE7 IE8 Opera は INPUT 要素と BUTTON 要素を除く他の要素の「クリック」メソッドをサポートしているため、ブラウザごとに INPUT 要素と BUTTON 要素を除く他の要素の「クリック」メソッドがサポートされています。
【影響】
INPUT 要素と BUTTON 要素以外の要素の「クリック」メソッドに対するブラウザのサポートの違いにより、INPUT 要素と BUTTON 要素以外の要素の「クリック」メソッドがマウスによってトリガーされる関数としてシミュレートされます。一部のブラウザではクリックが反応しません。
【解決策】
INPUT 要素と BUTTON 要素を除く他の要素では、「click」メソッドによるマウス クリック イベントのシミュレートを避けることをお勧めします。
「onClick」イベント ハンドラーをトリガーするためにその要素の「click」メソッドを使用する必要がある場合は、次の 2 つの方法で解決できます:
* ほとんどの場合、「click」メソッドを呼び出すことは何もありません。特定の要素を実行するだけでなく、イベント ハンドラー関数がバインドされているため、その要素に対応する「クリック」イベント ハンドラーを直接呼び出すことができます。
* または、DOM-Level-2-Events 標準の DocumentEvent インターフェイス、イベント インターフェイス、イベント登録インターフェイスの関連定義で "createEvent"、"initEvent"、および "dispatchEvent" メソッドを使用して、「クリック」イベントを作成し、それを発送します。例:
function createEvent (eventTarget,eventName){
try{
if(eventTarget.dispatchEvent){
var evt = document.createEvent("MouseEvents");
evt.initEvent(eventName,false, true );
eventTarget.dispatchEvent(evt);
}else if(eventTarget.fireEvent){
eventTarget.fireEvent('on'+eventName);
}else{
eventTarget[ type ]();
}
}catch(e){
alert(e);
}
}
createEvent(HTMLElement,'click');
8. CSS ハックの互換性の概要
CSS ハックとは、次のことを指します。 us さまざまなブラウザと互換性を持たせるために、特別な CSS 定義技術が使用されます。 (注: 強制されない場合は、CSS ハックは使用しないようにしてください。CSS ハックの上位互換性は不明です。Web 標準設計をよく学び、互換性設計をゼロから実行するのが良い方法です。)次の表は、多くの情報を組み合わせたもので、展開や更新に便利な HTML コードで書かれた表を使用して練習しますが、文書内で表示するのが難しいため、2 つのスクリーンショットに分けています:
まず、見てみましょうIE ブラウザを他のブラウザと区別する簡単な例を示します。 color:red; (すべてのブラウザでサポートされています) color:red9 (IE でサポートされています)