(轉)瀏覽器兼容的JS寫法總結

-、元素查找問題
1. document.all[name]
? (1)現有問題:Firefox不支持document.all[name]
? (2)解決方法:使用getElementsByName(name),getElementById(id)等來替代。

2. 集合類對象問題
? (1)現有問題:IE中對許多集合類對象取用時可以用 (),但在Firefox只能用[]。
????? 如:IE中可以使用document.forms("formName")來返回名字為"formName"的Form,但在Firefox卻行不通。
?? (2)解決方法:使用[],上例中可以改為document.forms["formName"]

3. HTML元素的ID在JavaScript可見
? (1)現有問題:IE中HTML元素中的ID可以作為document的下屬對象變量名直接使用。在Firefox中不能。
? (2)解決方法:使用getElementById("idName")代替idName作為對象變量使用。

4. eval(idName)取得對象
? (1)現有問題:在IE中,利用eval(idName)可以取得ID為idName的HTML對象,在Firefox中不能。
? (2)解決方法:用 getElementById(idName) 代替 eval(idName)。
??
5. 變量名與某HTML對象ID相同
? (1)現有問題:在Firefox中,因為對象ID不作為HTML對象的名稱,所以可以使用與HTML對象id相同的變量名,IE中不能。
? (2)解決方法:在聲明變量時,一律加上var,以避免歧義,這樣在IE中亦可正常運行。此外,最好不要取與HTML對象id相同的變量名,以減少錯誤。

? 注:3、4和5都屬于同一類的問題。

6. Frame
? (1)現有問題:在IE中可以用window.top.frameId和window.top.frameName來得到該Frame所代表的Window,Firefox中只能用window.top.frameName。
? (2)解決方法:將Frame的Id和Name設置成相同,使用window.top.frameName來訪問Frame。

二、DOM操作
1. 設置元素的文本內容。
? (1)現有問題:IE使用innerText,而Firefox使用textContent來設置元素文本內容。
? (2)解決方法:如果文本內容不包含"<"和">"等特殊字符,可以使用innerHTML。否則,可以使用:
??????? var child = elem.firstChild;
??????????? if (child != null) elem.removeChild(child);
??????????? elem.appendChild(document.createTextNode(content));

2. parentElement,parent.children
? (1)現有問題:IE可以使用parentElement獲得父結點,parent.children得到結點的所有孩子結點。Firefox不支持。
? (2)解決方法:使用parentNode和parent.childNodes。

3. 對childNodes的解釋。
? (1)現有問題:IE和Firefox中對childNodes的解釋不同,IE不會包含空白文本結點,而Firefox會包含。
? (2)解決方法:使用childNodes過濾文本結點,如下:
????? var children = elem.childNodes;
????????? for (i = 0; i < children.length; i++) {
??????????? if (children[i].nodeType != 3) { // 過濾文本結點
????????????? // ...
??????????? }
????????? }

4. 對document.getElementsByName的解釋。
? (1)現有問題:IE中getElementsByName只會檢查<input>和<img>元素,而在Firefox下會檢查所有元素。
? (2)解決方法:不要使用getElementsByName檢查除<input>和<img>之外的元素,如果要獲得單個元素,盡量使用getElementById。

5. 對document.getElementById的解釋。
? (1)現有問題:IE中getElementById不僅檢查Id屬性,也會檢查Name屬性,當Name屬性匹配參數時也會返回該元素。而在Firefox中只會檢查Id屬性。
? (2)解決方法:盡量保持Id和Name相同,不要讓一個元素name屬性和另一個元素的id屬性相同。
?

三、事件
1. event.x與event.y問題
? (1)現有問題:在IE中,event對象有x,y 屬性,Firefox中沒有。
? (2)解決方法:在Firefox中,與event.x 等效的是 event.pageX。可以使用:
????? mX = event.x ? event.x : event.pageX;
??????
2. window.event
? (1)現有問題:使用window.event無法在Firefox上運行
? (2)解決方法:
???????? 原代碼(可在IE中運行):
??????????? <input type="button" name="someButton" value="提交" οnclick="javascript:gotoSubmit()"/>
??????????? ...
??????????? <script language="javascript">
??????????????? function gotoSubmit() {
??????????????????? ...
??????????????????? alert(window.event);??? // use window.event
??????????????????? ...
??????????????? }
??????????? </script>

??????? 新代碼(可在IE和Firefox中運行):
??????????? <input type="button" name="someButton" value="提交" οnclick="javascript:gotoSubmit(event)"/>
??????????? ...
??????????? <script language="javascript">
??????????????? function gotoSubmit(evt) {
??????????????????? evt = evt ? evt : (window.event ? window.event : null);
??????????????????? ...
??????????????????? alert(evt);???????????? // use evt
??????????????????? ...
??????????????? }
??????????? </script>

3. attachEvent和addEventListener
? (1)現有問題:IE中使用attachEvent來添加事件,Firefox中使用addEventListener。
? (2)解決方法:如下,注意事件參數的區別,一個是click,一個是onclick。
??????? if (document.attachEvent) document.attachEvent("click", clickHandler,false);
??????? else document.addEventListener("onclick",clickHandler);

四、語法
1. const
? (1)現有問題:在IE中不能使用const關鍵字。如const constVar = 32;在IE中這是語法錯誤。
? (2)解決方法:不使用const,以var代替。

2. 多余的逗號
? (1)現有問題:firefox中對象文字常量容許多余的逗號,在IE中不允許。下面語句在IE中非法。
????? var obj = { 'key' : 'aaa', }
? (2)解決方法:去掉多余逗號。
??
五、XML
1. 創建XMLHttpRequest
? (1)現有問題:Firefox使用XMLHttpRequest,IE使用ActiveXObject。
? (2)解決方法:
????? if (window.XMLHttpRequest) {
????????? req = new XMLHttpRequest();
????? } else if (window.ActiveXObject) {
????????? req = new ActiveXObject("Microsoft.XMLHTTP");
????? }

2. 創建DOM
? (1)現有問題:Firefox和IE創建DOM的方式不同。
? (2)解決方法:
??????? function createXmlDom() {
????????? var oXmlDom;
????????? if (Window.ActiveXObject) { // IE
??????????? oXmlDom = new ActiveXObject("Microsoft.XmlDom");
????????? } else {? // Firefox
??????????? oXmlDom = document.implementation.createDocument("", "", null);
????????? }
??????? }

3. 加載XML
? (1)現有問題:如果要加載外部文件IE和Firefox都可以用:
????????? oXmlDom.async=false;????? // 這在Firefox中是必須的
????????? oXmlDom.load("test.xml");
???? 但是它們加載xml字符串的方式不一樣,IE中直接可以使用oXmlDom.loadXML("<root><child/></root>"),而Firefox要使用DOMParser:
??????? var oParser = new DOMParser();
????????? var oXmlDom = oParser.parseFromString("<root/>", "text/xml");
? (2)解決方法:比較好的方法是給Firefox產生的XMLDom加上loadXML方法:
??????? if (isFirefox) { // 需要瀏覽器檢測
????????? Document.prototype.loadXML = function(sXml) {
??????????? var oParser = new DOMParser();
??????????? var oXmlDom = oParser.parseFromString(sXml, "text/xml");
????????????
??????????? while (this.firstChild) this.removeChild(this.firstChild);
????????????
??????????? for (var i = 0; i < oXmlDom.childNodes.length; i++) {
????????????? var oNewNode = this.importNode(oXmlDom.childNodes[i], true);
????????????? this.appendChild(oNewNode);
??????????? }
????????? }
??????? }
????? 這樣在IE和Firefox就可以調用loadXML方法了。
??????
4. XPath支持
? (1)現有問題:IE中可以直接用XmlDOM的selectNodes來根據XPath表示式來選擇結點,Firefox則比較復雜,需要使用XPathEvaluator。
???? IE:?
??????? var lstNodes = oXmlDom.documentElement.selectNodes("employee/name");
??????? for (var i = 0; i < lstNodes.length; i++) {
????????? alert(lstNodes[i].firstChild.nodeValue);
??????? }
???? Firefox:?
????????? var oEvaluator = new XPathEvaluator();
????????? var oResult = oEvaluator.evaluate("employee/name", oXmlDom.documentElement, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
????????? var oElement = oResult.iterateNext();
????????? while (oElement) {
??????????? alert(oElement.firstChild.nodeValue);
??????????? oElement = oResult.iterateNext();
????????? }
? (2)解決方法:比較好的方法給Firefox的Element添加selectNodes方法。
??????? if (isFirefox) { // 需要瀏覽器檢測
??????????? Element.prototype.selectNodes = function(sXPath) {
??????????? var oEvaluator = new XPathEvaluator();
????????????? var oResult = oEvaluator.evaluate(sXPath, this, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
??????????????
????????????? var aNodes = new Array();
??????????????
????????????? if (oResult != null) {
??????????????? var oElement = oResult.iterateNext();
??????????????? while (oElement) {
????????????????? aNodes.push(oElement);
????????????????? oElement = oResult.iterateNext();
??????????????? }
????????????? }
????????????? return aNodes;
?????????? }
????? }
?? 這樣在IE和Firefox中就都可以調用selectNodes方法了。
???
5. XSLT支持
? (1)現有問題:IE中可以使用XmlDOM的transferNode方法將其轉換成html,而Firefox需要使用XSLTProcessor。
? IE:
??????? oXmlDom.load("employee.xml");
??????? oXslDom.load("employee.xslt");
??????? var sResult=oXmlDom.transformNode(oXslDom);
??? Firefox:
??????? var oProcessor = new XSLTProcessor();
??????? oProcessor.importStylesheet(oXslDom);
??????? var oResultDom = oProcessor.transformToDocument(oXmlDom);????????
??????? var oSerializer = new XMLSerializer();
??????? var sXml = oSerializer.serializeToString(oResultDom, "text/xml");
??????? alert(sXml);
? (2)解決方法:比較好的方法給Firefox的Node添加transferNode方法。
??????? if (isFirefox) { // 需要瀏覽器檢測
????????? Node.prototype.transformNode = function(oXslDom) {
????????? var oProcessor = new XSLTProcessor();
??????????? oProcessor.importStylesheet(oXslDom);
??????????? var oResultDom = oProcessor.transformToDocument(oXmlDom);
????????????
??????????? var oSerializer = new XMLSerializer();
??????????? var sXml = oSerializer.serializeToString(oResultDom, "text/xml");
????????????
??????????? return sXml;
????????? }
??????? }
?? 這樣在IE和Firefox中就都可以調用transferNode方法了。

?

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/ypacyhero/archive/2010/05/04/5556242.aspx

轉載于:https://www.cnblogs.com/christal-11/p/5776647.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458055.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458055.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458055.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java面試總結(第一天)

臨近大學畢業&#xff0c;出來試試找工作&#xff0c;學c#出身&#xff0c;半路出家java&#xff0c;做過幾個ssh、stringMVC的項目。基礎知識不太扎實&#xff0c;勿噴 以下是我面試過程中遇到的問題 ----------------------------------------------------------------------…

怎么看cudnn的版本好_祖墳風水怎么看,好祖墳有什么征兆?

人們之所以看重祖墳的風水&#xff0c;是因為祖墳的風水與后代子孫的運勢密切相關&#xff0c;可以說祖墳的風水好不好關系著子孫后代的運勢順不順&#xff0c;因此對于祖墳的風水好壞人們是非常在意的&#xff0c;那么祖墳風水怎么看,好祖墳有什么征兆呢&#xff1f;下面是小編…

iOS - Swift SQLite 數據庫存儲

前言 采用 SQLite 數據庫來存儲數據。SQLite 作為一中小型數據庫&#xff0c;應用 iOS 中&#xff0c;跟前三種保存方式相比&#xff0c;相對比較復雜一些。注意&#xff1a;寫入數據庫&#xff0c;字符串可以采用 char 方式&#xff0c;而從數據庫中取出 char 類型&#xff0c…

Hibernate 多對多關聯查詢條件使用

from Brand as b inner join fetch b.styles as s where s.styleId? 轉載于:https://www.cnblogs.com/cocoat/p/5427467.html

Spark 寬依賴和窄依賴

2019獨角獸企業重金招聘Python工程師標準>>> 我們知道RDD就是一個不可變的帶分區的記錄集合&#xff0c;Spark提供了RDD上的兩類操作&#xff0c;轉換和動作。轉換是用來定義一個新的RDD&#xff0c;包括map, flatMap, filter, union, sample, join, groupByKey, co…

smart gesture安裝失敗_WinCC flexible SMART V3 SP2安裝步驟以及常見錯誤解決方法

1安裝配置1. win7和win10系統都可以裝2. 運行內存至少要2G。3. 硬盤儲存空間至少要3G。2安裝注意事項1.安裝本軟件之前必須要關閉所有殺毒軟件(例如360安全衛士/360殺毒/電腦管家)等。2.其它西門子軟件不要使用或者打開。3.安裝之前確保硬盤空間充足。3下載地址https://bbs.jcp…

各類數據集整理(持續更新中ing)

轉自&#xff1a;https://zhuanlan.zhihu.com/p/84088095 最近一次新增&#xff1a;2020.02.11 大家好&#xff0c;先給各位抱拳了&#xff01;我是和鯨&#xff08;科賽 http://kesci.com&#xff09;的運營一枚&#xff0c;今天給大家分享以下我們&#xff08;通過網線&…

Java Experiment 3 PairProgramming

http://www.cnblogs.com/20145106ssr/p/5428222.html 轉載于:https://www.cnblogs.com/Christen/p/5428655.html

啟動頁面和各設備的寬高比及像素

2019獨角獸企業重金招聘Python工程師標準>>> iOS7只能用LaunchImage來布置啟動畫面&#xff0c;只能用圖片。iOS8以后支持LaunchScreen.xib來布置&#xff0c;可以自己添加控件。iOS8以及以后的用LaunchScreen來配置啟動頁。iOS8以后的會走這個設置&#xff0c;而io…

cc壓力測試_中小型網站如何防范CC攻擊?

大公司就不說了&#xff0c;付費CDN&#xff0c;防火墻&#xff0c;WAF&#xff0c;大流量&#xff0c;一般也會配置專門的安全問題響應團隊。今天側重討論一下中小型網站如何&#xff08;優雅&#xff09;防范CC攻擊。中小站點安全問題通病&#xff1a;對安全問題不重視&#…

ubuntu16.04 360隨身WiFi2

查看kernel版本&#xff0c;插入360隨身WiFi2&#xff0c;打開終端&#xff0c;執行下面命令即可。 ------------------------------------------------------------------------------------------------------------- From your kernel version, 4.2.0-16, it appears that…

泛型復習

回顧泛型類 泛型類&#xff1a;具有一個或多個泛型變量的類被稱之為泛型類1、class A<T>{} 2、在創建泛型實例時&#xff0c;需要為其類型變量賦值A<String> anew A<String>(); *如果創建實例時&#xff0c;不給類型變量賦值&#xff0c;那么會有一個警告&am…

.net core EPPlus npoi_2020 ASP.NET界面開發:DevExpress v20.1支持.NET Core設計時

DevExpress ASP.NET Web Forms Controls擁有針對Web表單(包括報表)的110種UI控件&#xff0c;DevExpress ASP.NET MVC Extensions是服務器端MVC擴展或客戶端控件&#xff0c;由輕量級JavaScript小部件提供支持的70個高性能DevExpress ASP.NET Core Controls&#xff0c;包含功能…

ubuntu android studio SDK emulator directory is missing

ctrlH&#xff0c;搜索Android studio&#xff0c;把所有的都刪除&#xff0c;再次安裝即可下載

有關于我的一點想法

之前失眠寫的&#xff0c;從空間搬運過來 之前一直想寫一下有關自己想法。趁著失眠寫一寫。 不知道是不是幸運&#xff0c;我有幸認識了吳寶俊老師。他寫博客&#xff0c;我經常去看他寫的博客。后來在留言板發言幾次也就熟了。雖然也僅限網友吧……但是我需要人給我指點迷津。…

mac電腦如何與手機同步復制粘貼_如何將電腦里的文件同步到手機里?

由于PDF的特殊性&#xff0c;一般很少有適用于手機編輯的軟件&#xff0c;所以我們都習慣于使用電腦來修改PDF文檔后&#xff0c;再發送到手機微信發送給其他人&#xff0c;那么如何快速將電腦里的PDF文件同步到手機里面呢&#xff1f;可能很多人會想到使用各種云盤&#xff0c…

走進緩存的世界(一) - 開篇

系列文章 走進緩存的世界&#xff08;一&#xff09; - 開篇走進緩存的世界&#xff08;二&#xff09; - 緩存設計走進緩存的世界&#xff08;三&#xff09; - Memcache概述 對于程序員來說多多少少都懂一點算法&#xff0c;算法是什么&#xff1f;算法是“時間”與“空間”的…

【解決問題】OpenCV(3.4.1) Error: Parsing error (xx.yaml(13): Incorrect indentation) in icvYMLParseValue

本博客運行環境為Ubuntu18.04 下 Kdevelop。 運行slam的一個cpp文件時&#xff0c;錯誤描述如下&#xff1a; OpenCV(3.4.1) Error: Parsing error (KITTI00-02.yaml(13): Incorrect indentation) in icvYMLParseValue, file /home/hadoop/opencv-3.4.1/modules/corec/persis…

dede后臺欄目管理文章統計數量和實際文章數不一致解決辦法

操作dede_arctiny表&#xff0c;將和欄目對應的typeid所有文章去掉即可。轉載于:https://www.cnblogs.com/zgzy/p/5432724.html

an 轉換器_400V耐壓場效應管替代IRF730B型號參數,使用在DC-DC電源轉換器。_場效應管吧...

DC-DC電源轉化器的應用場景逐漸廣泛&#xff0c;那么適用于DC-DC電源模塊的場效應管需求也隨之越來越高&#xff0c;這時候電源轉化器廠的電子工程師就要留意了&#xff0c;國內是否有優質的場效應管能替代IRF730B型號呢&#xff0c;其實是有的&#xff0c;FHP840其實是可以跟I…