JavaScript--動態添加元素


在網頁中,使用JavaScript動態創建元素的方式有三種:

1.document.write()

2.Element.innerHTML

3.document.createElement()

在上述三種方法中,最常用最常用的是第三種方法,本文依托小例子,對三種方法加以總結。

案例:點擊按鈕 生成列表,鼠標放上高亮顯示的效果

效果圖:

頁面內容:

<input type="button" value="按鈕" id="btn">
<div id="box"></div>

一、document.createElement()

 

1.利用document.createElement()創建一個節點

2.設置創建節點的屬性

3.把創建的節點利用Element.appendChild(子element)方法添加至父節點

下述demo中需要細細體會的細節:

①鼠標移出和鼠標移入事件為什么要那樣寫,放在循環外面

②innerText兼容性處理問題

代碼如下:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>點擊按鈕 動態創建列表,鼠標放上高亮顯示</title>
 6     </head>
 7     <body>
 8         <input type="button" value="按鈕" id="btn">
 9         <div id="box"></div>
10 
11         <!-- 插入JS代碼 -->
12         <script>
13             var datas = ['西施', '貂蟬', '鳳姐', '芙蓉姐姐'];//數據源
14             //獲取按鈕節點
15             var btn=document.getElementById('btn');
16             //給按鈕節點注冊事件
17             btn.onclick = function() {
18                 // 動態創建ul,內存中創建對象
19                 var ul = document.createElement('ul');
20                 // 把ul 放到頁面上(即給div添加ul)
21                 var box=document.getElementById('box');
22                 box.appendChild(ul);
23                 //遍歷數據集,常見li標簽
24                 for (var i = 0; i < datas.length; i++) {
25                     var data = datas[i];
26                     // 在內存中動態創建li
27                     var li = document.createElement('li');
28                     // 把li添加到DOM樹,並且會重新繪制
29                     ul.appendChild(li);
30                     // 設置li中顯示的內容
31                     // li.innerText = data;
32                     //注意:不按照上面方式寫,因為innerText存在瀏覽器兼容性問題,對於
33                     //不支持innerText的瀏覽器,返回值undefined,支持innerText的瀏覽器,返回string
34                     //所以定義函數setInnerText,用以處理瀏覽器兼容性問題
35                     setInnerText(li, data);
36 
37                     // 給li注冊事件
38                     //注意:此處直接寫li.onmouseover=function(){}大有深意
39                     //因為function在一個循環中,每循環一次,創建一個function,在內存中存儲一次
40                     //再循環一次,在內存中再創建一個function
41                     //循環多少次,內存中存儲多少個function,消耗內存
42                     //故一般將這種函數放在外面定義.
43                     li.onmouseover = liMouseOver;
44                     li.onmouseout = liMouseOut;
45                 }
46             }
47             
48             // 定義函數,設置標簽之間的內容,主要為處理瀏覽器兼容性問題
49             function setInnerText(element,content){
50                 if(typeof(element.innerText)==='string'){
51                     element.innerText=content;
52                 }else{
53                     element.textContent=content;
54                 }//部分瀏覽器支持元素的innerText,部分僅僅使用textContent
55             }
56             
57             // 當鼠標經過li的時候執行
58             function liMouseOver() {
59                 // 鼠標經過高亮顯示
60                 this.style.backgroundColor = 'red';
61             }
62 
63             function liMouseOut() {
64                 // 鼠標離開取消高亮顯示
65                 this.style.backgroundColor = '';
66             }
67         </script>
68     </body>
69 </html>

二、Element.innerHTML

innerHTML方法由於會對字符串進行解析,需要避免在循環內多次使用。

可以借助字符串或數組的方式進行替換,再設置給innerHTML

優化后與document.createElement性能相近

代碼如下:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>Document</title>
 6     </head>
 7     <body>
 8         <input type="button" value="按鈕" id="btn">
 9         <div id="box"></div>
10         <script>
11             // 點擊按鈕 生成列表,鼠標放上高亮顯示的效果
12 
13             // 模擬數據
14             // var datas = ['西施', '貂蟬', '鳳姐', '芙蓉姐姐'];
15             // var btn = document.getElementById('btn');
16             // btn.onclick = function () {
17             //   var box = document.getElementById('box');
18             //   box.innerHTML = '<ul>';  // 重新繪制
19 
20             //   // 遍歷數據
21             //   for (var i = 0; i < datas.length; i++) {
22             //     var data = datas[i];
23             //     box.innerHTML += '<li>' + data + '</li>';   // 重新繪制
24             //   }
25 
26             //   // box.innerHTML = box.innerHTML + '</ul>'
27             //   box.innerHTML += '</ul>';  // 重新繪制
28             // }
29             // 
30             // 
31             // 優化1
32             // var datas = ['西施', '貂蟬', '鳳姐', '芙蓉姐姐'];
33             // var btn = document.getElementById('btn');
34             // btn.onclick = function () {
35             //   var box = document.getElementById('box');
36             //   var html = '<ul>';    // 重新開辟內存 需要耗費時間
37 
38             //   // 遍歷數據
39             //   for (var i = 0; i < datas.length; i++) {
40             //     var data = datas[i];
41             //     html += '<li>' + data + '</li>';    // 因為字符串不可變 重新開辟內存 需要耗費時間
42             //   }
43             //   html += '</ul>';   // 因為字符串不可變 重新開辟內存 需要耗費時間
44 
45             //   box.innerHTML = html;   // 重新繪制
46             // }
47 
48 
49             // 優化2
50             var datas = ['西施', '貂蟬', '鳳姐', '芙蓉姐姐'];
51             var btn = document.getElementById('btn');
52             btn.onclick = function() {
53                 var box = document.getElementById('box');
54 
55                 // 使用數組替代字符串拼接
56                 var array = [];
57                 array.push('<ul>');
58 
59                 // 遍歷數據
60                 for (var i = 0; i < datas.length; i++) {
61                     var data = datas[i];
62                     array.push('<li>' + data + '</li>');
63                 }
64                 array.push('</ul>');
65 
66                 box.innerHTML = array.join('');
67                 // 當li 生成到頁面之后,再從頁面上查找li 注冊事件
68 
69             }
70         </script>
71     </body>
72 </html>

使用上述方法,需要對該方法的使用不斷優化,比較麻煩,而且在高亮顯示時候,需要在所有元素繪制到DOM樹上后,重新開始注冊事件,所以上述方法不推薦使用

三、document.write()

 當點擊按鈕的時候使用document.write()輸出內容,會把之前的整個頁面覆蓋掉,更加不推薦使用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM