検索
ホームページウェブフロントエンドjsチュートリアルIE および FF における JavaScript の互換性の問題_基礎知識

JavaScript の互換性は、Web 開発者にとって長い間大きな問題でした。多くの開発者は、正式な仕様、事実上の標準、実装の違いに苦労しています。この目的を達成するために、主に次の側面から IE と Firefox の Javascript 互換性を要約します。

コードをコピーします コードは次のとおりです。

1. 関数とメソッドの違い
3. DOM メソッドとオブジェクト参照
>5. その他の相違点 互換性のある処理。


1. 関数とメソッドの違い

1. get Year() メソッド

[分析手順] まず次のコードを見てください:

コードをコピーします コードは次のとおりです:
var year= new Date().get Year ();
document.write(年);
IE で取得される日付は「2010」ですが、Firefox で表示される日付は「110」です。これは主に、Firefox の get Year が「現在年 - 1900」の値を返すためです。

【互換処理】以下のような年の判定を追加します。

コードをコピーします

コードは次のとおりです:var year= new Date().get Year (); 年 = (年

getFull Year getUTCFull Year:
を通じて呼び出すこともできます。

コードをコピー

2. eval() 関数

【解析説明】IE では idName の ID を持つ HTML オブジェクトを取得するには eval("idName") または getElementById("idName") を使用できますが、Firefox では getElementById("idName") のみを使用できます。 idName の HTML オブジェクトの ID を取得します。
【互換処理】 ididNameのHTMLオブジェクトを取得するには一律getElementById("idName")を使用します。

3. const ステートメント

【分析メモ】constキーワードはIEでは使用できません。例:

コードをコピー

コードは次のとおりです:const constVar = 32;
これは IE の構文エラーです。

【互換処理】constを使用せず、varを使用してください。
4. 変数

[分析手順] 次のコードを参照してください:

コードをコピー


この機能は IE では正常に動作しますが、Firefox ではエラーが報告されます。

[互換処理] echo の前に var を付けるのが通常です。これが var について言及する目的です。
5. const 問題

【分析メモ】constキーワードはIEでは使用できません。 const constVar = 32; など。これは IE の構文エラーです。

【解決策】 const を使用せず、代わりに var を使用してください。

2. スタイルへのアクセスと設定

1.CSS「float」属性

[解析説明] Javascript が特定の CSS 値にアクセスするための最も基本的な構文は object.style.property ですが、一部の CSS プロパティは Javascript の予約語と同じ名前です (「float」、「for」など)。 , "クラス "待って、ブラウザごとに書き方が異なります。 IE でこれを書きます:

コードをコピー

Firefox でこれを書きます:


コードをコピー



コードをコピー

コードは次のとおりです:


if(document.all){ //
document.getElementById("header").style.styleFloat = "left";
}
else{ //つまり未定義の場合
document.getElementById("header").style.cssFloat = "left"
}

2.

タグ内の「for」にアクセスします。

【解析説明】float属性と同様に、

IE でこれを書きます:

コードをコピー コードは次のとおりです。

var myObject = document.getElementById("myLabel ");
var myAttribute = myObject.getAttribute("htmlFor");

Firefox でこれを書きます:

コードをコピー コードは次のとおりです。

var myObject = document.getElementById("myLabel ");
var myAttribute = myObject.getAttribute("for");

[互換処理] 解決策は、まずブラウザの種類を判断することです。

3. クラス属性にアクセスして設定します

【解析説明】 また、class は Javascript の予約語であるため、これら 2 つのブラウザはこの属性を取得するために異なる JavaScript メソッドを使用します。
IE8.0 より前のすべての IE バージョンを記述する方法:

コードをコピー コードは次のとおりです。

var myObject = document.getElementById("header ");
var myAttribute = myObject.getAttribute("className");

IE8.0 および Firefox 書き込みメソッドに適用:

コードをコピー コードは次のとおりです。

var myObject = document.getElementById("header ");
var myAttribute = myObject.getAttribute("class");

さらに、setAttribute() を使用して Class 属性を設定する場合、2 つのブラウザ間で同様の違いがあります。

コードをコピー コードは次のとおりです。

setAttribute("className",value);

この書き込み方法は、IE8.0 より前のすべての IE バージョンに適用できます。 注: IE8.0 は、「className」属性もサポートしていません。

setAttribute("class",value); IE8.0 および Firefox に適用されます。

【互換加工】

方法 1、両方を書きます:

コードをコピー コードは次のとおりです。

var myObject = document.getElementById("header ");
myObject.setAttribute("class","classValue");
myObject.setAttribute("className","classValue");
//ヘッダー クラスを classValue に設定します

方法 2、IE と FF は両方とも object.className をサポートしているため、次のように記述できます:

コードをコピー コードは次のとおりです。

var myObject = document.getElementById("header ");
myObject.className="classValue";//ヘッダー クラスを classValue に設定します

方法 3、まずブラウザの種類を決定し、ブラウザの種類に応じて対応する書き込み方法を使用します。

4. オブジェクトの幅と高さの割り当ての問題

【解析説明】 obj.style.height = imgObj.height のような文は FireFox では無効です。

【互換処理】obj.style.height = imgObj.height ‘px’;を使用

5. スタイルを追加します

[解析説明] IE でスタイルを追加するには、addRules() メソッドを使用します。例: styleSheet.addRule("p","color:#ccc",styleSheet.length) このメソッドは FF と互換性がありません。 FF() メソッドの置換で insetRule を使用します。 styleSheet.insertRule("p{color:#ccc}",styleSheet.length) など。

【互換加工】

コードをコピー コードは次のとおりです。

if(styleSheet.insertRule){
// insertRule() メソッド
}else{
//addRule() メソッド
}

6. 最終的なスタイル

【解析解説】クラスセレクターで定義したスタイルとタグセレクターで定義したスタイルなど、スタイルが重複してカスタマイズしたスタイルが無効になる場合があり、その場合後者が無効となります。次に、この時点では最終的なスタイルを使用する必要があります。 IE での最終的なスタイルは ele.currentStyle.property 名として記述されます。 DOM の標準的な記述方法は、document.defaultView.getComputedStyle(elel,null) などの document.defaultView オブジェクトを使用することです。このメソッドは FF.

と互換性があります。

【互換処理】 まずブラウザ(document.all)を決定し、上記メソッドを実行します。

3. DOM メソッドとオブジェクト参照

1.getElementById

[分析手順] まずコードのセットを見てみましょう:

コードをコピー コードは次のとおりです:

value="クリックしてください" ōnclick="alert(id.value)"/>

Firefox ではボタンが反応しませんが、IE では問題ありません。IE では、HTML 要素の ID をスクリプト内の変数名として直接使用できますが、Firefox では使用できないためです。

【互換処理】 オブジェクトにアクセスする際は、document.getElementById("id") を使用し、ページ内で一意な ID を使用してください。タグ名 オブジェクトにアクセスするには、document.getElementsByTagName("div")[0] を使用します。このメソッドは多くのブラウザでサポートされています。

コードをコピー コードは次のとおりです:

onclick="alert(document.getElementById('id').value)" />
2. コレクションクラスオブジェクトへのアクセス
【解析説明】 IE では () または [] を使用してコレクション オブジェクトを取得できますが、Firefox では [] を使用してのみコレクション オブジェクトを取得できます。例:

document.write(document.forms("formName").src);

//この書き込みメソッドは、IE の Form オブジェクトの scrc 属性にアクセスできます

【互換処理】document.forms("formName")をdocument.forms["formName"]に変更します。コレクション クラスのオブジェクトを取得するには、一律 [] を使用します。

3. フレームへの参照

【解析説明】IEはこのフレームに対応するウィンドウオブジェクトにIDまたは名前でアクセスできますが、Firefoxはこのフレームに対応するウィンドウオブジェクトに名前でしかアクセスできません。

たとえば、上記のフレームタグがトップレベルウィンドウ内の htm に記述されている場合、次のようにアクセスできます:

IE: このウィンドウ オブジェクトにアクセスするための window.top.frameId または window.top.frameName;

Firefox: このウィンドウ オブジェクトには、window.top.frameName を通じてのみアクセスできます。

【互換処理】フレームオブジェクトへのアクセスにはフレームの名前を使用します。また、IE、Firefoxでも利用可能です。

window.document.getElementById("frameId") を使用して、このフレーム オブジェクトにアクセスします。

4. 親要素

【解析説明】IEは親ノードの取得にparentElementとparentNodeを使用することをサポートしています。 Firefox はparentNode のみを使用できます。

【互換性】 Firefox、IEともにDOMをサポートしているため、親ノードへのアクセスにはparentNodeを使用します。

5. テーブル操作

【解析説明】 IE 上の表では、innerHTML を使用しても、appendChild を使用して

を挿入しても影響はありませんが、他のブラウザでは正常に表示されます。

[互換性処理] 解決策は、以下に示すように、テーブルの

要素に を追加することです。

コードをコピー

コードは次のとおりです。var row = document.createElement("tr "); var cell = document.createElement("td"); var cell_text = document.createTextNode("コンテンツの挿入");
cell.appendChild(cell_text);
row.appendChild (セル);
document.getElementsByTagName("tbody")[0].appendChild(row);

6. ノードを削除しますremoveNode() とremoveChild()

【解析説明】appendNodeはIEとFirefoxで通常通り利用できますが、removeNodeはIEでのみ利用可能です。

removeNode メソッドの機能は、ノードを削除することです。構文は、node.removeNode (false) または node.removeNode (true) です。戻り値は、削除されたノードです。

removeNode (false) は、指定されたノードのみを削除し、このノードの元の子ノードが元の親ノードの子ノードに昇格することを意味します。

removeNode(true) は、指定されたノードとそのすべての下位ノードを削除することを意味します。削除されたノードは孤立ノードになり、子ノードと親ノードがなくなります。

【互換処理】FirefoxにはノードのremoveNodeメソッドが存在せず、removeChildメソッドでのみ置き換えることができます。まず親ノードに戻り、削除したいノードを親ノードから削除します。

node.parentNode.removeChild(node);

// IE および Firefox で正常に動作するには、前のレイヤーの親ノードを取得して削除します。

7. childNodes によって取得されたノード

【解析説明】IEとFirefoxではchildNodesの添字の意味が異なります。 以下のコードを見てください。

コードをコピー コードは次のとおりです:
  • 1

  • 私!" onclick=
    "alert(document.getElementById('main').childNodes.length)">



    IE と Firefox でそれぞれ実行すると、IE の結果は 3 ですが、Firefox の結果は 7 です。 Firefox は DOM 仕様を使用します。「#text」はテキスト (実際には意味のないスペースや改行など) を表します。IE では、実際の意味を持つテキストのみが「#text」に解析されます。 「。。
【互換加工】

方法 1: 子ノードを取得するときに、node.getElementsByTagName() を使用してこの問題を回避できます。ただし、getElementsByTagName は、childNodes の方が DOM 階層をより適切に処理できるため、複雑な DOM 構造の走査に関しては childNodes ほど優れていないことは明らかです。

方法 2: 実際のアプリケーションでは、Firefox が子ノードを走査するときに、for ループに

を追加することもできます。

if(childNode.nodeName=="#text") continue;//または、nodeType == 1 を使用します。

これにより、いくつかのテキスト ノードをスキップできるようになります。

多読

「IE と FireFox の childNodes の違い」

8. Firefox は innerText をサポートできません

【解析説明】 Firefox は innerText をサポートしていません。 innerText を実装するために textContent をサポートしていますが、textContent は innerText のような要素の表示方法を考慮していないため、IE と完全な互換性はありません。 textContent が使用されない場合、文字列に HTML コードが含まれていない場合は、代わりに innerHTML を使用できます。 js を使用してメソッドを作成することもできます。「Firefox の innerText 属性の実装」の記事を参照してください。

【互換処理】ブラウザの種類を判断して互換:

コードをコピーします

コードは次のとおりです:if(document.all){ document.getElementById('element').innerText = "私のテキスト";
document.getElementById('element').textContent = "私のテキスト"; 🎜>


4. イベント処理


JavaScript の使用時にイベント処理が関与する場合は、さまざまなブラウザーでのイベントの違いを理解しておく必要があります。JavaScript イベント モデルには 3 つの主要なイベント モデルがあります (「一度に 3 つのイベント モデルをサポートする」を参照)。それらは NN4、IE4、および です。 W3C/サファール。
1. ウィンドウ.イベント

[分析手順] まずコードを見てみましょう

コードをコピー

コードは次のとおりです。

IE で上記のコードを実行した結果は [object] ですが、Firefox では実行できません。

IE ではイベントをウィンドウ オブジェクトの属性として直接使用できますが、Firefox では W3C モデルが使用され、パラメーターを渡すことでイベントを伝播します。つまり、イベント応答インターフェイスを提供する必要があります。

[互換処理] 異なるブラウザに応じて正しいイベントを取得するためのイベント判定を追加:

コードをコピー

コードは次のとおりです。

2. キーボード値の取得

【解析説明】IEとFirefoxではキーボード値の取得方法が異なりますが、Firefoxのevent.thatはIEのevent.keyCodeに相当することがわかります。それぞれの違いについては「キーボードイベントのkeyCodeとcharCodeの互換性テスト」を参照してください

【互換加工】

コードをコピー コードは次のとおりです。

function myKeyPress(evt){
//互換性のある IE および Firefox は keyBoardEvent オブジェクトを取得します
evt = (evt) ? evt : ((window.event) ? window.event : "")
// キー値を取得するための IE および Firefox と互換性がありますkeyBoardEvent オブジェクトの
var key = evt.keyCode?evt.keyCode:evt.that;
if(evt.ctrlKey && (key == 13 || key == 10)){
// Ctrl と Enter を同時に押します Key
//何かをします;
}
}

3. イベントソースの取得

[分析説明] イベント委任を使用する場合、イベントがどの要素から来たのかを判断するためにイベント ソースが取得されます。ただし、IE ではイベント オブジェクトに srcElement 属性がありますが、Firefox ではeven オブジェクトに target 属性がありません。 target 属性はありますが、srcElement 属性はありません。

【互換加工】

コードをコピー コードは次のとおりです。

ele=function(evt){ //現在のイベントをキャプチャします。 アクションのオブジェクト
evt=evt||window.event;
return
(obj=event.srcElement?event.srcElement:event.target;);
}

4. イベント監視

【分析説明】イベントのリスニングと処理に関して、IE にはattachEventとdetachEventの2つのインターフェースがあり、FirefoxにはaddEventListenerとremoveEventListenerが用意されています。

[互換性処理] 最も単純な互換性処理は、次の 2 つのインターフェイスのセットをカプセル化することです。

コードをコピー コードは次のとおりです。

function addEvent(elem,eventName,handler) {
if (elem.attachEvent) {
elem.attachEvent("on" eventName, function(){
handler.call(elem)}); // コールバック関数 call();ここで使用されているのは、elem
} else if (elem.addEventListener) {
elem.addEventListener(eventName, handler, false)
}
}
function removeEvent(elem) を指すようにします。 ,eventName,handler) {
if (elem.detachEvent) {
elem.detachEvent("on"eventName, function(){
(), これを elem
を指すようにします。} else if ( elem.removeEventListener) {
elem.removeEventListener(eventName, handler, false)
}
}


Firefox では、イベント ハンドラー関数の this が監視対象要素自体を指すことに注意することが重要ですが、IE ではそうではありません。コールバック関数呼び出しを使用して、現在のコンテキストが監視対象要素を指すようにすることができます。要素。

5. マウスの位置

[解析説明] IE では偶数オブジェクトは x、y 属性を持ちますが、pageX、pageY 属性は持ちません; Firefox では偶数オブジェクトは pageX、pageY 属性を持ちますが、x、y 属性は持ちません。

【互換処理】IEのevent.x、Firefoxのevent.pageXをmX(mX =event.x ?event.x :event.pageX;)で置き換えます。物事をさらに複雑にするために、絶対位置も考慮する必要があります

function getAbsPoint(e){
var x = e.offsetLeft, y = e.offsetTop;
while (e = e.offsetParent) {
x = e.offsetLeft;
}
アラート(" x:" x "," "y:" y);

5.その他相違点の互換処理


1. XMLHttpRequest
【解析説明】new ActiveXObject("Microsoft.XMLHTTP"); はIEのみで動作し、Firefoxではサポートされていませんが、XMLHttpRequestはサポートされています。

【互換加工】

コードをコピー

コードは次のとおりです:


function createXHR() {
var xhr=null;
if(window.XMLHttpRequest){
xhr=new ActiveXObject("Msxml2.XMLHTTP");
try {
xhr=new ActiveXObject("Microsoft.XMLHTTP");
}
catch() {
xhr=null;
}
if (!xhr)return;
return
}


2. モーダルウィンドウと非モーダルウィンドウ

【解析説明】IEではshowModalDialogとshowModelessDialogでモーダルウィンドウと非モーダルウィンドウを開くことができますが、Firefoxではサポートされていません。

【解決方法】 window.open(pageURL, name,parameters) を直接使用して新しいウィンドウを開きます。 パラメータを渡す必要がある場合は、frame または iframe を使用できます。

3. input.type 属性の問題

input.type 属性は IE では読み取り専用ですが、Firefox では変更できます

4. 選択要素のオプション操作

オプションを設定するには、IE と Firefox では異なる記述方法があります:

Firefox: 直接設定可能

option.text = 'foooooooo';


IE: のみ設定可能

option.innerHTML = 'fooooooo';


選択したオプションを削除する方法:

Firefox: はい

select.options.remove(selectedIndex);


IE7:使用可能

select.options[i] = null;


IE6: を記述する必要があります

select.options[i].outerHTML = null;


5. img オブジェクトの alt と title の分析

【解析説明】 img オブジェクトには alt と title という 2 つの属性がありますが、異なるのは alt: 写真が存在しない場合や読み込みエラーが発生した場合のプロンプトです。

title: 写真のヒントの説明。IE でタイトルが定義されていない場合は、alt を img のヒントとして使用することもできます。ただし、Firefox では、両方とも標準の

で定義されているとおりに使用されます。

img オブジェクトを定義するとき。

【互換処理】様々なブラウザで正常に利用できるよう、altオブジェクトやtitleオブジェクトは全て記述するのがベストです。

6. img src の更新の問題

[分析手順] まずコードを見てみましょう:

IE および FF における JavaScript の互換性の問題_基礎知識


IE ではこのコードを使用して画像を更新できますが、FireFox では使用できません。主にキャッシュの問題です。

【互換処理】問題を解決するにはアドレスの後に乱数を追加します:

IE および FF における JavaScript の互換性の問題_基礎知識


概要

IE と Firefox の間には Javascript に多くの違いがあります。互換性を実現するには、DOM 操作、イベント処理、XMLHttpRequest リクエストなどのいくつかの共通のものを js ライブラリに整理する必要があると思います。いくつかの既存のライブラリ (jQuery、YUI、ExtJs など) を使用することも選択しますが、これらの違いを理解することが依然として必要であると思います。これは、互換性とユーザビリティ コードに参加するのに役立ちます。

ブラウザの互換性に問題がある場合でも、フロントエンド開発者はいつでも簡単に解決できます。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
如何使用JS和百度地图实现地图平移功能如何使用JS和百度地图实现地图平移功能Nov 21, 2023 am 10:00 AM

如何使用JS和百度地图实现地图平移功能百度地图是一款广泛使用的地图服务平台,在Web开发中经常用于展示地理信息、定位等功能。本文将介绍如何使用JS和百度地图API实现地图平移功能,并提供具体的代码示例。一、准备工作使用百度地图API前,首先需要在百度地图开放平台(http://lbsyun.baidu.com/)上申请一个开发者账号,并创建一个应用。创建完成

如何使用JS和百度地图实现地图多边形绘制功能如何使用JS和百度地图实现地图多边形绘制功能Nov 21, 2023 am 10:53 AM

如何使用JS和百度地图实现地图多边形绘制功能在现代网页开发中,地图应用已经成为常见的功能之一。而地图上绘制多边形,可以帮助我们将特定区域进行标记,方便用户进行查看和分析。本文将介绍如何使用JS和百度地图API实现地图多边形绘制功能,并提供具体的代码示例。首先,我们需要引入百度地图API。可以利用以下代码在HTML文件中导入百度地图API的JavaScript

js字符串转数组js字符串转数组Aug 03, 2023 pm 01:34 PM

js字符串转数组的方法:1、使用“split()”方法,可以根据指定的分隔符将字符串分割成数组元素;2、使用“Array.from()”方法,可以将可迭代对象或类数组对象转换成真正的数组;3、使用for循环遍历,将每个字符依次添加到数组中;4、使用“Array.split()”方法,通过调用“Array.prototype.forEach()”将一个字符串拆分成数组的快捷方式。

如何使用JS和百度地图实现地图热力图功能如何使用JS和百度地图实现地图热力图功能Nov 21, 2023 am 09:33 AM

如何使用JS和百度地图实现地图热力图功能简介:随着互联网和移动设备的迅速发展,地图成为了一种普遍的应用场景。而热力图作为一种可视化的展示方式,能够帮助我们更直观地了解数据的分布情况。本文将介绍如何使用JS和百度地图API来实现地图热力图的功能,并提供具体的代码示例。准备工作:在开始之前,你需要准备以下事项:一个百度开发者账号,并创建一个应用,获取到相应的AP

js中new操作符做了哪些事情js中new操作符做了哪些事情Nov 13, 2023 pm 04:05 PM

js中new操作符做了:1、创建一个空对象,这个新对象将成为函数的实例;2、将新对象的原型链接到构造函数的原型对象,这样新对象就可以访问构造函数原型对象中定义的属性和方法;3、将构造函数的作用域赋给新对象,这样新对象就可以通过this关键字来引用构造函数中的属性和方法;4、执行构造函数中的代码,构造函数中的代码将用于初始化新对象的属性和方法;5、如果构造函数中没有返回等等。

用JavaScript模拟实现打字小游戏!用JavaScript模拟实现打字小游戏!Aug 07, 2022 am 10:34 AM

这篇文章主要为大家详细介绍了js实现打字小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

php可以读js内部的数组吗php可以读js内部的数组吗Jul 12, 2023 pm 03:41 PM

php在特定情况下可以读js内部的数组。其方法是:1、在JavaScript中,创建一个包含需要传递给PHP的数组的变量;2、使用Ajax技术将该数组发送给PHP脚本。可以使用原生的JavaScript代码或者使用基于Ajax的JavaScript库如jQuery等;3、在PHP脚本中,接收传递过来的数组数据,并进行相应的处理即可。

js是什么编程语言?js是什么编程语言?May 05, 2019 am 10:22 AM

js全称JavaScript,是一种具有函数优先的轻量级,直译式、解释型或即时编译型的高级编程语言,是一种属于网络的高级脚本语言;JavaScript基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式,如函数式编程。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)