在IE中使用DOM方式來動態建立頁面元素的時候,我發現了一些問題。記錄於此,如果您有好的意見歡迎提供,如果您也遇到此問題,希望能有助你解決。
對於動態HTML編程,IE實現了兩套模型:一套是以操作innerHTML為主的狹義的DHTML,一套是以集合方式操作(appendChild)頁面元素對象的DOM(Document Object Model)。DHTML方式(我本文說的DHTML都預設指的對於innerHTML進行操作的編程方式,不是廣義的DHTML。)直接操作html代碼片斷,主要靠Web程式員使用字串拼接來產生頁面元素,這是一種高效的動態網頁面操作方式,不過似乎少些編程邏輯的味道,代碼中往往散布著大量不完整的html代碼片斷。而DOM方式進行動態網頁面編程,在邏輯上是一種對集合和元素對象的操作,編程邏輯比較清晰,不過效率上有一些差別。具體使用什麼方式來實現動態Web頁面,大多數情況下是個人的喜好問題,除非在效率上必須錙銖必較。
使用DOM,最常用的方法就是document.createElement(sTag),sTag是一個合法的html標籤名字(tagName)。我們建立好一個html元素對象後,對它的屬性進行賦值,然後insertBefore或appendChild到頁面的DOM對象樹中。這裡msdn提醒了幾個注意事項:
1、不能通過編程方式動態建立frame和iframe元素(IE 5.0及以下);
2、input元素被建立後預設的類型是input type='text';
3、需要使用其他類型的input元素,需要在把input對象放入DOM對象樹之前給input.type賦予你希望的類型,否則在input insert或append進入DOM對象樹後不能再修改;
4、button元素被建立後預設的類型是普通按鈕,要使用其它類型按鈕,需要遵循和問題3相同的注意事項;
5、不能為通過向元素對象賦值得方式,為元素對象添加NAME屬性(這個在"細說HTML元素的ID和NAME屬性詳解"一文裡也是提過的)。
6、sTag其實不只限於html標籤名,任何合法的html元素語句都可以。
下面說一下我遇到的問題,當我在使用DOM方式進行動態網頁面建立的時候,發現不能使用普通的DOM方式為input type='checkbox'和input type='radio'賦初值。即下面的語句:
var input = document.createElement('INPUT');
input.type = 'checkbox';
input.checked = true;
document.body.appendChild(input);
input = document.createElement('INPUT');
input.type = 'radio';
input.checked = true;
document.body.appendChild(input);
不能得到我期望的效果: ,而只能得到: 。
而要得到我期望的效果,需要混合DHTML和DOM兩種方式就是說我必須在sTag裡就構建好的屬性,使用如下代碼:
var input = document.createElement('<INPUT checked>');
input.type = 'checkbox';
document.body.appendChild(input);
input = document.createElement('<INPUT checked>');
input.type = 'radio';
document.body.appendChild(input);
才能得到被賦予初值得INPUT元素: 。