首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

IE 與 Firefox 常見 JavaScript 兼容性差異完整對照表

     編輯:PHP 相關知識

前言

雖然現代瀏覽器已高度標準化,但維護舊專案時仍需面對 IE 與 Firefox(Gecko)的差異。本文整理 25 項核心差異與解決方案。

核心差異對照表

#問題IE 行為Firefox 行為統一解決方案
1表單元素存取document.form.item()不支援document.form.elements["name"]
2集合取值語法collection("key")僅支援 collection["key"]統一用方括號 []
3event 物件全域 window.event僅事件處理函數參數可用參數傳遞:function(e){ e = e || window.event }
4ID 當變數可直接用 idName不可document.getElementById("idName")
5字串取元素eval("idName")不可document.getElementById(idName)
6變數名衝突ID 與變數同名衝突不衝突宣告變數加 var,避免同名
7滑鼠座標event.x / event.yevent.pageX / pageYevent.clientX / clientY 兩者皆支援
8Frame 存取ID 或 Name 皆可僅 Namewindow.frames["name"] 或 document.getElementById("id").contentWindow
9自訂屬性直接 obj.attr需 getAttribute()統一用 getAttribute()/setAttribute()
10父節點parentElementparentNode統一用 parentNode
11childNodes 空白節點不包含包含文字節點getElementsByTagName() 避開
12const 關鍵字不支援支援改用 var 或 const 配合 Babel 轉譯
13body 就緒時機解析完才存在標籤讀入即存在統一用 DOMContentLoaded 或 defer
14URL 編碼接受 &需 & 或 &JS 中直接用 &,模板用 &
15nodeName/tagNametagName 可能有問題文字節點無 tagName用 tagName 並檢查非空
16input.type 唯讀唯讀可修改勿動態修改 type,改用 replaceNode
17getElementsByName不可取 div可取任何元素改用 querySelectorAll('[name="x"]')
18游標手型cursor: hand不支援標準 cursor: pointer
19半透明filter: Alpha(Opacity=50)不支援 filteropacity: 0.5(IE9+),舊 IE 套雙重寫法
20去除連結虛線框blr: expression(...)不支援 expression:focus { outline: none; }
21捲軸顏色支援 scrollbar-*不支援放棄自訂捲軸,或用 JS 模擬
22border-width 方向上右下左同上但渲染差異明確寫四個值或分開屬性
23body scroll="no"支援不支援html { overflow: hidden; }
24word-break支援 break-all不支援(舊版)word-wrap: break-word + table-layout: fixed
25錨點 name/id支援 <a name="x">需 id="x"兩者並寫 <a id="x" name="x">

現代化建議

  1. 使用 Polyfill(如 core-js)填補標準 API 差異
  2. 採用 Babel + browserslist 自動轉譯語法
  3. 用 feature detection 替代瀏覽器嗅探(if ('querySelector' in document))
  4. 引入 Normalize.css 統一預設樣式
  5. 建立 BrowserStack 自動化測試流程

快速修正清單

// 統一事件處理
function addEvent(el, type, fn) {
    if (el.addEventListener) el.addEventListener(type, fn, false);
    else el.attachEvent('on' + type, fn);
}

// 統一取元素
const $ = (id) => document.getElementById(id);

// 統一事件對象
function fixEvent(e) {
    e = e || window.event;
    e.target = e.target || e.srcElement;
    e.preventDefault = e.preventDefault || function(){ e.returnValue = false; };
    e.stopPropagation = e.stopPropagation || function(){ e.cancelBubble = true; };
    return e;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved