2012-03-19 57 views
0

我們在IE6到IE8的瀏覽器上支持一箇舊的基於Web的應用程序,JavaScript和css對於IE來說非常具體。現在我們要支持IE9。在我們的javascript中,有許多語法在IE9中不受支持,例如使用點(.)訪問元素實例的HTML屬性,而不是setAttributegetAttribute以有組織的方式支持新瀏覽器

我只是想知道什麼是支持更多瀏覽器版本或支持不同瀏覽器的最佳方式。

我在想使用jQuery來訪問所有瀏覽器的非標準功能,或者編寫一個名爲browser的類有getAttribute這樣的方法,然後像IE7和IE9這樣的不同的類以它們特定的方式在加載時重載此方法。

我想使用最好的方式和用戶在這種情況下使用的方法。

setAttribute和GetAttribute只是簡單的例子,還有很多例如訪問我們使用document.all.elementName的元素引用,這是在Firefox的早期版本中不支持的。所以如何將所有這些代碼轉換爲Jquery或另一個庫。 有更多的問題,然後設置和獲取屬性,問題的焦點是什麼舊的javascript轉換爲支持的JavaScript在所有瀏覽器

感謝

最好的辦法
+1

我肯定會勸下去jQuery的路線,因爲我已經做了同樣的事情(用它來針對不同的瀏覽器/版本)和更多的時候不是,它的工作原理治療。 – 2012-03-19 12:32:41

+3

你寫的關於使用「的setAttribute」和「的getAttribute」是什麼讓我覺得你有更多的問題比你知道的,因爲這些並非總是正確的事做對舊的瀏覽器無論是。事實上,如果您使用這些機制訪問應該被視爲DOM元素屬性的東西,那麼絕大多數的東西都不會工作。 – Pointy 2012-03-19 12:38:34

回答

1

如果您有大量專門爲IE < 9編寫的代碼,您希望在其他瀏覽器中工作,則首先需要標識所有IE特定代碼,然後用跨瀏覽器代碼替換它。我不認爲任何特定的圖書館都會對此有所幫助,實際上POJS可能更容易。例如,您可以使用document.getElementById來監督更換document.all,但是您不能使用$(其中$來自jQuery或Prototype或其他任何項目)執行此操作。

使用點屬性訪問和非標準屬性會產生問題,但是如果將它們設置爲屬性,那麼您將會很好(儘管原則上這樣做不是個好主意)。順便提一句,jQuery不會「覆蓋」get/setAttribute,它有自己的attrprop方法。

最終,你將有可能最終從頭開始重寫了整個事情。請記住,不要針對特定​​的瀏覽器版本,支持標準,並在必要時使用feature detection以及良好的回退策略來解決非標準行爲。

+0

感謝您的反饋,我喜歡使用功能檢測而不是檢查瀏覽器的建議 – daljit 2012-03-20 12:19:06

2

絕對推薦與庫要平滑過度瀏覽器差異並提供許多有用的實用功能。有很多選擇:jQueryYUIClosure,Prototypeany of several others。 jQuery是hugely dominant at the moment因此可以更容易地找到熟悉它的人(並且它有活躍的開發資源,贊助等),但是您選擇的庫取決於您。

還強烈建議在DOM2 HTML specification和HTML5規範的Web Application APIs部分密切關注,因爲有您要使用的屬性的反射屬性,而不是getAttribute/setAttribute倍。例如,element.id是引用元素ID的完全有效的跨瀏覽器方式;你不需要使用element.getAttribute("id")。同樣,你想要使用element.className而不是element.getAttribute("class")(它在某些早期版本的IE上工作不正確)。的確,IE8和更早的版本還將其他屬性放在任意屬性的元素上(例如,如果元素上有foo屬性,則可以將其存儲爲element.foo,或者如果您有data-foo,則可以使用element['data-foo']),而IE9和其他瀏覽器不要(有很好的理由!),但對於標準屬性,通常會有反射屬性。

如果您在元素上使用任意屬性,還建議根據HTML5規範將其名稱更改爲the data-* format

+0

感謝您的反饋,如果我去任何圖書館,這將是jQuery和感謝有用的鏈接。 – daljit 2012-03-20 12:22:05

2

IE 9絕對不支持訪問反映HTML屬性的DOM屬性,這與過去15年中發佈的所有主流瀏覽器都是一樣的,所以我不確定你聽說它不在哪裏[編輯:Aaaah,我想你正在談論自定義屬性]。這些屬性在DOM規範中已經標準化,因此可以保證在未來的瀏覽器中有效。此外,使用屬性通常更方便和更兼容,而不是使用屬性而不是使用getAttribute()setAttribute()(特別是在較舊的IE中,這已破壞了這些方法的實現)。

庫如jQuery做有助於平抑了瀏覽器的問題和不兼容但實際上這些都不是幾乎一樣多或有問題,因爲很多人認爲,尤其是當你可以打折舊版本的IE。這些庫的存在造就了流行的神話,即在沒有它們的情況下,瀏覽器中的DOM操作是困難和有問題的。通常情況下,它不是,現在這些問題比以往更好地理解和記錄。

+0

+1好的建議。 – RobG 2012-03-19 13:41:05

+0

感謝您的反饋,我確實同意庫添加額外的圖層並阻止開發人員瞭解底層語言。 – daljit 2012-03-20 12:20:20

+1

@daljit:如果開發允許使用一個庫,以防止他們的理解如何JS和DOM的工作,這就是下到開發者,而不是圖書館。我對於其他人已經發現和解決的Safari來說,並不感興趣,例如Safari。而且我* *得多,而使用比重新創建一個良好的庫提供的實用功能(因爲重建幾乎沒有人會想通過又一遍地輸入了所有這些詳細的東西)。我的兩分錢。絕對確保你知道真正發生了什麼,但不要讓寶寶洗澡。 – 2012-03-20 13:25:52