Javascript的IE和Firefox兼容性匯編

          以下以 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就直接寫&不要寫&amp;例如var url = 'xx.jsp?objectName=xx&amp;objectEvent=xxx';
          frm.action = url那么很有可能url不會被正常顯示以至于參數沒有正確的傳到服務器
          一般會服務器報錯參數沒有找到
          當然如果是在tpl中例外,因為tpl中符合xml規范,要求&書寫為&amp;
          一般MF無法識別js中的&amp;


          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 元素(是否還有其它不能取的元素還不知道)。

           

          1. 對象問題
          1.1 Form對象
          現有問題:
          現有代碼這獲得form對象通過document.forms("formName"),這樣使用在IE 能接受,MF 不能。
          解決方法:
          改用 作為下標運算。改為document.forms["formName"]
          備注
          上述的改用 作為下標運算中的formName是id而name

          1.2 HTML對象
          現有問題:
          在 IE 中,HTML 對象的 ID 可以作為 document 的下屬對象變量名直接使用。在 MF 中不能。
          document.all("itemName")或者document.all("itemId")
          解決方法:
          使用對象ID作為對象變量名
          document.getElementById("itemId")
          備注
          document.all是IE自定義的方法,所以請大家盡量不使用。
          還有一種方式,在IE和MF都可以使用
          var f = document.forms["formName "];
          var o = f. itemId;

          1.3 DIV對象
          現有問題:
          在 IE 中,DIV對象可以使用ID作為對象變量名直接使用。在 MF 中不能。
          DivId.style.display = "none"
          解決方法:
          document.getElementById("DivId").style.display = "none"
          備注
          獲得對象的方法不管是不是DIV對象,都使用getElementById方法。參見1.2


          1.4 關于frame
          現有問題
          在 IE中 可以用window.testFrame取得該frame,mf中不行
          解決方法
          在frame的使用方面MF和IE的最主要的區別是:
          如果在frame標簽中書寫了以下屬性:

          那么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的內容

          1.5 窗口
          現有問題
          IE中可以通過showModalDialog和showModelessDialog打開模態和非模態窗口,但是MF不支持。
          解決辦法
          直接使用window.open(pageURL,name,parameters)方式打開新窗口。
          如果需要傳遞參數,可以使用frame或者iframe。

          2. 總結
          2.1 在JS中定義各種對象變量名時,盡量使用id,避免使用name。
          在 IE 中,HTML 對象的 ID 可以作為 document 的下屬對象變量名直接使用。在 MF 中不能,所以在平常使用時請盡量使用id,避免只使用name,而不使用id。

          2.2 變量名與某 HTML 對象 id 相同的問題
          現有問題
          在 MF 中,因為對象 id 不作為 HTML 對象的名稱,所以可以使用與 HTML 對象 id 相同的變量名,IE 中不能。
          解決方法
          在聲明變量時,一律加上 var ,以避免歧義,這樣在 IE 中亦可正常運行。
          此外,最好不要取與 HTML 對象 id 相同的變量名,以減少錯誤。


          1. document.all
            Firefox可以兼容document.all, 但會生成一條警告。可以用getElementById("*") 或者 getElementByTagName("*)來代替
            不過對于document.all.length等屬性,則完全不兼容。
          2. parentElement
            這個也不兼容。比方說, obj.parentElement.name 則應改成 obj.parentNode.attributes.getNamedItem("name").nodeValue (不知道如何寫得更簡潔些)
          3. event
            W3C不支持windows.event
            比方說:
              在IE里面
                    <div class="menu" id="menu" onclick="onMenuClick(); ">.....</div>
                function onMenuClick()
                {
                  collapseMenu(event.srcElement);
                }
              工作正常。不過在Firefox中,則改成:

                  <div class="menu" id="menu" onclick="onMenuClick(event); ">
                  function onMenuClick(evt)
                {
                  if(evt == null)
                        evt = window.event; // For IE
                    var srcElement = evt.srcElement? evt.srcElement : evt.target; // IE使用srcElement, 而Firefox使用target
                  collapseMenu(srcElement);
          }


          IE和FIREFOX在解析CSS方面的區別
          對高度的解析
          IE:將根據內容的高度變化,包括未定義高度的圖片內容,即使定義了高度,當內容超過高度時,將使用實際高度

          Firefox:沒有定義高度時,如果內容中包括了圖片內容,MF的高度解析是根據印刷標準,這樣就會造成和實際內容高度不符合的情況;當定義了高度,但是內容超過高度時,內容會超出定義的高度,但是區域使用的樣式不會變化,造成樣式錯位。

          結論:大家在可以確定內容高度的情況下最好定義高度,如果真的沒有辦法定義高度,最好不用使用邊框樣式,否則樣式肯定會出現混亂!

          img對象alt和title的解析
          alt:當照片不存在或者load錯誤時的提示;

          title:照片的tip說明。

          在IE中如果沒有定義title,alt也可以作為img的tip使用,但是在MF中,兩者完全按照標準中的定義使用

          結論:大家在定義img對象時,最后將alt和title對象都寫全,保證在各種瀏覽器中都能正常使用

          其他的細節差別

          當你在寫css的時候,特別是用float: left(或right)排列一竄圖片時,會發現在firefox里面正常而IE里面有問題。無論你用margin:0,還是border: 0來約束,都無濟于事。

          其實這里還有另外一個問題,就是IE對于空格的處理,firefox是忽略的而IE對于塊與塊之間的空格是處理的。也就是說一個div結束后要緊接著一個div寫,中間不要有回車或者空格。不然也許會有問題,比如3px的偏差,而且這個原因很難發現。

          非常不走運的是我又碰到了這樣的問題,多個img標簽連著,然后定義的float: left,希望這些圖片可以連起來。但是結果在firefox里面正常而IE里面顯示的每個img都相隔了3px。我把標簽之間的空格都刪除都沒有作用。

          后來的解決方法是在img外面套li,并且對li定義margin: 0,這樣就解決了IE和firefox的顯示偏差。IE對于一些模型的解釋會產生很多錯誤問題,只有多多嘗試才能發現原因。

          這只是一些簡單的區別,在做布局和CSS設計時候可以綜合考慮,但最為有效與簡單的解決兼容問題還是用TABLE表格,表格在兼容性方面有著不錯的表現.

          另外在模版的JS設計的時候也需要考慮兩者對代碼的兼容,以下是對IE與FIREFOX中JS的一些測試:

          以下以 IE 代替 Internet Explorer,以 MF 代替 Mozilla 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 部分仍與老
                  代碼兼容。

                  ///////////////////////////////////////////////////////////////////////
                  // 以下來自網友 llihua     
                      //事件處理函數
                      function a(evt) { //FireFox
                      evt = evt? evt: window.event; //IE
                      var srcElem = (evt.target)? evt.target: evt.srcElement;
                      //事件處理...
                      }

          在連接事件處理函數的時候,可以用Inline HTML方式,也可以用Event
                      property方式定義。
                    
                          1、使用Inline HTML方式,如:
                          <input type="radio" name="radio" value="1"
                              onclick="javascript:a(event)">
                        
                              注意:
                              (1)javascript不能省;
                              (2)實參要使用event,形參使用什么都可以(如evt、event等);
                        
                          2、使用Event property方式綁定事件處理函數,如:
                              document.form2.radio[0].onclick = a;
                  // 以上來自網友 llihua     
                  ///////////////////////////////////////////////////////////////////////

          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 元素
               (是否還有其它不能取的元素還不知道)。

          17. DOM 數據島的問題
            (1)現有問題
               在IE中, <xml>標簽具有特殊意義, 可以內含XML DOM, 并能實現與HTML組件的數據
               綁定. 在MF中,<xml>則僅僅是一個未知的標記而已.
               另外, 對 IE 來說, <xml>實際意味著這里是一個ActiveX對象, 但它卻掛在HTML本
               身的DOM樹下作為一個節點, 因而會對DOM樹的遍歷造成嚴重影響.
            (2)解決方法
               IE的數據綁定機制是可以用JS來模擬的, 但是太麻煩, 建議不使用數據綁定機制或者
               尋找實現這種模擬的庫來做. 我們只討論如何實現DOM的兼容.
               在MF中無論已知的HTML標記還是其它符合XML規范的標記, 都是用統一的DOM樹來處理
               的, 因此, MF事實上完全可以使用DOM數據島, 但與IE小小的不同在于: 在IE中<xml>
               是個 DOM document, 而在MF只是 DOM node. 這個差別通常不足為患.
               但是有一個小小的細節, 為了兼容HTML相當隨意的語法, MF無法識別簡寫的空標記.
               如: <xml id="xx"><book><title>xxxx</title><content/><index/></book></xml>,
               這其中<content/>和<index/>是簡寫形式的, 會使MF無法識別, 應當寫成:
                   <content></content><index></index>
               不過, 我懷疑如果用XHTML, 可能就沒有這種問題. 但我還沒有試過.
               對于IE中<xml>干擾HTML的DOM結構問題, 我現在的方法是處理完畢后把它從HTML的
               DOM中刪除. 不知道還有沒有更好的解

          以下以 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就直接寫&不要寫&amp;例如var url = 'xx.jsp?objectName=xx&amp;objectEvent=xxx';
          frm.action = url那么很有可能url不會被正常顯示以至于參數沒有正確的傳到服務器
          一般會服務器報錯參數沒有找到
          當然如果是在tpl中例外,因為tpl中符合xml規范,要求&書寫為&amp;
          一般MF無法識別js中的&amp;


          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 元素(是否還有其它不能取的元素還不知道)。

           

          1. 對象問題
          1.1 Form對象
          現有問題:
          現有代碼這獲得form對象通過document.forms("formName"),這樣使用在IE 能接受,MF 不能。
          解決方法:
          改用 作為下標運算。改為document.forms["formName"]
          備注
          上述的改用 作為下標運算中的formName是id而name

          1.2 HTML對象
          現有問題:
          在 IE 中,HTML 對象的 ID 可以作為 document 的下屬對象變量名直接使用。在 MF 中不能。
          document.all("itemName")或者document.all("itemId")
          解決方法:
          使用對象ID作為對象變量名
          document.getElementById("itemId")
          備注
          document.all是IE自定義的方法,所以請大家盡量不使用。
          還有一種方式,在IE和MF都可以使用
          var f = document.forms["formName "];
          var o = f. itemId;

          1.3 DIV對象
          現有問題:
          在 IE 中,DIV對象可以使用ID作為對象變量名直接使用。在 MF 中不能。
          DivId.style.display = "none"
          解決方法:
          document.getElementById("DivId").style.display = "none"
          備注
          獲得對象的方法不管是不是DIV對象,都使用getElementById方法。參見1.2


          1.4 關于frame
          現有問題
          在 IE中 可以用window.testFrame取得該frame,mf中不行
          解決方法
          在frame的使用方面MF和IE的最主要的區別是:
          如果在frame標簽中書寫了以下屬性:

          那么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的內容

          1.5 窗口
          現有問題
          IE中可以通過showModalDialog和showModelessDialog打開模態和非模態窗口,但是MF不支持。
          解決辦法
          直接使用window.open(pageURL,name,parameters)方式打開新窗口。
          如果需要傳遞參數,可以使用frame或者iframe。

          2. 總結
          2.1 在JS中定義各種對象變量名時,盡量使用id,避免使用name。
          在 IE 中,HTML 對象的 ID 可以作為 document 的下屬對象變量名直接使用。在 MF 中不能,所以在平常使用時請盡量使用id,避免只使用name,而不使用id。

          2.2 變量名與某 HTML 對象 id 相同的問題
          現有問題
          在 MF 中,因為對象 id 不作為 HTML 對象的名稱,所以可以使用與 HTML 對象 id 相同的變量名,IE 中不能。
          解決方法
          在聲明變量時,一律加上 var ,以避免歧義,這樣在 IE 中亦可正常運行。
          此外,最好不要取與 HTML 對象 id 相同的變量名,以減少錯誤。


          1. document.all
            Firefox可以兼容document.all, 但會生成一條警告。可以用getElementById("*") 或者 getElementByTagName("*)來代替
            不過對于document.all.length等屬性,則完全不兼容。
          2. parentElement
            這個也不兼容。比方說, obj.parentElement.name 則應改成 obj.parentNode.attributes.getNamedItem("name").nodeValue (不知道如何寫得更簡潔些)
          3. event
            W3C不支持windows.event
            比方說:
              在IE里面
                    <div class="menu" id="menu" onclick="onMenuClick(); ">.....</div>
                function onMenuClick()
                {
                  collapseMenu(event.srcElement);
                }
              工作正常。不過在Firefox中,則改成:

                  <div class="menu" id="menu" onclick="onMenuClick(event); ">
                  function onMenuClick(evt)
                {
                  if(evt == null)
                        evt = window.event; // For IE
                    var srcElement = evt.srcElement? evt.srcElement : evt.target; // IE使用srcElement, 而Firefox使用target
                  collapseMenu(srcElement);
          }


          IE和FIREFOX在解析CSS方面的區別
          對高度的解析
          IE:將根據內容的高度變化,包括未定義高度的圖片內容,即使定義了高度,當內容超過高度時,將使用實際高度

          Firefox:沒有定義高度時,如果內容中包括了圖片內容,MF的高度解析是根據印刷標準,這樣就會造成和實際內容高度不符合的情況;當定義了高度,但是內容超過高度時,內容會超出定義的高度,但是區域使用的樣式不會變化,造成樣式錯位。

          結論:大家在可以確定內容高度的情況下最好定義高度,如果真的沒有辦法定義高度,最好不用使用邊框樣式,否則樣式肯定會出現混亂!

          img對象alt和title的解析
          alt:當照片不存在或者load錯誤時的提示;

          title:照片的tip說明。

          在IE中如果沒有定義title,alt也可以作為img的tip使用,但是在MF中,兩者完全按照標準中的定義使用

          結論:大家在定義img對象時,最后將alt和title對象都寫全,保證在各種瀏覽器中都能正常使用

          其他的細節差別

          當你在寫css的時候,特別是用float: left(或right)排列一竄圖片時,會發現在firefox里面正常而IE里面有問題。無論你用margin:0,還是border: 0來約束,都無濟于事。

          其實這里還有另外一個問題,就是IE對于空格的處理,firefox是忽略的而IE對于塊與塊之間的空格是處理的。也就是說一個div結束后要緊接著一個div寫,中間不要有回車或者空格。不然也許會有問題,比如3px的偏差,而且這個原因很難發現。

          非常不走運的是我又碰到了這樣的問題,多個img標簽連著,然后定義的float: left,希望這些圖片可以連起來。但是結果在firefox里面正常而IE里面顯示的每個img都相隔了3px。我把標簽之間的空格都刪除都沒有作用。

          后來的解決方法是在img外面套li,并且對li定義margin: 0,這樣就解決了IE和firefox的顯示偏差。IE對于一些模型的解釋會產生很多錯誤問題,只有多多嘗試才能發現原因。

          這只是一些簡單的區別,在做布局和CSS設計時候可以綜合考慮,但最為有效與簡單的解決兼容問題還是用TABLE表格,表格在兼容性方面有著不錯的表現.

          另外在模版的JS設計的時候也需要考慮兩者對代碼的兼容,以下是對IE與FIREFOX中JS的一些測試:

          以下以 IE 代替 Internet Explorer,以 MF 代替 Mozilla 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 部分仍與老
                  代碼兼容。

                  ///////////////////////////////////////////////////////////////////////
                  // 以下來自網友 llihua     
                      //事件處理函數
                      function a(evt) { //FireFox
                      evt = evt? evt: window.event; //IE
                      var srcElem = (evt.target)? evt.target: evt.srcElement;
                      //事件處理...
                      }

          在連接事件處理函數的時候,可以用Inline HTML方式,也可以用Event
                      property方式定義。
                    
                          1、使用Inline HTML方式,如:
                          <input type="radio" name="radio" value="1"
                              onclick="javascript:a(event)">
                        
                              注意:
                              (1)javascript不能省;
                              (2)實參要使用event,形參使用什么都可以(如evt、event等);
                        
                          2、使用Event property方式綁定事件處理函數,如:
                              document.form2.radio[0].onclick = a;
                  // 以上來自網友 llihua     
                  ///////////////////////////////////////////////////////////////////////

          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 元素
               (是否還有其它不能取的元素還不知道)。

          17. DOM 數據島的問題
            (1)現有問題
               在IE中, <xml>標簽具有特殊意義, 可以內含XML DOM, 并能實現與HTML組件的數據
               綁定. 在MF中,<xml>則僅僅是一個未知的標記而已.
               另外, 對 IE 來說, <xml>實際意味著這里是一個ActiveX對象, 但它卻掛在HTML本
               身的DOM樹下作為一個節點, 因而會對DOM樹的遍歷造成嚴重影響.
            (2)解決方法
               IE的數據綁定機制是可以用JS來模擬的, 但是太麻煩, 建議不使用數據綁定機制或者
               尋找實現這種模擬的庫來做. 我們只討論如何實現DOM的兼容.
               在MF中無論已知的HTML標記還是其它符合XML規范的標記, 都是用統一的DOM樹來處理
               的, 因此, MF事實上完全可以使用DOM數據島, 但與IE小小的不同在于: 在IE中<xml>
               是個 DOM document, 而在MF只是 DOM node. 這個差別通常不足為患.
               但是有一個小小的細節, 為了兼容HTML相當隨意的語法, MF無法識別簡寫的空標記.
               如: <xml id="xx"><book><title>xxxx</title><content/><index/></book></xml>,
               這其中<content/>和<index/>是簡寫形式的, 會使MF無法識別, 應當寫成:
                   <content></content><index></index>
               不過, 我懷疑如果用XHTML, 可能就沒有這種問題. 但我還沒有試過.
               對于IE中<xml>干擾HTML的DOM結構問題, 我現在的方法是處理完畢后把它從HTML的
               DOM中刪除. 不知道還有沒有更好的解

          以下以 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就直接寫&不要寫&amp;例如var url = 'xx.jsp?objectName=xx&amp;objectEvent=xxx';
          frm.action = url那么很有可能url不會被正常顯示以至于參數沒有正確的傳到服務器
          一般會服務器報錯參數沒有找到
          當然如果是在tpl中例外,因為tpl中符合xml規范,要求&書寫為&amp;
          一般MF無法識別js中的&amp;


          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 元素(是否還有其它不能取的元素還不知道)。

           

          1. 對象問題
          1.1 Form對象
          現有問題:
          現有代碼這獲得form對象通過document.forms("formName"),這樣使用在IE 能接受,MF 不能。
          解決方法:
          改用 作為下標運算。改為document.forms["formName"]
          備注
          上述的改用 作為下標運算中的formName是id而name

          1.2 HTML對象
          現有問題:
          在 IE 中,HTML 對象的 ID 可以作為 document 的下屬對象變量名直接使用。在 MF 中不能。
          document.all("itemName")或者document.all("itemId")
          解決方法:
          使用對象ID作為對象變量名
          document.getElementById("itemId")
          備注
          document.all是IE自定義的方法,所以請大家盡量不使用。
          還有一種方式,在IE和MF都可以使用
          var f = document.forms["formName "];
          var o = f. itemId;

          1.3 DIV對象
          現有問題:
          在 IE 中,DIV對象可以使用ID作為對象變量名直接使用。在 MF 中不能。
          DivId.style.display = "none"
          解決方法:
          document.getElementById("DivId").style.display = "none"
          備注
          獲得對象的方法不管是不是DIV對象,都使用getElementById方法。參見1.2


          1.4 關于frame
          現有問題
          在 IE中 可以用window.testFrame取得該frame,mf中不行
          解決方法
          在frame的使用方面MF和IE的最主要的區別是:
          如果在frame標簽中書寫了以下屬性:

          那么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的內容

          1.5 窗口
          現有問題
          IE中可以通過showModalDialog和showModelessDialog打開模態和非模態窗口,但是MF不支持。
          解決辦法
          直接使用window.open(pageURL,name,parameters)方式打開新窗口。
          如果需要傳遞參數,可以使用frame或者iframe。

          2. 總結
          2.1 在JS中定義各種對象變量名時,盡量使用id,避免使用name。
          在 IE 中,HTML 對象的 ID 可以作為 document 的下屬對象變量名直接使用。在 MF 中不能,所以在平常使用時請盡量使用id,避免只使用name,而不使用id。

          2.2 變量名與某 HTML 對象 id 相同的問題
          現有問題
          在 MF 中,因為對象 id 不作為 HTML 對象的名稱,所以可以使用與 HTML 對象 id 相同的變量名,IE 中不能。
          解決方法
          在聲明變量時,一律加上 var ,以避免歧義,這樣在 IE 中亦可正常運行。
          此外,最好不要取與 HTML 對象 id 相同的變量名,以減少錯誤。


          1. document.all
            Firefox可以兼容document.all, 但會生成一條警告。可以用getElementById("*") 或者 getElementByTagName("*)來代替
            不過對于document.all.length等屬性,則完全不兼容。
          2. parentElement
            這個也不兼容。比方說, obj.parentElement.name 則應改成 obj.parentNode.attributes.getNamedItem("name").nodeValue (不知道如何寫得更簡潔些)
          3. event
            W3C不支持windows.event
            比方說:
              在IE里面
                    <div class="menu" id="menu" onclick="onMenuClick(); ">.....</div>
                function onMenuClick()
                {
                  collapseMenu(event.srcElement);
                }
              工作正常。不過在Firefox中,則改成:

                  <div class="menu" id="menu" onclick="onMenuClick(event); ">
                  function onMenuClick(evt)
                {
                  if(evt == null)
                        evt = window.event; // For IE
                    var srcElement = evt.srcElement? evt.srcElement : evt.target; // IE使用srcElement, 而Firefox使用target
                  collapseMenu(srcElement);
          }


          IE和FIREFOX在解析CSS方面的區別
          對高度的解析
          IE:將根據內容的高度變化,包括未定義高度的圖片內容,即使定義了高度,當內容超過高度時,將使用實際高度

          Firefox:沒有定義高度時,如果內容中包括了圖片內容,MF的高度解析是根據印刷標準,這樣就會造成和實際內容高度不符合的情況;當定義了高度,但是內容超過高度時,內容會超出定義的高度,但是區域使用的樣式不會變化,造成樣式錯位。

          結論:大家在可以確定內容高度的情況下最好定義高度,如果真的沒有辦法定義高度,最好不用使用邊框樣式,否則樣式肯定會出現混亂!

          img對象alt和title的解析
          alt:當照片不存在或者load錯誤時的提示;

          title:照片的tip說明。

          在IE中如果沒有定義title,alt也可以作為img的tip使用,但是在MF中,兩者完全按照標準中的定義使用

          結論:大家在定義img對象時,最后將alt和title對象都寫全,保證在各種瀏覽器中都能正常使用

          其他的細節差別

          當你在寫css的時候,特別是用float: left(或right)排列一竄圖片時,會發現在firefox里面正常而IE里面有問題。無論你用margin:0,還是border: 0來約束,都無濟于事。

          其實這里還有另外一個問題,就是IE對于空格的處理,firefox是忽略的而IE對于塊與塊之間的空格是處理的。也就是說一個div結束后要緊接著一個div寫,中間不要有回車或者空格。不然也許會有問題,比如3px的偏差,而且這個原因很難發現。

          非常不走運的是我又碰到了這樣的問題,多個img標簽連著,然后定義的float: left,希望這些圖片可以連起來。但是結果在firefox里面正常而IE里面顯示的每個img都相隔了3px。我把標簽之間的空格都刪除都沒有作用。

          后來的解決方法是在img外面套li,并且對li定義margin: 0,這樣就解決了IE和firefox的顯示偏差。IE對于一些模型的解釋會產生很多錯誤問題,只有多多嘗試才能發現原因。

          這只是一些簡單的區別,在做布局和CSS設計時候可以綜合考慮,但最為有效與簡單的解決兼容問題還是用TABLE表格,表格在兼容性方面有著不錯的表現.

          另外在模版的JS設計的時候也需要考慮兩者對代碼的兼容,以下是對IE與FIREFOX中JS的一些測試:

          以下以 IE 代替 Internet Explorer,以 MF 代替 Mozilla 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 部分仍與老
                  代碼兼容。

                  ///////////////////////////////////////////////////////////////////////
                  // 以下來自網友 llihua     
                      //事件處理函數
                      function a(evt) { //FireFox
                      evt = evt? evt: window.event; //IE
                      var srcElem = (evt.target)? evt.target: evt.srcElement;
                      //事件處理...
                      }

          在連接事件處理函數的時候,可以用Inline HTML方式,也可以用Event
                      property方式定義。
                    
                          1、使用Inline HTML方式,如:
                          <input type="radio" name="radio" value="1"
                              onclick="javascript:a(event)">
                        
                              注意:
                              (1)javascript不能省;
                              (2)實參要使用event,形參使用什么都可以(如evt、event等);
                        
                          2、使用Event property方式綁定事件處理函數,如:
                              document.form2.radio[0].onclick = a;
                  // 以上來自網友 llihua     
                  ///////////////////////////////////////////////////////////////////////

          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 元素
               (是否還有其它不能取的元素還不知道)。

          17. DOM 數據島的問題
            (1)現有問題
               在IE中, <xml>標簽具有特殊意義, 可以內含XML DOM, 并能實現與HTML組件的數據
               綁定. 在MF中,<xml>則僅僅是一個未知的標記而已.
               另外, 對 IE 來說, <xml>實際意味著這里是一個ActiveX對象, 但它卻掛在HTML本
               身的DOM樹下作為一個節點, 因而會對DOM樹的遍歷造成嚴重影響.
            (2)解決方法
               IE的數據綁定機制是可以用JS來模擬的, 但是太麻煩, 建議不使用數據綁定機制或者
               尋找實現這種模擬的庫來做. 我們只討論如何實現DOM的兼容.
               在MF中無論已知的HTML標記還是其它符合XML規范的標記, 都是用統一的DOM樹來處理
               的, 因此, MF事實上完全可以使用DOM數據島, 但與IE小小的不同在于: 在IE中<xml>
               是個 DOM document, 而在MF只是 DOM node. 這個差別通常不足為患.
               但是有一個小小的細節, 為了兼容HTML相當隨意的語法, MF無法識別簡寫的空標記.
               如: <xml id="xx"><book><title>xxxx</title><content/><index/></book></xml>,
               這其中<content/>和<index/>是簡寫形式的, 會使MF無法識別, 應當寫成:
                   <content></content><index></index>
               不過, 我懷疑如果用XHTML, 可能就沒有這種問題. 但我還沒有試過.
               對于IE中<xml>干擾HTML的DOM結構問題, 我現在的方法是處理完畢后把它從HTML的
               DOM中刪除. 不知道還有沒有更好的解

          以下以 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就直接寫&不要寫&amp;例如var url = 'xx.jsp?objectName=xx&amp;objectEvent=xxx';
          frm.action = url那么很有可能url不會被正常顯示以至于參數沒有正確的傳到服務器
          一般會服務器報錯參數沒有找到
          當然如果是在tpl中例外,因為tpl中符合xml規范,要求&書寫為&amp;
          一般MF無法識別js中的&amp;


          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 元素(是否還有其它不能取的元素還不知道)。

           

          1. 對象問題
          1.1 Form對象
          現有問題:
          現有代碼這獲得form對象通過document.forms("formName"),這樣使用在IE 能接受,MF 不能。
          解決方法:
          改用 作為下標運算。改為document.forms["formName"]
          備注
          上述的改用 作為下標運算中的formName是id而name

          1.2 HTML對象
          現有問題:
          在 IE 中,HTML 對象的 ID 可以作為 document 的下屬對象變量名直接使用。在 MF 中不能。
          document.all("itemName")或者document.all("itemId")
          解決方法:
          使用對象ID作為對象變量名
          document.getElementById("itemId")
          備注
          document.all是IE自定義的方法,所以請大家盡量不使用。
          還有一種方式,在IE和MF都可以使用
          var f = document.forms["formName "];
          var o = f. itemId;

          1.3 DIV對象
          現有問題:
          在 IE 中,DIV對象可以使用ID作為對象變量名直接使用。在 MF 中不能。
          DivId.style.display = "none"
          解決方法:
          document.getElementById("DivId").style.display = "none"
          備注
          獲得對象的方法不管是不是DIV對象,都使用getElementById方法。參見1.2


          1.4 關于frame
          現有問題
          在 IE中 可以用window.testFrame取得該frame,mf中不行
          解決方法
          在frame的使用方面MF和IE的最主要的區別是:
          如果在frame標簽中書寫了以下屬性:

          那么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的內容

          1.5 窗口
          現有問題
          IE中可以通過showModalDialog和showModelessDialog打開模態和非模態窗口,但是MF不支持。
          解決辦法
          直接使用window.open(pageURL,name,parameters)方式打開新窗口。
          如果需要傳遞參數,可以使用frame或者iframe。

          2. 總結
          2.1 在JS中定義各種對象變量名時,盡量使用id,避免使用name。
          在 IE 中,HTML 對象的 ID 可以作為 document 的下屬對象變量名直接使用。在 MF 中不能,所以在平常使用時請盡量使用id,避免只使用name,而不使用id。

          2.2 變量名與某 HTML 對象 id 相同的問題
          現有問題
          在 MF 中,因為對象 id 不作為 HTML 對象的名稱,所以可以使用與 HTML 對象 id 相同的變量名,IE 中不能。
          解決方法
          在聲明變量時,一律加上 var ,以避免歧義,這樣在 IE 中亦可正常運行。
          此外,最好不要取與 HTML 對象 id 相同的變量名,以減少錯誤。


          1. document.all
            Firefox可以兼容document.all, 但會生成一條警告。可以用getElementById("*") 或者 getElementByTagName("*)來代替
            不過對于document.all.length等屬性,則完全不兼容。
          2. parentElement
            這個也不兼容。比方說, obj.parentElement.name 則應改成 obj.parentNode.attributes.getNamedItem("name").nodeValue (不知道如何寫得更簡潔些)
          3. event
            W3C不支持windows.event
            比方說:
              在IE里面
                    <div class="menu" id="menu" onclick="onMenuClick(); ">.....</div>
                function onMenuClick()
                {
                  collapseMenu(event.srcElement);
                }
              工作正常。不過在Firefox中,則改成:

                  <div class="menu" id="menu" onclick="onMenuClick(event); ">
                  function onMenuClick(evt)
                {
                  if(evt == null)
                        evt = window.event; // For IE
                    var srcElement = evt.srcElement? evt.srcElement : evt.target; // IE使用srcElement, 而Firefox使用target
                  collapseMenu(srcElement);
          }


          IE和FIREFOX在解析CSS方面的區別
          對高度的解析
          IE:將根據內容的高度變化,包括未定義高度的圖片內容,即使定義了高度,當內容超過高度時,將使用實際高度

          Firefox:沒有定義高度時,如果內容中包括了圖片內容,MF的高度解析是根據印刷標準,這樣就會造成和實際內容高度不符合的情況;當定義了高度,但是內容超過高度時,內容會超出定義的高度,但是區域使用的樣式不會變化,造成樣式錯位。

          結論:大家在可以確定內容高度的情況下最好定義高度,如果真的沒有辦法定義高度,最好不用使用邊框樣式,否則樣式肯定會出現混亂!

          img對象alt和title的解析
          alt:當照片不存在或者load錯誤時的提示;

          title:照片的tip說明。

          在IE中如果沒有定義title,alt也可以作為img的tip使用,但是在MF中,兩者完全按照標準中的定義使用

          結論:大家在定義img對象時,最后將alt和title對象都寫全,保證在各種瀏覽器中都能正常使用

          其他的細節差別

          當你在寫css的時候,特別是用float: left(或right)排列一竄圖片時,會發現在firefox里面正常而IE里面有問題。無論你用margin:0,還是border: 0來約束,都無濟于事。

          其實這里還有另外一個問題,就是IE對于空格的處理,firefox是忽略的而IE對于塊與塊之間的空格是處理的。也就是說一個div結束后要緊接著一個div寫,中間不要有回車或者空格。不然也許會有問題,比如3px的偏差,而且這個原因很難發現。

          非常不走運的是我又碰到了這樣的問題,多個img標簽連著,然后定義的float: left,希望這些圖片可以連起來。但是結果在firefox里面正常而IE里面顯示的每個img都相隔了3px。我把標簽之間的空格都刪除都沒有作用。

          后來的解決方法是在img外面套li,并且對li定義margin: 0,這樣就解決了IE和firefox的顯示偏差。IE對于一些模型的解釋會產生很多錯誤問題,只有多多嘗試才能發現原因。

          這只是一些簡單的區別,在做布局和CSS設計時候可以綜合考慮,但最為有效與簡單的解決兼容問題還是用TABLE表格,表格在兼容性方面有著不錯的表現.

          另外在模版的JS設計的時候也需要考慮兩者對代碼的兼容,以下是對IE與FIREFOX中JS的一些測試:

          以下以 IE 代替 Internet Explorer,以 MF 代替 Mozilla 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 部分仍與老
                  代碼兼容。

                  ///////////////////////////////////////////////////////////////////////
                  // 以下來自網友 llihua     
                      //事件處理函數
                      function a(evt) { //FireFox
                      evt = evt? evt: window.event; //IE
                      var srcElem = (evt.target)? evt.target: evt.srcElement;
                      //事件處理...
                      }

          在連接事件處理函數的時候,可以用Inline HTML方式,也可以用Event
                      property方式定義。
                    
                          1、使用Inline HTML方式,如:
                          <input type="radio" name="radio" value="1"
                              onclick="javascript:a(event)">
                        
                              注意:
                              (1)javascript不能省;
                              (2)實參要使用event,形參使用什么都可以(如evt、event等);
                        
                          2、使用Event property方式綁定事件處理函數,如:
                              document.form2.radio[0].onclick = a;
                  // 以上來自網友 llihua     
                  ///////////////////////////////////////////////////////////////////////

          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 元素
               (是否還有其它不能取的元素還不知道)。

          17. DOM 數據島的問題
            (1)現有問題
               在IE中, <xml>標簽具有特殊意義, 可以內含XML DOM, 并能實現與HTML組件的數據
               綁定. 在MF中,<xml>則僅僅是一個未知的標記而已.
               另外, 對 IE 來說, <xml>實際意味著這里是一個ActiveX對象, 但它卻掛在HTML本
               身的DOM樹下作為一個節點, 因而會對DOM樹的遍歷造成嚴重影響.
            (2)解決方法
               IE的數據綁定機制是可以用JS來模擬的, 但是太麻煩, 建議不使用數據綁定機制或者
               尋找實現這種模擬的庫來做. 我們只討論如何實現DOM的兼容.
               在MF中無論已知的HTML標記還是其它符合XML規范的標記, 都是用統一的DOM樹來處理
               的, 因此, MF事實上完全可以使用DOM數據島, 但與IE小小的不同在于: 在IE中<xml>
               是個 DOM document, 而在MF只是 DOM node. 這個差別通常不足為患.
               但是有一個小小的細節, 為了兼容HTML相當隨意的語法, MF無法識別簡寫的空標記.
               如: <xml id="xx"><book><title>xxxx</title><content/><index/></book></xml>,
               這其中<content/>和<index/>是簡寫形式的, 會使MF無法識別, 應當寫成:
                   <content></content><index></index>
               不過, 我懷疑如果用XHTML, 可能就沒有這種問題. 但我還沒有試過.
               對于IE中<xml>干擾HTML的DOM結構問題, 我現在的方法是處理完畢后把它從HTML的
               DOM中刪除. 不知道還有沒有更好的解

          以下以 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就直接寫&不要寫&amp;例如var url = 'xx.jsp?objectName=xx&amp;objectEvent=xxx';
          frm.action = url那么很有可能url不會被正常顯示以至于參數沒有正確的傳到服務器
          一般會服務器報錯參數沒有找到
          當然如果是在tpl中例外,因為tpl中符合xml規范,要求&書寫為&amp;
          一般MF無法識別js中的&amp;


          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 元素(是否還有其它不能取的元素還不知道)。

           

          1. 對象問題
          1.1 Form對象
          現有問題:
          現有代碼這獲得form對象通過document.forms("formName"),這樣使用在IE 能接受,MF 不能。
          解決方法:
          改用 作為下標運算。改為document.forms["formName"]
          備注
          上述的改用 作為下標運算中的formName是id而name

          1.2 HTML對象
          現有問題:
          在 IE 中,HTML 對象的 ID 可以作為 document 的下屬對象變量名直接使用。在 MF 中不能。
          document.all("itemName")或者document.all("itemId")
          解決方法:
          使用對象ID作為對象變量名
          document.getElementById("itemId")
          備注
          document.all是IE自定義的方法,所以請大家盡量不使用。
          還有一種方式,在IE和MF都可以使用
          var f = document.forms["formName "];
          var o = f. itemId;

          1.3 DIV對象
          現有問題:
          在 IE 中,DIV對象可以使用ID作為對象變量名直接使用。在 MF 中不能。
          DivId.style.display = "none"
          解決方法:
          document.getElementById("DivId").style.display = "none"
          備注
          獲得對象的方法不管是不是DIV對象,都使用getElementById方法。參見1.2


          1.4 關于frame
          現有問題
          在 IE中 可以用window.testFrame取得該frame,mf中不行
          解決方法
          在frame的使用方面MF和IE的最主要的區別是:
          如果在frame標簽中書寫了以下屬性:

          那么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的內容

          1.5 窗口
          現有問題
          IE中可以通過showModalDialog和showModelessDialog打開模態和非模態窗口,但是MF不支持。
          解決辦法
          直接使用window.open(pageURL,name,parameters)方式打開新窗口。
          如果需要傳遞參數,可以使用frame或者iframe。

          2. 總結
          2.1 在JS中定義各種對象變量名時,盡量使用id,避免使用name。
          在 IE 中,HTML 對象的 ID 可以作為 document 的下屬對象變量名直接使用。在 MF 中不能,所以在平常使用時請盡量使用id,避免只使用name,而不使用id。

          2.2 變量名與某 HTML 對象 id 相同的問題
          現有問題
          在 MF 中,因為對象 id 不作為 HTML 對象的名稱,所以可以使用與 HTML 對象 id 相同的變量名,IE 中不能。
          解決方法
          在聲明變量時,一律加上 var ,以避免歧義,這樣在 IE 中亦可正常運行。
          此外,最好不要取與 HTML 對象 id 相同的變量名,以減少錯誤。


          1. document.all
            Firefox可以兼容document.all, 但會生成一條警告。可以用getElementById("*") 或者 getElementByTagName("*)來代替
            不過對于document.all.length等屬性,則完全不兼容。
          2. parentElement
            這個也不兼容。比方說, obj.parentElement.name 則應改成 obj.parentNode.attributes.getNamedItem("name").nodeValue (不知道如何寫得更簡潔些)
          3. event
            W3C不支持windows.event
            比方說:
              在IE里面
                    <div class="menu" id="menu" onclick="onMenuClick(); ">.....</div>
                function onMenuClick()
                {
                  collapseMenu(event.srcElement);
                }
              工作正常。不過在Firefox中,則改成:

                  <div class="menu" id="menu" onclick="onMenuClick(event); ">
                  function onMenuClick(evt)
                {
                  if(evt == null)
                        evt = window.event; // For IE
                    var srcElement = evt.srcElement? evt.srcElement : evt.target; // IE使用srcElement, 而Firefox使用target
                  collapseMenu(srcElement);
          }


          IE和FIREFOX在解析CSS方面的區別
          對高度的解析
          IE:將根據內容的高度變化,包括未定義高度的圖片內容,即使定義了高度,當內容超過高度時,將使用實際高度

          Firefox:沒有定義高度時,如果內容中包括了圖片內容,MF的高度解析是根據印刷標準,這樣就會造成和實際內容高度不符合的情況;當定義了高度,但是內容超過高度時,內容會超出定義的高度,但是區域使用的樣式不會變化,造成樣式錯位。

          結論:大家在可以確定內容高度的情況下最好定義高度,如果真的沒有辦法定義高度,最好不用使用邊框樣式,否則樣式肯定會出現混亂!

          img對象alt和title的解析
          alt:當照片不存在或者load錯誤時的提示;

          title:照片的tip說明。

          在IE中如果沒有定義title,alt也可以作為img的tip使用,但是在MF中,兩者完全按照標準中的定義使用

          結論:大家在定義img對象時,最后將alt和title對象都寫全,保證在各種瀏覽器中都能正常使用

          其他的細節差別

          當你在寫css的時候,特別是用float: left(或right)排列一竄圖片時,會發現在firefox里面正常而IE里面有問題。無論你用margin:0,還是border: 0來約束,都無濟于事。

          其實這里還有另外一個問題,就是IE對于空格的處理,firefox是忽略的而IE對于塊與塊之間的空格是處理的。也就是說一個div結束后要緊接著一個div寫,中間不要有回車或者空格。不然也許會有問題,比如3px的偏差,而且這個原因很難發現。

          非常不走運的是我又碰到了這樣的問題,多個img標簽連著,然后定義的float: left,希望這些圖片可以連起來。但是結果在firefox里面正常而IE里面顯示的每個img都相隔了3px。我把標簽之間的空格都刪除都沒有作用。

          后來的解決方法是在img外面套li,并且對li定義margin: 0,這樣就解決了IE和firefox的顯示偏差。IE對于一些模型的解釋會產生很多錯誤問題,只有多多嘗試才能發現原因。

          這只是一些簡單的區別,在做布局和CSS設計時候可以綜合考慮,但最為有效與簡單的解決兼容問題還是用TABLE表格,表格在兼容性方面有著不錯的表現.

          另外在模版的JS設計的時候也需要考慮兩者對代碼的兼容,以下是對IE與FIREFOX中JS的一些測試:

          以下以 IE 代替 Internet Explorer,以 MF 代替 Mozilla 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 部分仍與老
                  代碼兼容。

                  ///////////////////////////////////////////////////////////////////////
                  // 以下來自網友 llihua     
                      //事件處理函數
                      function a(evt) { //FireFox
                      evt = evt? evt: window.event; //IE
                      var srcElem = (evt.target)? evt.target: evt.srcElement;
                      //事件處理...
                      }

          在連接事件處理函數的時候,可以用Inline HTML方式,也可以用Event
                      property方式定義。
                    
                          1、使用Inline HTML方式,如:
                          <input type="radio" name="radio" value="1"
                              onclick="javascript:a(event)">
                        
                              注意:
                              (1)javascript不能省;
                              (2)實參要使用event,形參使用什么都可以(如evt、event等);
                        
                          2、使用Event property方式綁定事件處理函數,如:
                              document.form2.radio[0].onclick = a;
                  // 以上來自網友 llihua     
                  ///////////////////////////////////////////////////////////////////////

          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 元素
               (是否還有其它不能取的元素還不知道)。

          17. DOM 數據島的問題
            (1)現有問題
               在IE中, <xml>標簽具有特殊意義, 可以內含XML DOM, 并能實現與HTML組件的數據
               綁定. 在MF中,<xml>則僅僅是一個未知的標記而已.
               另外, 對 IE 來說, <xml>實際意味著這里是一個ActiveX對象, 但它卻掛在HTML本
               身的DOM樹下作為一個節點, 因而會對DOM樹的遍歷造成嚴重影響.
            (2)解決方法
               IE的數據綁定機制是可以用JS來模擬的, 但是太麻煩, 建議不使用數據綁定機制或者
               尋找實現這種模擬的庫來做. 我們只討論如何實現DOM的兼容.
               在MF中無論已知的HTML標記還是其它符合XML規范的標記, 都是用統一的DOM樹來處理
               的, 因此, MF事實上完全可以使用DOM數據島, 但與IE小小的不同在于: 在IE中<xml>
               是個 DOM document, 而在MF只是 DOM node. 這個差別通常不足為患.
               但是有一個小小的細節, 為了兼容HTML相當隨意的語法, MF無法識別簡寫的空標記.
               如: <xml id="xx"><book><title>xxxx</title><content/><index/></book></xml>,
               這其中<content/>和<index/>是簡寫形式的, 會使MF無法識別, 應當寫成:
                   <content></content><index></index>
               不過, 我懷疑如果用XHTML, 可能就沒有這種問題. 但我還沒有試過.
               對于IE中<xml>干擾HTML的DOM結構問題, 我現在的方法是處理完畢后把它從HTML的
               DOM中刪除. 不知道還有沒有更好的解

          以下以 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就直接寫&不要寫&amp;例如var url = 'xx.jsp?objectName=xx&amp;objectEvent=xxx';
          frm.action = url那么很有可能url不會被正常顯示以至于參數沒有正確的傳到服務器
          一般會服務器報錯參數沒有找到
          當然如果是在tpl中例外,因為tpl中符合xml規范,要求&書寫為&amp;
          一般MF無法識別js中的&amp;


          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 元素(是否還有其它不能取的元素還不知道)。

           

          1. 對象問題
          1.1 Form對象
          現有問題:
          現有代碼這獲得form對象通過document.forms("formName"),這樣使用在IE 能接受,MF 不能。
          解決方法:
          改用 作為下標運算。改為document.forms["formName"]
          備注
          上述的改用 作為下標運算中的formName是id而name

          1.2 HTML對象
          現有問題:
          在 IE 中,HTML 對象的 ID 可以作為 document 的下屬對象變量名直接使用。在 MF 中不能。
          document.all("itemName")或者document.all("itemId")
          解決方法:
          使用對象ID作為對象變量名
          document.getElementById("itemId")
          備注
          document.all是IE自定義的方法,所以請大家盡量不使用。
          還有一種方式,在IE和MF都可以使用
          var f = document.forms["formName "];
          var o = f. itemId;

          1.3 DIV對象
          現有問題:
          在 IE 中,DIV對象可以使用ID作為對象變量名直接使用。在 MF 中不能。
          DivId.style.display = "none"
          解決方法:
          document.getElementById("DivId").style.display = "none"
          備注
          獲得對象的方法不管是不是DIV對象,都使用getElementById方法。參見1.2


          1.4 關于frame
          現有問題
          在 IE中 可以用window.testFrame取得該frame,mf中不行
          解決方法
          在frame的使用方面MF和IE的最主要的區別是:
          如果在frame標簽中書寫了以下屬性:

          那么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的內容

          1.5 窗口
          現有問題
          IE中可以通過showModalDialog和showModelessDialog打開模態和非模態窗口,但是MF不支持。
          解決辦法
          直接使用window.open(pageURL,name,parameters)方式打開新窗口。
          如果需要傳遞參數,可以使用frame或者iframe。

          2. 總結
          2.1 在JS中定義各種對象變量名時,盡量使用id,避免使用name。
          在 IE 中,HTML 對象的 ID 可以作為 document 的下屬對象變量名直接使用。在 MF 中不能,所以在平常使用時請盡量使用id,避免只使用name,而不使用id。

          2.2 變量名與某 HTML 對象 id 相同的問題
          現有問題
          在 MF 中,因為對象 id 不作為 HTML 對象的名稱,所以可以使用與 HTML 對象 id 相同的變量名,IE 中不能。
          解決方法
          在聲明變量時,一律加上 var ,以避免歧義,這樣在 IE 中亦可正常運行。
          此外,最好不要取與 HTML 對象 id 相同的變量名,以減少錯誤。


          1. document.all
            Firefox可以兼容document.all, 但會生成一條警告。可以用getElementById("*") 或者 getElementByTagName("*)來代替
            不過對于document.all.length等屬性,則完全不兼容。
          2. parentElement
            這個也不兼容。比方說, obj.parentElement.name 則應改成 obj.parentNode.attributes.getNamedItem("name").nodeValue (不知道如何寫得更簡潔些)
          3. event
            W3C不支持windows.event
            比方說:
              在IE里面
                    <div class="menu" id="menu" onclick="onMenuClick(); ">.....</div>
                function onMenuClick()
                {
                  collapseMenu(event.srcElement);
                }
              工作正常。不過在Firefox中,則改成:

                  <div class="menu" id="menu" onclick="onMenuClick(event); ">
                  function onMenuClick(evt)
                {
                  if(evt == null)
                        evt = window.event; // For IE
                    var srcElement = evt.srcElement? evt.srcElement : evt.target; // IE使用srcElement, 而Firefox使用target
                  collapseMenu(srcElement);
          }


          IE和FIREFOX在解析CSS方面的區別
          對高度的解析
          IE:將根據內容的高度變化,包括未定義高度的圖片內容,即使定義了高度,當內容超過高度時,將使用實際高度

          Firefox:沒有定義高度時,如果內容中包括了圖片內容,MF的高度解析是根據印刷標準,這樣就會造成和實際內容高度不符合的情況;當定義了高度,但是內容超過高度時,內容會超出定義的高度,但是區域使用的樣式不會變化,造成樣式錯位。

          結論:大家在可以確定內容高度的情況下最好定義高度,如果真的沒有辦法定義高度,最好不用使用邊框樣式,否則樣式肯定會出現混亂!

          img對象alt和title的解析
          alt:當照片不存在或者load錯誤時的提示;

          title:照片的tip說明。

          在IE中如果沒有定義title,alt也可以作為img的tip使用,但是在MF中,兩者完全按照標準中的定義使用

          結論:大家在定義img對象時,最后將alt和title對象都寫全,保證在各種瀏覽器中都能正常使用

          其他的細節差別

          當你在寫css的時候,特別是用float: left(或right)排列一竄圖片時,會發現在firefox里面正常而IE里面有問題。無論你用margin:0,還是border: 0來約束,都無濟于事。

          其實這里還有另外一個問題,就是IE對于空格的處理,firefox是忽略的而IE對于塊與塊之間的空格是處理的。也就是說一個div結束后要緊接著一個div寫,中間不要有回車或者空格。不然也許會有問題,比如3px的偏差,而且這個原因很難發現。

          非常不走運的是我又碰到了這樣的問題,多個img標簽連著,然后定義的float: left,希望這些圖片可以連起來。但是結果在firefox里面正常而IE里面顯示的每個img都相隔了3px。我把標簽之間的空格都刪除都沒有作用。

          后來的解決方法是在img外面套li,并且對li定義margin: 0,這樣就解決了IE和firefox的顯示偏差。IE對于一些模型的解釋會產生很多錯誤問題,只有多多嘗試才能發現原因。

          這只是一些簡單的區別,在做布局和CSS設計時候可以綜合考慮,但最為有效與簡單的解決兼容問題還是用TABLE表格,表格在兼容性方面有著不錯的表現.

          另外在模版的JS設計的時候也需要考慮兩者對代碼的兼容,以下是對IE與FIREFOX中JS的一些測試:

          以下以 IE 代替 Internet Explorer,以 MF 代替 Mozilla 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 部分仍與老
                  代碼兼容。

                  ///////////////////////////////////////////////////////////////////////
                  // 以下來自網友 llihua     
                      //事件處理函數
                      function a(evt) { //FireFox
                      evt = evt? evt: window.event; //IE
                      var srcElem = (evt.target)? evt.target: evt.srcElement;
                      //事件處理...
                      }

          在連接事件處理函數的時候,可以用Inline HTML方式,也可以用Event
                      property方式定義。
                    
                          1、使用Inline HTML方式,如:
                          <input type="radio" name="radio" value="1"
                              onclick="javascript:a(event)">
                        
                              注意:
                              (1)javascript不能省;
                              (2)實參要使用event,形參使用什么都可以(如evt、event等);
                        
                          2、使用Event property方式綁定事件處理函數,如:
                              document.form2.radio[0].onclick = a;
                  // 以上來自網友 llihua     
                  ///////////////////////////////////////////////////////////////////////

          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 元素
               (是否還有其它不能取的元素還不知道)。

          17. DOM 數據島的問題
            (1)現有問題
               在IE中, <xml>標簽具有特殊意義, 可以內含XML DOM, 并能實現與HTML組件的數據
               綁定. 在MF中,<xml>則僅僅是一個未知的標記而已.
               另外, 對 IE 來說, <xml>實際意味著這里是一個ActiveX對象, 但它卻掛在HTML本
               身的DOM樹下作為一個節點, 因而會對DOM樹的遍歷造成嚴重影響.
            (2)解決方法
               IE的數據綁定機制是可以用JS來模擬的, 但是太麻煩, 建議不使用數據綁定機制或者
               尋找實現這種模擬的庫來做. 我們只討論如何實現DOM的兼容.
               在MF中無論已知的HTML標記還是其它符合XML規范的標記, 都是用統一的DOM樹來處理
               的, 因此, MF事實上完全可以使用DOM數據島, 但與IE小小的不同在于: 在IE中<xml>
               是個 DOM document, 而在MF只是 DOM node. 這個差別通常不足為患.
               但是有一個小小的細節, 為了兼容HTML相當隨意的語法, MF無法識別簡寫的空標記.
               如: <xml id="xx"><book><title>xxxx</title><content/><index/></book></xml>,
               這其中<content/>和<index/>是簡寫形式的, 會使MF無法識別, 應當寫成:
                   <content></content><index></index>
               不過, 我懷疑如果用XHTML, 可能就沒有這種問題. 但我還沒有試過.
               對于IE中<xml>干擾HTML的DOM結構問題, 我現在的方法是處理完畢后把它從HTML的
               DOM中刪除. 不知道還有沒有更好的解

          posted on 2007-09-06 09:26 萬博 閱讀(1664) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2007年9月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          導航

          統計

          留言簿(1)

          隨筆檔案(13)

          搜索

          積分與排名

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 莱西市| 旬邑县| 如皋市| 怀安县| 宝丰县| 无锡市| 舟山市| 宁明县| 原平市| 太湖县| 湖北省| 滨州市| 遂宁市| 铜鼓县| 太原市| 开远市| 肇州县| 康保县| 韶山市| 晋中市| 神农架林区| 陆河县| 苏尼特右旗| 射洪县| 吉木萨尔县| 呼伦贝尔市| 白玉县| 静海县| 辽阳县| 辽阳市| 齐齐哈尔市| 永寿县| 武定县| 库尔勒市| 沙河市| 微博| 志丹县| 南木林县| 江陵县| 磐安县| 库车县|