ホームページ ウェブフロントエンド jsチュートリアル 複数ブラウザに対応したJavaScript記述方法の分析_JavaScriptスキル

複数ブラウザに対応したJavaScript記述方法の分析_JavaScriptスキル

May 16, 2016 pm 07:01 PM

Firefox に代表されるサードパーティ ブラウザの台頭により、私たちが構築する Web サイトは、IE 以外のブラウザにオリジナルの JavaScript コードの一部を配置すると、正しく動作しなかったり、エラーが発生したりすることがあります。そこでここでは、JS を改良してより標準化され、互換性を持たせる方法を紹介します。

サンプル コード:

<body> 
<table border="1" cellspacing="0" cellpadding="0" id="apple" > 
<tbody> 
<tr> 
<td id="banana" style="color:red" >不吃苹果</td> 
</tr> 
</tbody> 
</table> 
</body>
ログイン後にコピー

W3C DOM 書き込みメソッドを使用してみる

以前にアクセスしたオブジェクトは次のとおりです:
document.all.apple または apple
ここで、
document.getElementById("apple") を使用して ID でオブジェクトにアクセスする必要があります。ID はページ内で一意である必要があります
document.getElementsByTagName("p")[0]タグ名 オブジェクトにアクセスするには

オブジェクトの元のプロパティは次のようになります:
document.all.apple.width=100 または apple.width=100
現在は次のようになります:
document.getElementById(" apple").setAttribute("width","100")
document.getElementsByTagName("p")[0].setAttribute("width","100")
オブジェクトの属性を取得するには、次を使用します:
document.getElementById("apple").getAttribute("width")
document.getElementsByTagName("p")[0].getAttribute("width")

IE での W3C DOM いくつかの制限

当初、IE はブラウザー全体のシェアの 95% を占めており、競争圧力がなかったため、上司は WEB 標準に完全には従わず、何か違うものをプレイすることを主張しました。

IE では、setAttribute を使用してオブジェクトのスタイル、クラス、イベント応答属性を設定することができません。
したがって、さまざまな互換性を実現するには、元のドット表記に従ってアクセスして設定する必要があります。

document.getElementById("banana").class 
document.getElementById("banana").style.color 
document.getElementById("banana").onclick 
document.getElementById("banana").class="fruit" 
document.getElementById("banana").style.color="blue" 
document.getElementById("banana").onclick= function (){alert("我是香蕉")}
ログイン後にコピー

Firefox での onload の問題について

function over(){ 
alert("页面加载完毕") 
}
ログイン後にコピー

通常の状況では、onload 応答関数はassign は次のとおりです:
document.body.onload= over
ただし、これは Firefox では実行できません。
そのため、次の形式を使用します:
window.onload=over

概要IE TABLE

に新しい行を挿入できない問題 IE では、innerHTML または appendChild を使用して を TABLE に挿入しても影響はありませんが、他のブラウザでは正常に表示されます。これを解決する方法は、以下に示すように、TABLE の 要素に追加することです。

var row = document.createElement("tr"); 
var cell = document.createElement("td"); 
var cell_text = document.createTextNode("香蕉不吃苹果"); 
cell.appendChild(cell_text); 
row.appendChild(cell); 
document.getElementsByTagName("tbody")[0].appendChild(row);
ログイン後にコピー

1. 🎜>(1) 既存の問題:
既存のコードには document.formName.item("itemName") のようなステートメントが多数あり、MF では実行できません
(2) 解決策:
document を使用します代わりに .formName.elements["elementName"]
(3) その他
2 を参照

2. コレクション クラス オブジェクトの問題
(1) 既存の問題:
今はたくさんありますコード内のコレクション クラス オブジェクトにアクセスするときに () を使用する場合、IE はそれを受け入れることができますが、MF は受け入れられません。
(2) 解決策:
添字演算として代わりに [] を使用します。例: document.forms("formName") は document.forms["formName"] に変更されます。
別の例: document.getElementsByName("inputName")(1) が document.getElementsByName("inputName")[1]
(3) その他

3 に変更されました。 >(1)既存の問題:
MF 上で window.event を使用すると実行できない
(2)解決策:
MF のイベントはイベントが発生する場面でしか使用できません この問題はまだ解決できません。次のように変更できます:
元のコード (IE で実行可能):


新しいコード (IE および MF で実行可能):
<input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit()"/> 
... 
<script language="javascript"> 
function gotoSubmit() { 
... 
alert(window.event); // use window.event 
... 
} 
</script>
ログイン後にコピー

<input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit(event)"/> 
... 
<script language="javascript"> 
function gotoSubmit(evt) { 
evt = evt ? evt : (window.event ? window.event : null); 
... 
alert(evt); // use evt 
... 
} 
</script>
ログイン後にコピー

此外,如果新代码中第一行不改,与老代码一样的话(即 gotoSubmit 调用没有给参数),则仍然只能在IE中运行,但不会出错。所以,这种方案 tpl 部分仍与老代码兼容。

4. HTML 对象的 id 作为对象名的问题
(1)现有问题
在 IE 中,HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用。在 MF 中不能。
(2)解决方法
用 getElementById("idName") 代替 idName 作为对象变量使用。

5. 用idName字符串取得对象的问题
(1)现有问题
在IE中,利用 eval(idName) 可以取得 id 为 idName 的 HTML 对象,在MF 中不能。
(2)解决方法
用 getElementById(idName) 代替 eval(idName)。

6. 变量名与某 HTML 对象 id 相同的问题
(1)现有问题
在 MF 中,因为对象 id 不作为 HTML 对象的名称,所以可以使用与 HTML 对象 id 相同的变量名,IE 中不能。
(2)解决方法
在声明变量时,一律加上 var ,以避免歧义,这样在 IE 中亦可正常运行。
此外,最好不要取与 HTML 对象 id 相同的变量名,以减少错误。
(3)其它
参见 问题4

7. event.x 与 event.y 问题
(1)现有问题
在IE 中,event 对象有 x, y 属性,MF中没有。
(2)解决方法
在MF中,与event.x 等效的是 event.pageX。但event.pageX IE中没有。
故采用 event.clientX 代替 event.x。在IE 中也有这个变量。
event.clientX 与 event.pageX 有微妙的差别(当整个页面有滚动条的时候),不过大多数时候是等效的。

如果要完全一样,可以稍麻烦些:
mX = event.x ? event.x : event.pageX;
然后用 mX 代替 event.x
(3)其它
event.layerX 在 IE 与 MF 中都有,具体意义有无差别尚未试验。


8. 关于frame
(1)现有问题
在 IE中 可以用window.testFrame取得该frame,mf中不行
(2)解决方法
在frame的使用方面mf和ie的最主要的区别是:
如果在frame标签中书写了以下属性:

<frame src="xx.htm" id="frameId" name="frameName" />
ログイン後にコピー


那么ie可以通过id或者name访问这个frame对应的window对象
而mf只可以通过name来访问这个frame对应的window对象
例如如果上述frame标签写在最上层的window里面的htm里面,那么可以这样访问
ie: window.top.frameId或者window.top.frameName来访问这个window对象
mf: 只能这样window.top.frameName来访问这个window对象

另外,在mf和ie中都可以使用window.top.document.getElementById("frameId")来访问frame标签
并且可以通过window.top.document.getElementById("testFrame").src = 'xx.htm'来切换frame的内容
也都可以通过window.top.frameName.location = 'xx.htm'来切换frame的内容
关于frame和window的描述可以参见bbs的‘window与frame'文章
以及/test/js/test_frame/目录下面的测试
----adun 2004.12.09修改

9. 在mf中,自己定义的属性必须getAttribute()取得
10.在mf中没有 parentElement parement.children 而用
parentNode parentNode.childNodes
childNodes的下标的含义在IE和MF中不同,MF使用DOM规范,childNodes中会插入空白文本节点。
一般可以通过node.getElementsByTagName()来回避这个问题。
当html中节点缺失时,IE和MF对parentNode的解释不同,例如

<form> 
<table> 
<input/> 
</table> 
</form>
ログイン後にコピー

MF中input.parentNode的值为form, 而IE中input.parentNode的值为空节点

MF中节点没有removeNode方法,必须使用如下方法 node.parentNode.removeChild(node)

11.const 问题
(1)现有问题:
在 IE 中不能使用 const 关键字。如 const constVar = 32; 在IE中这是语法错误。
(2)解决方法:
不使用 const ,以 var 代替。

12. body 对象
MF的body在body标签没有被浏览器完全读入之前就存在,而IE则必须在body完全被读入之后才存在

13. url encoding
在js中如果书写url就直接写&不要写&例如var url = 'xx.jsp?objectName=xx&objectEvent=xxx';
frm.action = url那么很有可能url不会被正常显示以至于参数没有正确的传到服务器
一般会服务器报错参数没有找到
当然如果是在tpl中例外,因为tpl中符合xml规范,要求&书写为&
一般MF无法识别js中的&


14. nodeName 和 tagName 问题
(1)现有问题:
在MF中,所有节点均有 nodeName 值,但 textNode 没有 tagName 值。在 IE 中,nodeName 的使用好象
有问题(具体情况没有测试,但我的IE已经死了好几次)。
(2)解决方法:
使用 tagName,但应检测其是否为空。

15. 元素属性
IE下 input.type属性为只读,但是MF下可以修改


16. document.getElementsByName() 和 document.all[name] 的问题
(1)现有问题:
在 IE 中,getElementsByName()、document.all[name] 均不能用来取得 p 元素(是否还有其它不能取的元素还不知道)。

 以上就是Javascript多种浏览器兼容写法分析_javascript技巧的内容,更多相关内容请关注PHP中文网(www.php.cn)!


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホット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ヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 Dec 17, 2023 pm 02:54 PM

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

Win10 の最も安定したバージョン Win10 の最も安定したバージョン Dec 25, 2023 pm 07:58 PM

多くのユーザーは、コンピューターの操作中にフリーズやブルー スクリーンに遭遇することがありますが、現時点では、最も安定して動作する Win10 バージョンを見つける必要があります。全体的に非常に使いやすく、毎日の使用がスムーズになります。史上最も安定したWin10バージョン 1. Win10純正のオリジナルシステム. ユーザーは簡単な操作を使用できます. システムは最適化されており、強力な安定性、セキュリティと互換性を備えています. ユーザーは手順に従って完璧なマシンを達成できます. 2. ロシアのマスター合理化 win10 のバージョンは厳密に合理化され、多くの不要な機能やサービスが削除されました。合理化後は、システムの CPU とメモリの使用量が減り、動作が速くなります。 3. Win10 Lite Edition 1909 は、異なるハードウェア モデルの複数のコンピューターにインストールされています。

WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 Dec 17, 2023 am 09:39 AM

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 Dec 17, 2023 pm 12:09 PM

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 Dec 17, 2023 pm 05:13 PM

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

Win11はダイナミック壁紙をサポートしていますか? Win11はダイナミック壁紙をサポートしていますか? Jan 01, 2024 pm 06:41 PM

ご存知のとおり、win11 の主な機能は独自の Android サブシステムであり、エミュレータを使用せずに Android ソフトウェアをインストールできますが、win11 Android アプリケーションの遅延の問題もあります。 win11 はダイナミック壁紙に対応していませんか? 回答: Win11 はダイナミック壁紙に対応していますが、使用できない場合は、ソフトウェアまたはシステムのバージョンが遅れている可能性があります。更新されたばかりの場合は、システムの壁紙で覆われている可能性があります。 1. システムまたはソフトウェアのバージョンが遅れている場合は、システムとダイナミック壁紙ソフトウェアを更新してください。 2. システムの壁紙で覆われている場合は、「設定」を開いてみてください。 3. 次に、「個人用設定」で「背景」設定を入力します。 4. 次に、パーソナライズされた背景を「写真」に変更します。 5. 変更が完了したら、通常どおりダイナミック壁紙を設定できます。

See all articles