title: 07-DOM操作练习:innerHTML的方式创建元素
publish: true
动态创建DOM元素的三种方式
document.write();
不常用,因为容易覆盖原来的页面。
innerHTML = ();
用的比较多。绑定属性和内容比较方便。(节点套节点)
document.createElement();
用得也比较多,指定数量的时候一般用它。
1、方式一:
这种方式的好处是:比较随意,想创建就创建,可以直接在write
里写属性都行。但是会把原来的标签给覆盖掉。所以不建议。
举例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul> smyhvae </ul>
<script> document.write("<li class='hehe'>我是document.write创建的</li>"); </script> </body> </html>
|
效果如下:
方式二:innerHTML
举例如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul> smyhvae </ul>
<script> var ul = document.getElementsByTagName("ul")[0];
ul.innerHTML += "<li id='li1'>我是innerHTML创建的</li>" </script> </body> </html>
|
注意,上方代码中,是用是用符号+=
,不是=
,前者是在原来的基础之上增加,后者是替换。
效果如下:
3、方式三:利用DOM的api创建
利用DOM的api创建节点,有很多种:
比如:
createElement()
appendChild()
removeChild()
insertBefore()
replaceChild()
这个我们在上一篇文章的DOM节点的操作
这一段中已经讲到了。
innerHTML举例:在线用户的获取
现在要做下面这样一个页面:
上图的意思是,每次刷新页面,都从服务器获取最新的在线人数的名单(我们先用本地的数组来模拟服务器上的数据)。
它的结构是:div > ul > li。每一个li就是一个头像。
如果在本地直接添加几个头像的话,代码是:
//往ul中添加li元素以及li元素中的内容 ul.innerHTML += '<li>'+ '<a href="#" target="_blank"><img src="images/noavatar_small.gif" width="48" height="48" alt="生命壹号"></a>'+ '<p><a href="#" title="生命壹号" target="_blank">生命壹号</a></p>'+ '</li>'; ul.innerHTML += '<li>'+ '<a href="#" target="_blank"><img src="images/noavatar_small.gif" width="48" height="48" alt="生命壹号"></a>'+ '<p><a href="#" title="生命壹号" target="_blank">生命壹号</a></p>'+ '</li>'; ul.innerHTML += '<li>'+ '<a href="#" target="_blank"><img src="images/noavatar_small.gif" width="48" height="48" alt="生命壹号"></a>'+ '<p><a href="#" title="生命壹号" target="_blank">生命壹号</a></p>'+ '</li>';
|
上方代码有两点比较重要:
但是,当我们从服务器获取在线用户的时候,头像和用户的昵称是动态变化的,所以每个字符串要用变量进行表示:
ul.innerHTML += '<li>'+ '<a href="#" target="blank"><img src="'+users[i].icon+'" width="48" height="48" alt="'+users[i].name+'"></a>'+ '<p><a href="#" title="'+users[i].name+'" target="_blank">'+users[i].name+'</a></p>'+ '</li>';
|
这里我们暂时用本地的数组来代表服务器的数据,最终的完整版代码如下:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> * { word-wrap: break-word; }
.wp { width: 730px; margin: 0px auto; }
.mtn { margin-top: 5px !important; }
#ct .frame { margin: 0; border: none; }
.xfs_2 .frame-title, .xfs_2 .frametitle, .xfs_2 .tab-title { background-color: #A90000; background-position: 0 -99px; }
.xfs .frame-title, .xfs .frametitle, .xfs .tab-title, .xfs .frame-title a, .xfs .frametitle a, .xfs .tab-title a { color: #FFF !important; }
.xfs .frame-title, .xfs .frametitle, .xfs .tab-title { border: none; background: transparent url(images/mu.png) repeat-x 0 95; }
.title { padding: 0 10px; height: 32px; font-size: 14px; font-weight: 700; line-height: 32px; overflow: hidden; }
.block { margin: 10px 10px 0; }
ul, menu, dir { display: block; list-style: none; -webkit-margin-before: 1em; -webkit-margin-after: 1em; -webkit-margin-start: 0px; -webkit-margin-end: 0px; -webkit-padding-start: 25px; }
.mls li { padding: 0 0 5px; width: 66px; height: 85px; }
.ml li { float: left; text-align: center; overflow: hidden; }
a { color: #333; text-decoration: none; font: 12px/1.5 Tahoma, 'Microsoft Yahei', 'Simsun'; }
.mls p { margin-top: 5px; }
.ml p, .ml span { display: block; width: 100%; height: 20px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; }
.mls img { width: 48px; height: 48px; }
.ml img { display: block; margin: 0 auto; }
a img { border: none; } </style> </head> <body>
<div class="wp mtn"> <div id="diy3" class="area"> <div id="frameipq7f2" class="xfs xfs_2 frame move-span cl frame-1"> <div class="title frame-title"><span class="titletext">当前在线用户</span></div> <div id="frameipq7f2_left" class="column frame-1-c"> <div id="frameipq7f2_left_temp" class="move-span temp"></div> <div id="portal_block_695" class="block move-span"> <div id="portal_block_695_content" class="dxb_bc"> <div class="module cl ml mls" id="users"> <ul>
</ul> </div> </div> </div> </div> </div> </div> </div>
<script> var users = [ {"name": "smyhvae", "icon": "images/noavatar_small.gif"}, {"name": "smyh", "icon": "images/noavatar_small.gif"}, {"name": "smyh02", "icon": "images/75_avatar_small.jpg"}, {"name": "vae", "icon": "images/89_avatar_small.jpg"}, {"name": "today", "icon": "images/noavatar_small.gif"}, {"name": "enen", "icon": "images/noavatar_small.gif"}, {"name": "oyey", "icon": "images/noavatar_small.gif"}, {"name": "dongxiaojie", "icon": "images/noavatar_small.gif"}, {"name": "qishi", "icon": "images/noavatar_small.gif"}, {"name": "qqtang", "icon": "images/noavatar_small.gif"}, {"name": "wawawa", "icon": "images/noavatar_small.gif"}, {"name": "haha", "icon": "images/noavatar_small.gif"}, {"name": "robot", "icon": "images/noavatar_small.gif"}, {"name": "heheda", "icon": "images/noavatar_small.gif"}, {"name": "smyhvae1", "icon": "images/noavatar_small.gif"}, {"name": "lihaile", "icon": "images/noavatar_small.gif"} ];
var div = document.getElementById("users"); var ul = div.firstElementChild || div.firstChild;
for (var i = 0; i < users.length; i++) { ul.innerHTML += '<li>' + '<a href="#" target="blank"><img src="' + users[i].icon + '" width="48" height="48" alt="' + users[i].name + '"></a>' + '<p><a href="#" title="' + users[i].name + '" target="_blank">' + users[i].name + '</a></p>' + '</li>'; } </script> </body> </html>
|
工程文件:
innerHTML举例2:模拟百度搜索的下方提示
要求实现的效果如下:
在这之前,我们先实现这样一个例子:判断字符串以某个字符串为开头。
判断字符串是否以某个字符串为开头:
var str = "smyhvae";
var num = str.indexOf("sm");
|
代码解释:我们可以通过indexOf("参数")
来实现。如果返回的索引值为0,说明字符串就是以这个参数开头的。
为了实现上方gif图的搜索功能,完整版代码如下:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> * { padding: 0; margin: 0; }
.box { width: 500px; margin: 200px auto; }
ul { width: 392px; padding: 5px; list-style: none; border: 1px solid red; }
li:hover { background-color: red; }
input { width: 400px; }
button { width: 70px; } </style> </head> <body> <div class="box"> <input type="text"/> <button>搜索</button> </div>
<script>
var arr = ["a", "ab", "abc", "abcd", "aa", "aaa"]; var box = document.getElementsByTagName("div")[0]; var inp = box.children[0];
inp.onkeyup = function () { var newArr = []; for (var i = 0; i < arr.length; i++) {
if (arr[i].indexOf(this.value) === 0) { newArr.push("<li>" + arr[i] + "</li>"); } } var str = newArr.join("");
if (box.getElementsByTagName("ul")[0]) { box.removeChild(box.children[2]); }
if (this.value.length === 0 || newArr.length === 0) { return; }
var ul = document.createElement("ul"); ul.innerHTML = str; box.appendChild(ul); } </script> </body> </html>
|
动态操作表格
方式1:
方式2:
PS:括号里可以带index。用的不多。