• JavaScript--动态添加元素


    在网页中,使用JavaScript动态创建元素的方式有三种:

    1.document.write()

    2.Element.innerHTML

    3.document.createElement()

    在上述三种方法中,最常用最常用的是第三种方法,本文依托小例子,对三种方法加以总结。

    案例:点击按钮 生成列表,鼠标放上高亮显示的效果

    效果图:

    页面内容:

    <input type="button" value="按钮">
    <div></div>

    一、document.createElement()

    1.利用document.createElement()创建一个节点

    2.设置创建节点的属性

    3.把创建的节点利用父Element.appendChild(子element)方法添加至父节点

    下述demo中需要细细体会的细节:

    ①鼠标移出和鼠标移入事件为什么要那样写,放在循环外面

    ②innerText兼容性处理问题

    代码如下:

    
     1 &lt;!DOCTYPE html&gt;
     2 &lt;html lang="en"&gt;
     3     &lt;head&gt;
     4         &lt;meta charset="UTF-8"&gt;
     5         &lt;title&gt;点击按钮 动态创建列表,鼠标放上高亮显示&lt;/title&gt;
     6     &lt;/head&gt;
     7     &lt;body&gt;
     8         &lt;input type="button" value="按钮"&gt;
     9         &lt;div&gt;&lt;/div&gt;
    10 
    11         &lt;!-- 插入JS代码 --&gt;
    12         &lt;script&gt;
    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 &lt; 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         &lt;/script&gt;
    68     &lt;/body&gt;
    69 &lt;/html&gt;
    

    二、Element.innerHTML

    innerHTML方法由于会对字符串进行解析,需要避免在循环内多次使用。

    可以借助字符串或数组的方式进行替换,再设置给innerHTML

    优化后与document.createElement性能相近

    代码如下:

    
     1 &lt;!DOCTYPE html&gt;
     2 &lt;html lang="en"&gt;
     3     &lt;head&gt;
     4         &lt;meta charset="UTF-8"&gt;
     5         &lt;title&gt;Document&lt;/title&gt;
     6     &lt;/head&gt;
     7     &lt;body&gt;
     8         &lt;input type="button" value="按钮"&gt;
     9         &lt;div&gt;&lt;/div&gt;
    10         &lt;script&gt;
    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 = '&lt;ul&gt;';  // 重新绘制
    19 
    20             //   // 遍历数据
    21             //   for (var i = 0; i &lt; datas.length; i++) {
    22             //     var data = datas[i];
    23             //     box.innerHTML += '&lt;li&gt;' + data + '&lt;/li&gt;';   // 重新绘制
    24             //   }
    25 
    26             //   // box.innerHTML = box.innerHTML + '&lt;/ul&gt;'
    27             //   box.innerHTML += '&lt;/ul&gt;';  // 重新绘制
    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 = '&lt;ul&gt;';    // 重新开辟内存 需要耗费时间
    37 
    38             //   // 遍历数据
    39             //   for (var i = 0; i &lt; datas.length; i++) {
    40             //     var data = datas[i];
    41             //     html += '&lt;li&gt;' + data + '&lt;/li&gt;';    // 因为字符串不可变 重新开辟内存 需要耗费时间
    42             //   }
    43             //   html += '&lt;/ul&gt;';   // 因为字符串不可变 重新开辟内存 需要耗费时间
    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('&lt;ul&gt;');
    58 
    59                 // 遍历数据
    60                 for (var i = 0; i &lt; datas.length; i++) {
    61                     var data = datas[i];
    62                     array.push('&lt;li&gt;' + data + '&lt;/li&gt;');
    63                 }
    64                 array.push('&lt;/ul&gt;');
    65 
    66                 box.innerHTML = array.join('');
    67                 // 当li 生成到页面之后,再从页面上查找li 注册事件
    68 
    69             }
    70         &lt;/script&gt;
    71     &lt;/body&gt;
    72 &lt;/html&gt;
    

    使用上述方法,需要对该方法的使用不断优化,比较麻烦,而且在高亮显示时候,需要在所有元素绘制到DOM树上后,重新开始注册事件,所以上述方法不推荐使用

    三、document.write()

     当点击按钮的时候使用document.write()输出内容,会把之前的整个页面覆盖掉,更加不推荐使用。

    原文地址:https://www.cnblogs.com/WangYujie1994/archive/2019/01/09/10242687.html

  • 相关阅读:
    需求获取过程中的逆向沟通
    程序员==生 涯 篇
    算法设计
    灯的启示:微软对唐骏的面试题
    使用Gzip压缩提升WEB服务器性能
    简历误区
    招聘编辑的七道面试题
    web2.0及其相关技术
    经典面试题助你成功就业
    逗号网站推广营销策略
  • 原文地址:https://www.cnblogs.com/lalalagq/p/10245222.html
Copyright © 2020-2023  润新知