以下以IE 取代Internet Explorer,以MF 取代Mozzila Firefox
1. document.form.item 問題
(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. window.event
(1)現有問題:
使用window.event 無法在MF 上執行
(2)解決方法:
MF 的event 只能在事件發生的現場使用,此問題暫無法解決。可以這樣變通:
原始碼(可在IE中運行):
<input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit()"/>
……
<script language="javascript">
function gotoSubmit() {
……
alert(window.event); // use window.event
……
}
</script>
新程式碼(可在IE和MF中運作):
<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] 均不能用來取得div 元素(是否還有其它不能取的元素還不知道)。