IE6的base標籤導致頁面結構大混亂

2021-09-05 23:44:41 字數 1322 閱讀 8233

這是乙個非常隱秘也是非常強大的bug,我真不知微軟的ie開發人員是怎麼搞出來的。此bug的觸發條件是,當頁面存在乙個自閉合的base節點,它就會把其「下面」所有的元素都拷到它內部。這裡的下面非childnodes,children所能描述,它連body節點都能編入其中。

ie 複製節點 bug

執行**

執行**下,我們發現完全亂套了,原本父節點為head的meta元素(動態生成)與父節點為html的body元素(原來就存在),它們的父節點都變成base節點。下面是用firebug lite截到的圖:

jquery在使用globaleval方法動態解析指令碼時,就遇到這個問題,它取巧地把動態生成的script節點插入到base節點之前。

globaleval: function( data ) else

head.insertbefore( script, head.firstchild );

head.removechild( script );}},

但還是不妥當,因為始終留著個陷阱給人踩。想了想,base標籤無礙乎只有兩個屬性,用於對頁面上所有的url進行統一設定,如img.src,form.action,a.href等等。通常只有乙個就夠了,如果它只存在於body中,不管,如果存在於head就會為害人間了,我們需要將它強制新增乙個閉合標籤。即,將它由

轉換為

雖然ie6解析base的半閉合形式出錯,但它不會不濟到解析乙個全新的節點出錯吧,它理應會把新節點轉換為它不會出錯的形式,換言之,是第二種形式。建立新節點的方法有許多種,但我們很需要原節點的屬性,恰好ie的clonenode什麼也能複製。之後就是插入節點的問題了,我們使用它的乙個私有實現replacenode,不用知曉其父節點,它也將用於區分ie與非ie。

下面是我的fixbug程式:

//by 司徒正美

//此bug在ie7中修復,詳見:

}}ie 複製節點 bug

執行**

搞定!不過,我的globaleval函式用不著這個,直接用execscript一了百了,連script標籤也不用插入。

IE6非同步請求快取導致的亂碼問題

近日在公升級kissy的過程中,在ie6下遇到乙個很奇怪的問題 頁面編碼是gbk,ji和css檔案是utf 8的,當使用者要使用某些功能時頁面會彈出迷你登入框提示使用者登入,會傳送非同步請求,獲得登入框的模板,編碼是和js一致的 utf 8 第一次是ok的,但當重新整理頁面第二次彈出登入框時,問題來...

IE6下select標籤覆蓋div的完美解決辦法

雖然很多人很討厭ie6,但是ie6.0還是有很多使用者,特別是前端設計人員,很多bug讓人很糾結,關於ie6下select標籤覆蓋div的問題,現在已經有完美解決辦法 ie6下select標籤覆蓋div的解決辦法 可能由於下拉列表控制項的彈出式下拉列表的原因導致z軸高度失控。但是ie6有乙個神奇的邏...

IE6下頁面顯示空白的問題

今天又碰到了乙個頁面在ie6下載入完後一片空白的問題,而且頁面也沒有指令碼錯誤。搜尋了半天發現是頁面被ie快取掉了,然後在載入頁面是ie使用預設的utf 8作為頁面contenttype,而不是我們的gbk。但話又說回來,即使編碼方式不對也應該顯示亂碼啊?不應該什麼不顯示。這實際是css的問題,因為...