现在的页面,已经不仅仅是只有观赏功能,需要连接后台的接口,甚至根据后台信息实时更改展示在页面上的信息。所以,我们需要动态的创建我们的页面。
今天,推荐大家几种,简单又实用的动态创建页面的方式。
1.节点操作
2.字符串拼接
3.ES6
4.百度模板
一、节点操作
节点操作,即根据文档的DOM结构,利用原生js或者jq来动态改变我们的页面。这需要我们熟练获取DOM上的节点并熟练的操作他们。这里复习一下关于获取节点和操作节点的常用命令。
JavaScript节点的获取和操作常用命令
二、jQuery节点的获取和操作常用命令
这里给大家举个之前文章中写过的例子,基本是上的功能都是节点操作。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>Title</title>
</head>
<body>
<div class="list-wrap">
<div class="header t-cent">
<span> </span>
</div>
<ul id="list">
<li class="user1">
<div class="cont">
<img src="1.jpg">
<p class="text">hi!史塔克</p>
</div>
</li>
<li class="user2">
<div class="cont">
<img src="2.jpg">
<p class="text">hi!莉莉妮特</p>
</div>
</li>
</ul>
<div class="box">
<div class="user">
<div class="name" id="name" data-id="1">莉莉妮特</div>
<ul class="name-list" id="name-list">
<li data-id="1">莉莉妮特</li>
<li data-id="2">史塔克</li>
</ul>
</div>
<input type="text" id="text" value="">
<input type="button" type="button" id="send" value="发送">
</div>
</div>
<script type="text/javascript" src="jquery/jquery-3.0.0.min.js"></script>
<script type="text/javascript">
var yuan;//定义全局变量,用来标记选择的名字
$("#name").on("click",function(){
//点击时显示出名字列表
$("#name-list").css("display","block");
//当点击时选择其中一个名字
$("#name-list li").click(function(){
yuan = $(this).html();//记录下选择的名字,用于后面判断
$("#name").html($(this).html());//将选择的名字显示在列表里
$("#name-list").css("display","none");//名字列表消失
})
})
//输入文字,点击发送
// <li class="user2">
// <div class="cont">
// <img src="2.jpg">
// <p class="text">hi!莉莉妮特</p>
// </div>
// </li>
//此刻先分析页面结构
//1.每一句话的显示都是一个li标签
//2.里面有一个div都有一个img标签(用来放置头像)和一个p标签(用来存将要发送的文字)
//3.所以,每创建一句话,都要创建这些标签,才能保证页面不会错乱
$("#send").on("click",function(){
//得到文字$("#text").val()
var $language=$("<p class='text'></p>");//创建一个p标签
var $cont = $("<div class='cont'></div>");//创建一个div
$language.html($("#text").val());//得到即将发送的文字
//进行判断,当时选择的是莉莉妮特
if(yuan=="莉莉妮特") {
//创建莉莉妮特的头像
var $img=$("<img src='1.jpg'>");
//将头像添加到div里
$cont.append($img);
//将即将发送的文字添加到div里
$cont.append($language);
//创建一个li用来
var $li = $("<li class='user1'></li>");
//将div添加到li标签里
$li.append($cont);
//将li标签显示在页面上
$("#list").append($li)
}else{
//创建史塔克的头像
var $img=$("<img src='2.jpg'>");
//将头像添加到div里
$cont.append($img);
//将即将发送的文字添加到div里
$cont.append($language);
//创建一个li用来
var $li = $("<li class='user2'></li>");
//将div添加到li标签里
$li.append($cont);
//将li标签显示在页面上
$("#list").append($li)
}
})
</script>
</body>
</html>
从上述例子大家可以看到,当我们用操作节点的方式去修改我们的页面的时候,需要的代码较多,并且比较繁琐,容易出错,所以在小部分需要修改页面的时候,可以采取这种方式,而且对于大规模的修改页面就不适合了。
介绍下一种方式之前,我们先看一下正常我们不请求数据的时候,搭建的静态页面是这样的
而我们需要书写的代码如下
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<link rel="stylesheet" href="css/index.css" />
</head>
<body>
<div id="home">
<div class="container" id="hot">
<div id="hot_content" class="content_container">
<a href="###" class="hot_content_item">
<img src="./img/home/home51.jpg" alt="" />
<p class="title">音苏提有机酸奶酪</p>
<p>
<span class="best">精选</span>
<span class="maizeng">买一赠一</span>
</p>
<p class="weight">140g</p>
<p class="price_container">
<span class="now_price">¥7.9</span>
<span class="original_price">¥12</span>
</p>
<span class="add">+</span>
</a>
<a href="###" class="hot_content_item">
<img src="./img/home/home51.jpg" alt="" />
<p class="title">音苏提有机酸奶酪</p>
<p>
<span class="best">精选</span>
<span class="maizeng">买一赠一</span>
</p>
<p class="weight">140g</p>
<p class="price_container">
<span class="now_price">¥7.9</span>
<span class="original_price">¥12</span>
</p>
<span class="add">+</span>
</a>
<a href="###" class="hot_content_item">
<img src="./img/home/home51.jpg" alt="" />
<p class="title">音苏提有机酸奶酪</p>
<p>
<span class="best">精选</span>
<span class="maizeng">买一赠一</span>
</p>
<p class="weight">140g</p>
<p class="price_container">
<span class="now_price">¥7.9</span>
<span class="original_price">¥12</span>
</p>
<span class="add">+</span>
</a>
<a href="###" class="hot_content_item">
<img src="./img/home/home51.jpg" alt="" />
<p class="title">音苏提有机酸奶酪</p>
<p>
<span class="best">精选</span>
<span class="maizeng">买一赠一</span>
</p>
<p class="weight">140g</p>
<p class="price_container">
<span class="now_price">¥7.9</span>
<span class="original_price">¥12</span>
</p>
<span class="add">+</span>
</a>
</div>
<a href="###" id="hot_last">点击查看全部商品></a>
</div>
</main>
</div>
<script type="text/javascript" src="js/jquery-3.0.0.min.js" ></script>
<script type="text/javascript" src="js/index.js" ></script>
</body>
</html>
这样一小部分页面,还是静态页面,不算书写的css,就需要写这么多代码,那我们前端工作人员的头发还留住么,毕竟很多前端还是妹纸呢?所以,根据以上例子,推荐大家动态创建页面
二、字符串拼接
其实,我们上面的代码还是有用的,起码帮助我们梳理了页面需要的效果,因为都是相同的结果,用字符串拼接的结构,首先我们需要的,是我们需要动态创建那些内容。从上述栗子不难看出,当然是那些重复的代码,如下所示
<a href="###" class="hot_content_item">
<img src="./img/home/home51.jpg" alt="" />
<p class="title">音苏提有机酸奶酪</p>
<p>
<span class="best">精选</span>
<span class="maizeng">买一赠一</span>
</p>
<p class="weight">140g</p>
<p class="price_container">
<span class="now_price">¥7.9</span>
<span class="original_price">¥12</span>
</p>
<span class="add">+</span>
</a>
这一小段代码,我们需要重复写n遍,而且不便于维护,那么我们可以运用字符串拼接的方式,实现动态创建我们的代码,如下
$.getJSON("http://www.vrserver.applinzi.com/aixianfeng/apihomehot.php",
null, function (result) {
var dataArr = result.data;
var str = "";
for (var tempHotObj of dataArr) {
str += '<a href="###" class="hot_content_item">';
str += '<img src="' + tempHotObj.img + '" alt="" />';
str += '<p class="title">' + tempHotObj.name + '</p>';
str += '<p>';
str += '<span class="best">精选</span>';
str += '<span class="maizeng">' + tempHotObj.pm_desc + '</span>';
str += '</p>';
str += '<p class="weight">' + tempHotObj.specifics + '</p>';
str += '<p class="price_container">';
str += '<span class="now_price">¥' + tempHotObj.price + '</span>';
str += '<span class="original_price">¥' + tempHotObj.market_price + '</span>';
str += '</p>';
str += '<span class="add">+</span>';
str += '</a>';
}
//添加页面
$("#hot_content").html(str);
});
从上段代码,可以看出,我们只要按照上面代码的结构,一句一句的按照字符串方式拼接起来,而用“+变量+”的方式动态改变灵活的数据,那请求到多少数据,就显示在页面上多少数据,而页面上的如上的代码块,我们都可以删掉了,但是为了后期维护数据和查看页面结构,注释即可。
如下所示
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<link rel="stylesheet" href="css/index.css" />
</head>
<body>
<div id="home">
<div class="container" id="hot">
<div id="hot_content" class="content_container">
<!-- 开始注释 注释掉页面上动态创建的代码
<a href="###" class="hot_content_item">
<img src="./img/home/home51.jpg" alt="" />
<p class="title">音苏提有机酸奶酪</p>
<p>
<span class="best">精选</span>
<span class="maizeng">买一赠一</span>
</p>
<p class="weight">140g</p>
<p class="price_container">
<span class="now_price">¥7.9</span>
<span class="original_price">¥12</span>
</p>
<span class="add">+</span>
</a>
注释结束 -->
</div>
<a href="###" id="hot_last">点击查看全部商品></a>
</div>
</main>
</div>
<script type="text/javascript" src="js/jquery-3.0.0.min.js" ></script>
<script type="text/javascript" src="js/index.js" ></script>
</body>
</html>
那最后我们得到的效果图如下
三、ES6 模板字符串
还是沿用上栗。但是ES6方式代码如下
$.getJSON("http://www.vrserver.applinzi.com/aixianfeng/apihomehot.php",
null, function (result) {
var dataArr = result.data;
var str = "";
for (var tempHotObj of dataArr) {
str += `<a href="###" class="hot_content_item">
<img src="${tempHotObj.img}" alt="" />
<p class="title">${tempHotObj.name}</p>
<p>
<span class="best">精选</span>
<span class="maizeng">${tempHotObj.pm_desc}</span>
</p>
<p class="weight">${tempHotObj.specifics}</p>
<p class="price_container">
<span class="now_price">¥${tempHotObj.price}</span>
<span class="original_price">¥${tempHotObj.market_price}</span>
</p>
<span class="add">+</span>
</a>`;
}
//添加页面
$("#hot_content").html(str);
});
从上段代码可以看出,这次我们不需要一句一句的拼接整个代码段,而是直接粘贴过来,用反撇号()**,反撇号就是数字键盘1前面看上去不太起眼的那位(现在人家咸鱼翻身了,作用大着呢),接着说,用**反撇号(
)将粘贴过来的代码段包裹起来就可以了。
对于代码段中的变量部分,需要大括号{ }将变量包裹起来就可以了。运行效果和字符串拼接方式实现的效果是一样的,如下所示
四、百度模板
百度模板也是常用之一。
还是启用上述栗子,代码如下
$.getJSON("http://www.vrserver.applinzi.com/aixianfeng/apihomehot.php",
null, function (result) {
var dataArr = result.data;
var str = "";
str = baidu.template('hotTemplate', result);
//添加页面
$("#hot_content").html(str);
//设置懒加载
$("#hot_content img").lazyload({
effect : 'fadeIn'
})
});
是不是看不懂?因为代码不全呀~因为,此时页面的代码是这样的。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<link rel="stylesheet" href="css/index.css" />
</head>
<body>
<div id="home">
<div class="container" id="hot">
<div id="hot_content" class="content_container">
<!--开始注释
<a href="###" class="hot_content_item">
<img src="./img/home/home51.jpg" alt="" />
<p class="title">音苏提有机酸奶酪</p>
<p>
<span class="best">精选</span>
<span class="maizeng">买一赠一</span>
</p>
<p class="weight">140g</p>
<p class="price_container">
<span class="now_price">¥7.9</span>
<span class="original_price">¥12</span>
</p>
<span class="add">+</span>
</a>
结束注释-->
</div>
<a href="###" id="hot_last">点击查看全部商品></a>
</div>
</main>
</div>
<script type="text/javascript" src="js/jquery-3.0.0.min.js" ></script>
<script type="text/javascript" src="js/index.js" ></script>
<script type="text/javascript" src="js/jquery.lazyload.min.js" ></script>
<script type="text/javascript" src="js/baiduTemplate.js" ></script>
<script type="text/template" id="hotTemplate">
<% for (var tempObj of data) { %>
<a href="###" class="hot_content_item">
<!-- 懒加载 -->
<img data-original=" <%= tempObj.img %> " alt="" />
<p class="title">音苏提有机酸奶酪</p>
<p>
<span class="best">精选</span>
<span class="maizeng">买一赠一</span>
</p>
<p class="weight">140g</p>
<p class="price_container">
<span class="now_price">¥7.9</span>
<span class="original_price">¥12</span>
</p>
<span class="add">+</span>
</a>
<% } %>
</script>
</body>
</html>
还是没看懂吧?下面解释一下
1.引入文件------运用百度模板,首先,我们需要先导入baiduTemplate.js文件。
2.放置代码段------页面中,模板块放在 <script> 中,设置type属性为text/template或text/html,用id标识
3.调用代码段------index.js文件中,第一个参数是模板script标签的id值,第二个参数是传给模板的数据(这里传的是最后想要数据的上一层)
4.调用代码段------插入到页面的指定容器中
05.模板使用语法
默认分隔符为<% %>,在<script>标签的开始和结束为止要使用<% %>。在变量部分要使用<%=变量 %>方式告知,这是一个变量。
这种方式也可以实现动态加载我们的页面,与上述效果一致。
如果还是有点模糊,可以点击这个链接看一下,对百度模板介绍的比较详细http://baidufe.github.io/BaiduTemplate/