星期一, 9月 15, 2008

難怪IE被人嫌!太不合群了...

還沒使用Firefox等其他瀏覽器前,不覺得IE有什麼不好,很納悶為什麼總是聽到些批評... 後來開始用FF,覺得IE的彈性是少了點,但也不至於有那麼糟吧... 直到最近在玩一些網站程式,才給IE氣得...

因為習慣FF了,所以網站更新後都是用FF去看效果,測試完後繼續改程式。結果到了N版後,才發現IE上跑不出動態表格?抓蟲抓了半天,原來是IE的<table>,<td>,<tr>...等的innerHTML屬性是唯讀,無法用程式去動態修改!挖咧... 這什麼怪bug...


好吧,只好改用網路上建議的DOM元件控制方式來達到我要的目的。花了點時間搞動了createElement, appendChild等相關指令,在FF上也呈現出我要的效果,結果... IE又給他出包!又花了一些時間google,才知道這不合群的IE連DOM的指令都有奇怪的限制

IE 並不是不支持setAttribute這個函數,而是不支持用setAttribute設置某些屬性,例如對像屬性、集合屬性、事件屬性,也就是說用 setAttribute設置className ,style和onclick這些屬性在IE中是行不通的。為達到兼容各種瀏覽器的效果,可以用點符號法來設置Element的對象屬性、集合屬性和事件 屬性。 document.getElementById("foo").className = "fruit";
document.getElementById("foo").style.cssText = "color: #00f;";
document.getElementById("foo").style.color = "#00f";
document.getElementById("foo").onclick= function () { alert("This is a test!"); }

只好... 只好再改... (沒辦法,誰叫他市佔率這麼高)

結果,style等外觀設定還好,用到onclick屬性時還是出問題,而且這次連FF都不行了。我的程式是利用loop的方式建立表格內的多行,每一行有其onclick的動作,所以是onclick指定的程式(如:table_row.onclick = function(){clickfun(i);};)裡頭會有個變數參數"i",而這麼變數會隨著迴圈而遞增,等這段javascript程式碼跑完後,它會把每一列的onclick程式所指定的clickfun(i)參數都變成最後一個值?這我不太能理解,不是每一次都指定不一樣的參數i嗎?為什麼最後通通都給同一個數值?

Anyway,這問題的最後,給我想起了Javascript裡有個特殊的語法叫做closure,每次呼叫程式都會保留其中的局部變數(其實我還搞不太懂),就給他硬著頭皮試試看... 終於,成功了...
這當中雖給IE整得很累,但也讓我多學了不少東西... IE啊!要小心喔... 人家google也出新瀏覽器Chrome了,你再這麼老大哥心態,當心眾叛親離啊...

4 意見:

李馬路 提到...

啊...好複雜的分析...

對我來說好像都沒啥差別...

看不出來不同瀏覽器的差異,

只有用得習慣不習慣囉...

以前有短時間很愛用kkman,

但後來一段時間沒用再去用又不習慣了@@~

Andy 提到...

7 Fresh and Simple Ways to Test Cross-Browser Compatibility
http://freelancefolder.com/7-fresh-and-simple-ways-to-test-cross-browser-compatibility/

Enjoy

Andy

indiana 提到...

板主回覆:
呵呵... Maru妳真可愛哩,這種硬梆梆的技術文妳也認真留言...
不過,「習慣」真的是件可怕的事情,大家用慣IE,也不太會改了。
若能偶爾「勇敢」一下,嘗試點新東西,有時會有截然不同的感受呢~
像我,就因為這樣轉向Firefox的懷抱了...

indiana 提到...

板主回覆:
Thank you!