在寫指令碼的過程,有以下幾個大的 BUG ,害我找答案找了 N 久。現把它寫出來,希望大家少走點彎路。
註: IE 6.0 以下版本會出現, 7.0 沒測試過
一、文本轉換成數字,parseInt 在 IE 中有一個嚴重的 BUG
alert(parseInt("8")) → 執行結果為 0
解決方案:改成 parseFloat("8").toFixed(0) → 保留小數點後 0 位元,即整數
二、document.getElementById 的方法執行有誤
document.all 在其它瀏覽器中不支援,所以我用的最多的是 document.getElementById。但是我發現,當控制項的 ID 與名稱相同的時候,document.getElementById 就出現錯誤了。例如:
<input id="Txt_Name01" name="Txt_Name">
<input id="Txt_Name" name="Txt_Name">
alert(document.getElementById("Txt_Name").id) 執行結果是 "Txt_Name01"
以此推斷:document.getElementById 在 IE 中,先以 name 由上而下進行尋找,沒有找到控制項的時候才以 id 進行尋找。
解決方案,用另一方法代替。
document.getObjectById = function(id)
{
if(document.all)
{
var obj = document.getElementById(id);
if(obj == null){return null;}
if(obj.id == id){return obj;}
obj = document.getElementsByName(id);
for(var i=0;i< obj.length;i++)
{
if(obj[i].id == id){return obj[i];}
}
return null;
}
else{return document.getElementById(id);}
}
三、 通過 select 節點的 innerHTML 設定下拉節點無效
當兩個 select 下拉框需要進行複製時,一個最快捷的方式就是用 innerHTML ,但 IE 的 BUG 卻讓我無話可說。例如:把 DDL_Dept 的下拉節點複製到 DDL_Dept02
<select id="DDL_Dept">
<option>01</option>
<option>02</option>
</select>
<select id="DDL_Dept02" style="width:20px">
<option>03</option>
</select>
function CloneNode()
{
var d1=document.getElementById("DDL_Dept");
var d2=document.getElementById("DDL_Dept02");
//d2.innerHTML = d1.innerHTML; 此句應該是最快的,但無效,只好變通一下了
d2.innerHTML =""; //這句卻是可以的,真是無語
var re = /(<//SELECT>)/gi;
var t = d2.outerHTML.replace( re ,""); //先去掉</SELECT>
d2.outerHTML = ot + d1.innerHTML+"</SELECT>";//再加上組合好的內容
}
以上代碼只在 IE 核心的瀏覽器出現,FireFox 沒有上述問題