Ajax学习笔记第4天

做决定之前仔细考虑,一旦作了决定就要勇往直前、坚持到底!

1 模仿百度招聘

整个流程展示:

027.gif

1.文件目录

028.png

2.页面效果展示及代码

  • data中的page1数据展示

029.png

2.1 主页 index.html:index里面代码部分解释

  • underscore.js :模板页面的相关代码
<!-- 引入页面模板【页面呈现的东西类似时】 -->
<script src="js/underscore.js"></script>
<script type="text/template" id="template">
<div class="rowInfo"><div class="row"><div class="col col2"><%=name%></div><div class="col"><%=postType%></div><div class="col"><%=workPlace%></div><div class="col"><%=recruitNum%></div><div class="col"><%=publishDate%></div><div class="col" ><!-- 用来存放倒三角符号 --><span class="icon"></span></div></div><div class="infoDetail"><p>工作职责:</p><p><%=workContent%></p><p>职位要求</p><p><%=serviceCondition%></p><div class="btn"><a href="#" class="left">申请职位</a><a href="#" class="right">收藏职位</a></div></div>
</div>
</script>
  • 页面渲染:jQuery框架
第1部分代码:先获取节点
  • jQuery选择器:

class选择器:$(".class")

id选择器:$("#id")

  • $("#id").text()

jQuery:html()方法会识别html标签,text()方法会那内容直接当成字符串,并不会识别html标签。

console.log($id); // 打印的是整个id="id"里面的东西,是一个字符串了

第3部分代码:再发送请求
// jQuery的get请求
// data:就是url返回来的数据data ={xxx}
$.get("data/page1.json", function (data)
{
// data.rowCount:共有多少条数据
$("#rowCount").html(data.rowCount)
// var b = $("#rowCount").html(data.rowCount)
// console.log(b);// underscore中的遍历方法 _.each(list,function(){}),遍历 list 中的所有元素,按顺序用每个元素当做参数调用 function 函数
// 得到数据遍历,渲染页面
_.each(data.postList, function (dictionary)
{
// dictionary:是遍历数组data.postList中的每一条数据// console.log(dictionary);
// 将每一条数据都传给RowDom函数
new RowDom(dictionary)
// this = > window
// console.log(this==window);//true
})
})
第2部分代码:最后再执行
string.replace(/.*\-(.*)\-.*/g, function (match, $1){// match匹配:符合正则条件的被捕获的值// 并返回给stringreturn $1;})
  • .*”表示任意字符有0个或多个

  • . 代表任意字符,后面的 * 代表 前面的任意字符有0个或多个

  • \代表转译符,-这个符号不能直接出现在表达式里,必须被\转译符后才能变成一个普通的字符-

  • 括号代表它被捕获了,相当于被复制了,还没被粘贴

  • letter-spacing:
//==========第2部分=============//  
function RowDom (dictionary)
{// 【this-->构造函数RowDom创建的实例对象,每个this都不同】// console.log(this); // console.log(this == window);//false// console.log(this == RowDom);//falsethis.dictionary = dictionary;// 修订字典项// 如果有符号短横 -,进入判断if (this.dictionary.postType.indexOf("-") != -1) {// “.*”表示任意字符有0个或多个// . 代表任意字符,后面的 * 代表 前面的任意字符有0个或多个// \代表转译符,-这个符号不能直接出现在表达式里,必须被\转译符后才能变成一个普通的字符-,// 括号代表它被捕获了,相当于被复制了,还没被粘贴this.dictionary.postType = this.dictionary.postType.replace(/.*\-(.*)\-.*/g, function (match, $1){// match匹配:符合正则条件的被捕获的值// 并返回给postTypereturn $1;})}// 解析模板// 将数据传给模板函数解析,解析完的字符串模板【带数据的】var domStr = compiledFun(this.dictionary);// console.log(domStr);// 将解析的模板设置为dom// 选到 id="template"里面的的dom节点rowInfothis.$dom = $(domStr);// console.log(this.$dom,'dom')// 获取自己的点击按钮//在dom节点rowInfo 里查找icon find() ,后代选择器this.$tableBtn = this.$dom.find(".icon");// 给按钮设置两种状态-打开1-关闭0;this.state = 0;// 按钮里的this的值会发生改变,在按钮里取不到new RowDom(),所以此处要self = this;就可以在按钮里取到了var self = this;// 设置按钮的显示和隐藏的状态this.$tableBtn.click(function (){$(this).removeClass();// 点击后,判断是不是关闭状态0,是的话,就打开,并且state=1[打开]if (self.state == 0) {// 将按钮设置为打开状态// 图标变换$(this).addClass("bottomIcon");self.state = 1;// 打开详情self.$dom.find(".infoDetail").css({ "display": "block" })} else {// 将按钮变成关闭状态$(this).addClass("icon");self.state = 0;// 关闭详情self.$dom.find(".infoDetail").css({ "display": "none" })}})// 追加节点上树$jobTable.append(this.$dom)
}

<script src="js/jquery.min.js"></script>
<script>
//==========第1部分=============//    
// 获取节点【jQuery的类class选择器--.】
var $jobTable = $(".jobBody");
// 获取节点【jQuery的id选择器--#】
// 获取模板字符串
var $templateStr = $("#template").text();
// jQuery:html()方法会识别html标签,text()方法会那内容直接当成字符串,并不会识别html标签。
// console.log($templateStr);
// 打印的是整个id="template"里面的东西,是一个字符串了
// 设置模板编译函数
var compiledFun = _.template($templateStr);
// console.log(compiledFun);//==========第2部分=============//  
function RowDom (dictionary)
{// 【this-->构造函数RowDom创建的实例对象,每个this都不同】// console.log(this); // console.log(this == window);//false// console.log(this == RowDom);//falsethis.dictionary = dictionary;// 修订字典项// 如果有符号短横 -,进入判断if (this.dictionary.postType.indexOf("-") != -1) {// “.*”表示任意字符有0个或多个// . 代表任意字符,后面的 * 代表 前面的任意字符有0个或多个// \代表转译符,-这个符号不能直接出现在表达式里,必须被\转译符后才能变成一个普通的字符-,// 括号代表它被捕获了,相当于被复制了,还没被粘贴this.dictionary.postType = this.dictionary.postType.replace(/.*\-(.*)\-.*/g, function (match, $1){// match匹配:符合正则条件的被捕获的值// 并返回给postTypereturn $1;})}// 解析模板// 将数据传给模板函数解析,解析完的字符串模板var domStr = compiledFun(this.dictionary);// console.log(domStr);// 将解析的模板设置为dom// 选到 id="template"里面的的dom节点rowInfothis.$dom = $(domStr);// console.log(this.$dom,'dom')// 获取自己的点击按钮//在dom节点rowInfo 里查找icon find() ,后代选择器this.$tableBtn = this.$dom.find(".icon");// 给按钮设置两种状态-打开1-关闭0;this.state = 0;// 按钮里的this的值会发生改变,在按钮里取不到new RowDom(),所以此处要self = this;就可以在按钮里取到了var self = this;// 设置按钮的显示和隐藏的状态this.$tableBtn.click(function (){$(this).removeClass();// 点击后,判断是不是关闭状态0,是的话,就打开,并且state=1[打开]if (self.state == 0) {// 将按钮设置为打开状态// 图标变换$(this).addClass("bottomIcon");self.state = 1;// 打开详情self.$dom.find(".infoDetail").css({ "display": "block" })} else {// 将按钮变成关闭状态$(this).addClass("icon");self.state = 0;// 关闭详情self.$dom.find(".infoDetail").css({ "display": "none" })}})// 追加节点上树$jobTable.append(this.$dom)
}//==========第3部分=============//  
// jQuery的get请求
// data:就是url返回来的数据data ={xxx}
$.get("data/page1.json", function (data)
{// data.rowCount:共有多少条数据$("#rowCount").html(data.rowCount)// var b = $("#rowCount").html(data.rowCount)// console.log(b);// underscore中的遍历方法 _.each(list,function(){}),遍历 list 中的所有元素,按顺序用每个元素当做参数调用 function 函数// 得到数据遍历,渲染页面_.each(data.postList, function (dictionary){// dictionary:是遍历数组data.postList中的每一条数据// console.log(dictionary);// 将每一条数据都传给RowDom函数new RowDom(dictionary)// this = > window// console.log(this==window);//true})
})
</script>

完整index.html代码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><!-- 引入外部样式 --><link rel="stylesheet" href="./css/index.css"><title>Document</title>
</head><body><div class="warp"><!-- 第一栏 --><div class="info"><h2>职位信息</h2><p>共有<span id="rowCount">0</span>个职位</p></div><!-- 第二栏 --><div class="jobBox"><!-- 工作顶部栏,职位名称 --><div class="jobHeader"><div class="row"><div class="col col2">职位名称</div><div class="col">职位类别</div><div class="col">工作地点</div><div class="col">招聘人数</div><div class="col">更新时间</div><div class="col"></div></div></div><!-- 具体工作职位 --><div class="jobBody"></div></div></div><!-- 引入页面模板【页面呈现的东西类似时】 --><script src="js/underscore.js"></script><script type="text/template" id="template"><div class="rowInfo"><div class="row"><div class="col col2"><%=name%></div><div class="col"><%=postType%></div><div class="col"><%=workPlace%></div><div class="col"><%=recruitNum%></div><div class="col"><%=publishDate%></div><div class="col" ><!-- 用来存放倒三角符号 --><span class="icon"></span></div></div><div class="infoDetail"><p>工作职责:</p><p><%=workContent%></p><p>职位要求</p><p><%=serviceCondition%></p><div class="btn"><a href="#" class="left">申请职位</a><a href="#" class="right">收藏职位</a></div></div></div></script><script src="js/jquery.min.js"></script><script>// 获取节点【jQuery的类class选择器--.】var $jobTable = $(".jobBody");// 获取节点【jQuery的id选择器--#】// 获取模板字符串var $templateStr = $("#template").text();// jQuery:html()方法会识别html标签,text()方法会那内容直接当成字符串,并不会识别html标签。// console.log($templateStr);// 打印的是整个id="template"里面的东西,是一个字符串了// 设置模板编译函数var compiledFun = _.template($templateStr);// console.log(compiledFun);function RowDom (dictionary){// 【this-->构造函数RowDom创建的实例对象,每个this都不同】// console.log(this); // console.log(this == window);//false// console.log(this == RowDom);//falsethis.dictionary = dictionary;// 修订字典项// 如果有符号短横 -,进入判断if (this.dictionary.postType.indexOf("-") != -1) {// “.*”表示任意字符有0个或多个// . 代表任意字符,后面的 * 代表 前面的任意字符有0个或多个// \代表转译符,-这个符号不能直接出现在表达式里,必须被\转译符后才能变成一个普通的字符-,// 括号代表它被捕获了,相当于被复制了,还没被粘贴this.dictionary.postType = this.dictionary.postType.replace(/.*\-(.*)\-.*/g, function (match, $1){// match匹配:符合正则条件的被捕获的值// 并返回给postTypereturn $1;})}// 解析模板// 将数据传给模板函数解析,解析完的字符串模板var domStr = compiledFun(this.dictionary);// console.log(domStr);// 将解析的模板设置为dom// 选到 id="template"里面的的dom节点rowInfothis.$dom = $(domStr);// console.log(this.$dom,'dom')// 获取自己的点击按钮//在dom节点rowInfo 里查找icon find() ,后代选择器this.$tableBtn = this.$dom.find(".icon");// 给按钮设置两种状态-打开1-关闭0;this.state = 0;// 按钮里的this的值会发生改变,在按钮里取不到new RowDom(),所以此处要self = this;就可以在按钮里取到了var self = this;// 设置按钮的显示和隐藏的状态this.$tableBtn.click(function (){$(this).removeClass();// 点击后,判断是不是关闭状态0,是的话,就打开,并且state=1[打开]if (self.state == 0) {// 将按钮设置为打开状态// 图标变换$(this).addClass("bottomIcon");self.state = 1;// 打开详情self.$dom.find(".infoDetail").css({ "display": "block" })} else {// 将按钮变成关闭状态$(this).addClass("icon");self.state = 0;// 关闭详情self.$dom.find(".infoDetail").css({ "display": "none" })}})// 追加节点上树$jobTable.append(this.$dom)}// jQuery的get请求// data:就是url返回来的数据data ={xxx}$.get("data/page1.json", function (data){// data.rowCount:共有多少条数据$("#rowCount").html(data.rowCount)// var b = $("#rowCount").html(data.rowCount)// console.log(b);// underscore中的遍历方法 _.each(list,function(){}),遍历 list 中的所有元素,按顺序用每个元素当做参数调用 function 函数// 得到数据遍历,渲染页面_.each(data.postList, function (dictionary){// dictionary:是遍历数组data.postList中的每一条数据// console.log(dictionary);// 将每一条数据都传给RowDom函数new RowDom(dictionary)// this = > window// console.log(this==window);//true})})</script>
</body></html>

2.2 css/index.css

body{background: #eee;font-family: "-apple-system";
}
.warp{width:1100px;margin: 30px auto;color: #666;padding-top: 10px;font-size: 13px;
}
.warp .info {padding: 0 8px;/* 弹性布局 ,父级元素设置弹性布局,所有子元素灵活布局*/display: flex;/* 子元素:水平两端对齐 */justify-content: space-between;
}
.warp .info h2{font-size: 14px;color: #333;
}
.warp .info span{font-size: 16px;color: #fc7753;
}
.warp .jobBox{background: #fff;padding: 10px 0;
}.warp .jobBox .jobHeader{color: #333;font-weight: 800;border-bottom: 1px solid #f5f5f5;}
.warp .jobBox .row{/* 子元素弹性布局 */display: flex;
}
.warp .jobBox .row .col{/* 每个col子类:占据3【比如宽度】 */flex: 3;
}
.warp .jobBox .row .col2{/* 每个col2子类:占据6【比如宽度】 */flex: 6;
}
.warp .jobBox .jobHeader .row{/* 内边距:上下固定12px,左右1100*3%=33px */padding: 12px 3%;
}
.warp .jobBox .jobBody{/* 内边距:上下固定0px,左右1100*1%=11px */padding: 0 1%;
}
.warp .jobBox .jobBody .row{/* 内边距:上下固定12px,左右1100*3%=33px */padding: 12px 2%;
}/* .col:last-child:选中最后一个子元素 */
.warp .jobBox .row .col:last-child{/* 文本内容,靠右显示 */text-align: right;/* 占据比例为1,即除了最后一个col元素外,其他col占比3 */flex: 1;
}
/* 给icon容器设置背景图片 */
.warp .jobBox .jobBody .icon{/* 让行内元素span以行内形式排列,以块级形式展示  *//* 设置以后,可以给行内元素设置宽高,不然就是让内容撑高的,此处就是让padding撑开的一个图标大小的元素容器*/display: inline-block;/* 上10px,右21px */padding: 10px 21px 0 0;/* 不重复 向左移动28px,向上移动146px*/background: url("../images/banner-icon.png") no-repeat -28px -146px;
}
/* 当鼠标放在icon上面时,只改变背景图片的位置,让它显示出自己想要的一个图标 */
.warp .jobBox .jobBody .icon:hover{background-position: -81px -146px;
}
/* icon点击事件触发 :添加的类bottomIcon */
.warp .jobBox .jobBody .bottomIcon {/* 让行内元素span以行内形式排列,以块级形式展示  *//* 设置以后,可以给行内元素设置宽高,不然就是让内容撑高的,此处就是让padding撑开的一个图标大小的元素容器*/display: inline-block;/* 上10px,右21px */padding: 10px 21px 0 0;/* 不重复 向左移动2px,向上移动146px*//* .. 从此页面返回上一级 */background: url("../images/banner-icon.png") no-repeat -2px -146px;
}
/* 当鼠标放在bottomIcon上面时,只改变背景图片的位置,让它显示出自己想要的一个图标 */
.warp .jobBox .jobBody .bottomIcon:hover{background-position: -54px -146px;
}
.warp .jobBox .jobBody .rowInfo{border-bottom: 2px dotted #f5f5f5;
}
.warp .jobBox .jobBody .rowInfo .infoDetail{padding: 15px 2%;display: none;
}
.warp .jobBox .jobBody .rowInfo .infoDetail p {line-height: 36px;
}.warp .jobBox .jobBody .rowInfo .infoDetail .btn a{padding: 8px 16px;font-size: 14px;line-height: 30px;color: #fff;/* 兼容内核为webkit和moz的浏览器 */-webkit-transition: .3s;-moz-transition: .3s;/* transition-duration 属性用来设置过渡需要花费的时间(单位为秒或者毫秒)0.3s */transition: .3s;/* 没有下划线 */text-decoration: none;
}.warp .jobBox .jobBody .rowInfo .infoDetail .btn a.left{background-color: #ec6738;margin-right: 10px;
}
.warp .jobBox .jobBody .rowInfo .infoDetail .btn a.right{background-color: #4090ff;
}
Ajax的单独分页

030.gif

pagination.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>* {margin: 0;padding: 0;}body {background: #eee;}.pageNav {margin: 100px;display: flex;}.pageNav span {padding: 10px 18px;font-size: 16px;color: #999;border-radius: 3px;background-color: #fff;margin: 0 3px;cursor: pointer;}.pageNav span.cur {color: #4090ff;}.pageNav span:hover {color: #4090ff;}.pageNav span.point {background: transparent;padding: 0 5px;cursor: default;}.pageNav span.point:hover {color: #999;}.pageNav span.point::before {content: "";display: block;height: 15%;}.pageNav .page i {display: inline-block;padding: 14px 9px 0 0;background: url(images/personalCenter-icons.png) -6px -1142px;}.pageNav .page:hover i {background-position: -35px -1142px;}.pageNav .next i {background-position: -17px -1142px;}.pageNav .next:hover i {background-position: -48px -1142px;}</style>
</head><body><div class="pageNav" id="pageNav"><span class="prev page"><i></i></span><span class="next page"><i></i></span></div><script src="js/jquery.min.js"></script><script>// 构造函数,传入一个总页码生成对应的分页器function Pager (pageAmount){// 获取分页的根元素this.$dom = $("#pageNav");// 总页数this.pageAmount = pageAmount;// 上一页和下一页this.$prev = this.$dom.find(".prev");this.$next = this.$dom.find(".next");// 当前页数this.currentPage = 1;// 分情况设置页面逻辑this.pageTo()// eq(0) 选取第1个 .num 元素(索引号为 0):// .addClass :添加属性类$(".num").eq(0).addClass("cur");// 点击数字的状态var self = this;// 设置代理点击// 单击时,触发回调函数// delegate() 方法为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序this.$dom.delegate(".num", "click", function (){// 此时的this-->点击的那个元素【那个想跳转的页数】self.currentPage = Number($(this).html());// 清空所有的渲染dom// remove() 方法移除被选元素,包括所有的文本和子节点。// 该方法也会移除被选元素的数据和事件。$(".num").remove();$(".point").remove();// 重新设置页面逻辑【刷新页面】self.pageTo()});// 上一页的点击this.$prev.click(function (){// 如果当前页数为小于等于1,则直接跳出点击逻辑if (self.currentPage <= 1) {return;}// 当前页数减一self.currentPage--;// 清空所有的渲染dom// remove() 方法移除被选元素,包括所有的文本和子节点。// 该方法也会移除被选元素的数据和事件。$(".num").remove();$(".point").remove();// 重新设置页面逻辑【刷新页面】self.pageTo()})// 上一页的点击this.$next.click(function (){// 如果当前页数为大于等于总页数,则直接跳出点击逻辑if (self.currentPage >= self.pageAmount) {return;}// 当前页数加一self.currentPage++;// 清空所有的渲染dom// remove() 方法移除被选元素,包括所有的文本和子节点。// 该方法也会移除被选元素的数据和事件。$(".num").remove();$(".point").remove();// 重新设置页面逻辑【刷新页面】self.pageTo()})}Pager.prototype.pageTo = function (num){// 总页数少于5页的时候if (this.pageAmount <= 5) {for (var i = this.pageAmount; i >= 1; i--) {// .prependTo(A):把内容子元素 添加至 父A元素里的开头位置【往下挤压】//  已经有了 class='num'$("<span class='num'>" + i + "</span>").prependTo(this.$dom)}// 给对应点击的数字加cur$(".num").eq(this.currentPage - 1).addClass("cur").siblings().removeClass("cur");} else if (this.pageAmount > 5 && this.currentPage < 5) {// 当前的总页数大于5并且当前选中页面小于5$("<span class='point'>...</span>").prependTo(this.$dom)for (var i = 5; i >= 1; i--) {$("<span class='num'>" + i + "</span>").prependTo(this.$dom)}// 加cur$(".num").eq(this.currentPage - 1).addClass("cur").siblings().removeClass("cur");} else if ((this.pageAmount >= 5 && this.currentPage >= 5) && (this.currentPage < this.pageAmount - 3)) {// 当前的总页数大于等于5并且当前的选中的页面大于等于5并且当前的选中的页数小于总页数减3$("<span class='num'>" + this.pageAmount + "</span>").prependTo(this.$dom);$("<span class='point'>...</span>").prependTo(this.$dom);for (var i = this.currentPage + 2; i >= this.currentPage - 2; i--) {$("<span class='num'>" + i + "</span>").prependTo(this.$dom)}// 加cur$(".num").eq(2).addClass("cur").siblings().removeClass("cur");$("<span class='point'>...</span>").prependTo(this.$dom);$("<span class='num'>1</span>").prependTo(this.$dom);} else if ((this.pageAmount >= 5 && this.currentPage >= 5) && (this.currentPage >= this.pageAmount - 3)) {for (var i = this.pageAmount; i >= this.pageAmount - 4; i--) {$("<span class='num'>" + i + "</span>").prependTo(this.$dom)}// 加cur$(".num").eq(this.currentPage - this.pageAmount - 1).addClass("cur").siblings().removeClass("cur");$("<span class='point'>...</span>").prependTo(this.$dom);$("<span class='num'>1</span>").prependTo(this.$dom);}}</script>
</body></html>

2 模仿百度招聘完整代码(加了页面跳转)】—本地只有十条数据

效果展示

031.gif

index.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><!-- 引入外部样式 --><link rel="stylesheet" href="./css/index.css"><title>Document</title>
</head><body><div class="warp"><!-- 第一栏 --><div class="info"><h2>职位信息</h2><p>共有<span id="rowCount">0</span>个职位</p></div><!-- 第二栏 --><div class="jobBox"><!-- 工作顶部栏,职位名称 --><div class="jobHeader"><div class="row"><div class="col col2">职位名称</div><div class="col">职位类别</div><div class="col">工作地点</div><div class="col">招聘人数</div><div class="col">更新时间</div><div class="col"></div></div></div><!-- 具体工作职位 --><div class="jobBody"><!-- 分页 --></div></div></div><div class="pagination"><div class="pageNav" id="pageNav"><span class="prev page"><i></i></span><span class="next page"><i></i></span></div></div><!-- 引入页面模板【页面呈现的东西类似时】 --><script src="js/underscore.js"></script><script type="text/template" id="template"><div class="rowInfo"><div class="row"><div class="col col2"><%=name%></div><div class="col"><%=postType%></div><div class="col"><%=workPlace%></div><div class="col"><%=recruitNum%></div><div class="col"><%=publishDate%></div><div class="col" ><!-- 用来存放倒三角符号 --><span class="icon"></span></div></div><div class="infoDetail"><p>工作职责:</p><p><%=workContent%></p><p>职位要求</p><p><%=serviceCondition%></p><div class="btn"><a href="#" class="left">申请职位</a><a href="#" class="right">收藏职位</a></div></div></div></script><script src="js/jquery.min.js"></script><script>// 获取节点【jQuery的类class选择器--.】var $jobTable = $(".jobBody");// 获取节点【jQuery的id选择器--#】// 获取模板字符串var $templateStr = $("#template").text();// jQuery:html()方法会识别html标签,text()方法会那内容直接当成字符串,并不会识别html标签。// console.log($templateStr);// 打印的是整个id="template"里面的东西,是一个字符串了// 设置模板编译函数var compiledFun = _.template($templateStr);// console.log(compiledFun);function RowDom (dictionary){// 【this-->构造函数RowDom创建的实例对象,每个this都不同】// console.log(this); // console.log(this == window);//false// console.log(this == RowDom);//falsethis.dictionary = dictionary;// 修订字典项// 如果有符号短横 -,进入判断if (this.dictionary.postType.indexOf("-") != -1) {// “.*”表示任意字符有0个或多个// . 代表任意字符,后面的 * 代表 前面的任意字符有0个或多个// \代表转译符,-这个符号不能直接出现在表达式里,必须被\转译符后才能变成一个普通的字符-,// 括号代表它被捕获了,相当于被复制了,还没被粘贴this.dictionary.postType = this.dictionary.postType.replace(/.*\-(.*)\-.*/g, function (match, $1){// match匹配:符合正则条件的被捕获的值// 并返回给postTypereturn $1;})}// 解析模板// 将数据传给模板函数解析,解析完的字符串模板var domStr = compiledFun(this.dictionary);// console.log(domStr);// 将解析的模板设置为dom// 选到 id="template"里面的的dom节点rowInfothis.$dom = $(domStr);// console.log(this.$dom,'dom')// 获取自己的点击按钮//在dom节点rowInfo 里查找icon find() ,后代选择器this.$tableBtn = this.$dom.find(".icon");// 给按钮设置两种状态-打开1-关闭0;this.state = 0;// 按钮里的this的值会发生改变,在按钮里取不到new RowDom(),所以此处要self = this;就可以在按钮里取到了var self = this;// 设置按钮的显示和隐藏的状态this.$tableBtn.click(function (){$(this).removeClass();// 点击后,判断是不是关闭状态0,是的话,就打开,并且state=1[打开]if (self.state == 0) {// 将按钮设置为打开状态// 图标变换$(this).addClass("bottomIcon");self.state = 1;// 打开详情self.$dom.find(".infoDetail").css({ "display": "block" })} else {// 将按钮变成关闭状态$(this).addClass("icon");self.state = 0;// 关闭详情self.$dom.find(".infoDetail").css({ "display": "none" })}})// 追加节点上树$jobTable.append(this.$dom)}// 分页pagination// 构造函数,传入一个总页码生成对应的分页器function Pager (pageAmount){// 获取分页的根元素this.$dom = $("#pageNav");// 总页数this.pageAmount = pageAmount;// 上一页和下一页this.$prev = this.$dom.find(".prev");this.$next = this.$dom.find(".next");// 当前页数this.currentPage = 1;// 分情况设置页面逻辑this.pageTo()// eq(0) 选取第1个 .num 元素(索引号为 0):// .addClass :添加属性类$(".num").eq(0).addClass("cur");// 点击数字的状态var self = this;// 设置代理点击// 单击时,触发回调函数// delegate() 方法为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序this.$dom.delegate(".num", "click", function (){// 此时的this-->点击的那个元素【那个想跳转的页数】self.currentPage = Number($(this).html());// 清空所有的渲染dom// remove() 方法移除被选元素,包括所有的文本和子节点。// 该方法也会移除被选元素的数据和事件。$(".num").remove();$(".point").remove();// 重新设置页面逻辑【刷新页面】self.pageTo()});// 上一页的点击this.$prev.click(function (){// 如果当前页数为小于等于1,则直接跳出点击逻辑if (self.currentPage <= 1) {return;}// 当前页数减一self.currentPage--;// 清空所有的渲染dom// remove() 方法移除被选元素,包括所有的文本和子节点。// 该方法也会移除被选元素的数据和事件。$(".num").remove();$(".point").remove();// 重新设置页面逻辑【刷新页面】self.pageTo()})// 上一页的点击this.$next.click(function (){// 如果当前页数为大于等于总页数,则直接跳出点击逻辑if (self.currentPage >= self.pageAmount) {return;}// 当前页数加一self.currentPage++;// 清空所有的渲染dom// remove() 方法移除被选元素,包括所有的文本和子节点。// 该方法也会移除被选元素的数据和事件。$(".num").remove();$(".point").remove();// 重新设置页面逻辑【刷新页面】self.pageTo()})}Pager.prototype.pageTo = function (num){// 总页数少于5页的时候if (this.pageAmount <= 5) {for (var i = this.pageAmount; i >= 1; i--) {// .prependTo(A):把内容子元素 添加至 父A元素里的开头位置【往下挤压】//  已经有了 class='num'$("<span class='num'>" + i + "</span>").prependTo(this.$dom)}// 给对应点击的数字加cur$(".num").eq(this.currentPage - 1).addClass("cur").siblings().removeClass("cur");} else if (this.pageAmount > 5 && this.currentPage < 5) {// 当前的总页数大于5并且当前选中页面小于5$("<span class='point'>...</span>").prependTo(this.$dom)for (var i = 5; i >= 1; i--) {$("<span class='num'>" + i + "</span>").prependTo(this.$dom)}// 加cur$(".num").eq(this.currentPage - 1).addClass("cur").siblings().removeClass("cur");} else if ((this.pageAmount >= 5 && this.currentPage >= 5) && (this.currentPage < this.pageAmount - 3)) {// 当前的总页数大于等于5并且当前的选中的页面大于等于5并且当前的选中的页数小于总页数减3$("<span class='num'>" + this.pageAmount + "</span>").prependTo(this.$dom);$("<span class='point'>...</span>").prependTo(this.$dom);for (var i = this.currentPage + 2; i >= this.currentPage - 2; i--) {$("<span class='num'>" + i + "</span>").prependTo(this.$dom)}// 加cur$(".num").eq(2).addClass("cur").siblings().removeClass("cur");$("<span class='point'>...</span>").prependTo(this.$dom);$("<span class='num'>1</span>").prependTo(this.$dom);} else if ((this.pageAmount >= 5 && this.currentPage >= 5) && (this.currentPage >= this.pageAmount - 3)) {for (var i = this.pageAmount; i >= this.pageAmount - 4; i--) {$("<span class='num'>" + i + "</span>").prependTo(this.$dom)}// 加cur$(".num").eq(this.currentPage - this.pageAmount - 1).addClass("cur").siblings().removeClass("cur");$("<span class='point'>...</span>").prependTo(this.$dom);$("<span class='num'>1</span>").prependTo(this.$dom);}// 发送Ajax请求当前页码的json数据$.get("data/page" + this.currentPage + ".json", function (data){// 改变dom模板// 改变之前,前移除旧的数据$(".rowInfo").remove();// underscore中的遍历方法 _.each(list,function(){}),遍历 list 中的所有元素,按顺序用每个元素当做参数调用 function 函数// 得到数据遍历,渲染页面_.each(data.postList, function (dictionary){// dictionary:是遍历数组data.postList中的每一条数据// console.log(dictionary);// 将每一条数据都传给RowDom函数new RowDom(dictionary)// this = > window// console.log(this==window);//true})})}// jQuery的get请求// data:就是url返回来的数据data ={xxx}$.get("data/page1.json", function (data){// data.rowCount:共有多少条数据// data.totalPage:共有多少页$("#rowCount").html(data.rowCount)// var b = $("#rowCount").html(data.rowCount)// console.log(b);// 初始化的时候new 一次分页,将总页数传给分页器new Pager(data.totalPage)// underscore中的遍历方法 _.each(list,function(){}),遍历 list 中的所有元素,按顺序用每个元素当做参数调用 function 函数// 得到数据遍历,渲染页面_.each(data.postList, function (dictionary){// dictionary:是遍历数组data.postList中的每一条数据// console.log(dictionary);// 将每一条数据都传给RowDom函数new RowDom(dictionary)// this = > window// console.log(this==window);//true})})</script>
</body></html>

index.css

body{background: #eee;font-family: "-apple-system";
}
.warp{width:1100px;margin: 30px auto;color: #666;padding-top: 10px;font-size: 13px;
}
.warp .info {padding: 0 8px;/* 弹性布局 ,父级元素设置弹性布局,所有子元素灵活布局*/display: flex;/* 子元素:水平两端对齐 */justify-content: space-between;
}
.warp .info h2{font-size: 14px;color: #333;
}
.warp .info span{font-size: 16px;color: #fc7753;
}
.warp .jobBox{background: #fff;padding: 10px 0;
}.warp .jobBox .jobHeader{color: #333;font-weight: 800;border-bottom: 1px solid #f5f5f5;}
.warp .jobBox .row{/* 子元素弹性布局 */display: flex;
}
.warp .jobBox .row .col{/* 每个col子类:占据3【比如宽度】 */flex: 3;
}
.warp .jobBox .row .col2{/* 每个col2子类:占据6【比如宽度】 */flex: 6;
}
.warp .jobBox .jobHeader .row{/* 内边距:上下固定12px,左右1100*3%=33px */padding: 12px 3%;
}
.warp .jobBox .jobBody{/* 内边距:上下固定0px,左右1100*1%=11px */padding: 0 1%;
}
.warp .jobBox .jobBody .row{/* 内边距:上下固定12px,左右1100*3%=33px */padding: 12px 2%;
}/* .col:last-child:选中最后一个子元素 */
.warp .jobBox .row .col:last-child{/* 文本内容,靠右显示 */text-align: right;/* 占据比例为1,即除了最后一个col元素外,其他col占比3 */flex: 1;
}
/* 给icon容器设置背景图片 */
.warp .jobBox .jobBody .icon{/* 让行内元素span以行内形式排列,以块级形式展示  *//* 设置以后,可以给行内元素设置宽高,不然就是让内容撑高的,此处就是让padding撑开的一个图标大小的元素容器*/display: inline-block;/* 上10px,右21px */padding: 10px 21px 0 0;/* 不重复 向左移动28px,向上移动146px*/background: url("../images/banner-icon.png") no-repeat -28px -146px;
}
/* 当鼠标放在icon上面时,只改变背景图片的位置,让它显示出自己想要的一个图标 */
.warp .jobBox .jobBody .icon:hover{background-position: -81px -146px;
}
/* icon点击事件触发 :添加的类bottomIcon */
.warp .jobBox .jobBody .bottomIcon {/* 让行内元素span以行内形式排列,以块级形式展示  *//* 设置以后,可以给行内元素设置宽高,不然就是让内容撑高的,此处就是让padding撑开的一个图标大小的元素容器*/display: inline-block;/* 上10px,右21px */padding: 10px 21px 0 0;/* 不重复 向左移动2px,向上移动146px*//* .. 从此页面返回上一级 */background: url("../images/banner-icon.png") no-repeat -2px -146px;
}
/* 当鼠标放在bottomIcon上面时,只改变背景图片的位置,让它显示出自己想要的一个图标 */
.warp .jobBox .jobBody .bottomIcon:hover{background-position: -54px -146px;
}
.warp .jobBox .jobBody .rowInfo{border-bottom: 2px dotted #f5f5f5;
}
.warp .jobBox .jobBody .rowInfo .infoDetail{padding: 15px 2%;display: none;
}
.warp .jobBox .jobBody .rowInfo .infoDetail p {line-height: 36px;
}.warp .jobBox .jobBody .rowInfo .infoDetail .btn a{padding: 8px 16px;font-size: 14px;line-height: 30px;color: #fff;/* 兼容内核为webkit和moz的浏览器 */-webkit-transition: .3s;-moz-transition: .3s;/* transition-duration 属性用来设置过渡需要花费的时间(单位为秒或者毫秒)0.3s */transition: .3s;/* 没有下划线 */text-decoration: none;
}.warp .jobBox .jobBody .rowInfo .infoDetail .btn a.left{background-color: #ec6738;margin-right: 10px;
}
.warp .jobBox .jobBody .rowInfo .infoDetail .btn a.right{background-color: #4090ff;
}/* 分页 */
.pagination{width: 1100px;display: flex;justify-content: center;
}
.pageNav {margin: 0 auto;display: flex;
}.pageNav span {padding: 10px 18px;font-size: 16px;color: #999;border-radius: 3px;background-color: #fff;margin: 0 3px;cursor: pointer;
}.pageNav span.cur {color: #4090ff;
}.pageNav span:hover {color: #4090ff;
}.pageNav span.point {background: transparent;padding: 0 5px;cursor: default;
}.pageNav span.point:hover {color: #999;
}.pageNav span.point::before {content: "";display: block;height: 15%;
}.pageNav .page i {display: inline-block;padding: 14px 9px 0 0;background: url(../images/personalCenter-icons.png) -6px -1142px;
}.pageNav .page:hover i {background-position: -35px -1142px;
}.pageNav .next i {background-position: -17px -1142px;
}.pageNav .next:hover i {background-position: -48px -1142px;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/126907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

清华大模型GLM

2022年,清华大学发布了一款具有重要意义的 GLM 大模型,它不仅在中文语言处理方面取得了显著的进展,还在英文语言处理方面表现出了强大的能力。GLM大模型区别于OpenAI GPT在线大模型只能通过API方式获取在线支持的窘境,GLM大模型属于开源大模型,可以本地部署进行行业微调、…

基于Langchain+向量数据库+ChatGPT构建企业级知识库

▼最近直播超级多&#xff0c;预约保你有收获 近期直播&#xff1a;《基于 LLM 大模型的向量数据库企业级应用实践》 1— LangChain 是什么&#xff1f; 众所周知 OpenAI 的 API 无法联网的&#xff0c;所以如果只使用自己的功能实现联网搜索并给出回答、总结 PDF 文档、基于某…

主从复制(gtid方式)

基于事务的Replication&#xff0c;就是利用GTID来实现的复制 GTID&#xff08;全局事务标示符&#xff09;最初由google实现&#xff0c;在MySQL 5.6中引入.GTID在事务提交时生成&#xff0c;由UUID和事务ID组成.uuid会在第一次启动MySQL时生成&#xff0c;保存在数据目录下的…

一台服务器安装两个mysql、重置数据库用于测试使用

文章目录 一、切数据库数据存储文件夹已经存在数据库数据文件夹新建数据库数据文件夹 二、安装第二个mysql安装新数据库初始化数据库数据启动数据库关闭数据库 三、mysqld_multi单机多实例部署参考文档 一、切数据库数据存储文件夹 这个方法可以让你不用安装新的数据库&#x…

10.30寄存器,寄存器堆

寄存器 8位环形移位寄存器 module shift_regist (input wire clk,input wire rstn,input wire [7:0]D,output reg [7:0]Q ); always (posedge clk or negedge rstn) beginif(!rstn)Q<8b000000;elseQ<{D[6:0],D[7]} ; end endmodule //shift_regist 输入有时钟…

【Verilog 教程】7.3 Verilog 串行 FIR 滤波器设计

串行 FIR 滤波器设计 设计说明 设计参数不变&#xff0c;与并行 FIR 滤波器参数一致。即&#xff0c;输入频率为 7.5 MHz 和 250 KHz 的正弦波混合信号&#xff0c;经过 FIR 滤波器后&#xff0c;高频信号 7.5MHz 被滤除&#xff0c;只保留 250KMHz 的信号。 输入频率&#x…

【Linux】安装使用Nginx负载均衡,并且部署前端项目

目录 一、Nginx概述 1. 什么 2. 背景 3. 作用 二、Nginx负载均衡 1. 讲述 2. 使用 1. 下载 2. 安装 3. 负载均衡 三、前端部署 1. 准备 2. 部署 一、Nginx概述 1. 什么 Nginx是一个高性能的开源Web服务器和反向代理服务器。它具有轻量级、高并发、低内存消耗的…

一文深入了解 CPU 的型号、代际架构与微架构

在 10 月 16 号的时候&#xff0c;Intel 正式发布了第 14 代的酷睿处理器。但还有很多同学看不懂这种发布会上发布的各种 CPU 参数。借着这个时机&#xff0c;给大家深入地讲讲 CPU 的型号规则、代际架构与微架构方面的知识。 CPU 在整个计算机硬件中、技术体系中都算是最最重…

18.自监督视觉`transformer`模型DINO

文章目录 自监督视觉`transformer`模型DINO总体介绍DINO中使用的SSL和KD方法multicrop strategy损失函数定义`teacher`输出的中心化与锐化模型总体结构及应用reference欢迎访问个人网络日志🌹🌹知行空间🌹🌹 自监督视觉transformer模型DINO 总体介绍 论文:1.Emerging …

京东协议算法最新版

环境准备 1 com.jingdong.app.mall11.6.4 入口定位 逆向分析&#xff0c;发现 params 里面有一个 sign 以及请求头里面有一个 jdgs 首先我们发现京东的 sign 是 32 位的&#xff0c;猜测其可能是 md5 之类的 hash 算法&#xff0c;既然是 hash 算法&#xff0c;那么就大概率…

Test-Agent----基于Centos7系统部署Test-Agent

【Test-Agent----基于Centos7系统部署Test-Agent】 一、部署 Test-Agent 1.1 环境准备 环境基本信息&#xff1a;Centos7.9操作系统&#xff0c;16核64G1T硬盘&#xff0c;Python3.9.7 1.2 部署 Test-Agent &#xff08;1&#xff09;安装git-lfs cd /opt curl -s https:…

ORANGE室内高尔夫—韩国室内模拟高尔夫原装进口真实体验身临其境

ORANGE室内高尔夫—韩国室内模拟高尔夫 真实体验 身临其境 室内高尔夫的产品优势&#xff1a; 1. 实际高尔夫球场的限制&#xff1a;室内高尔夫可以弥补室外高尔夫球场数量有限的问题&#xff0c;使得更多人能够享受高尔夫运动。 2. 天气和季节的限制&#xff1a;室内高尔夫可…

centos7 部署 Flink

1. 准备 安装的前提是虚拟机里已安装了jdk 去官网下载 Flink 所有版本下载地址&#xff1a;https://archive.apache.org/dist/flink/ 找到下图的安装包&#xff0c;下载即可 下载完后&#xff0c;将其上传至虚拟机的某个地方&#xff0c;本人将其放在 /home/flink/ 下 解压…

【Apache Flink】Flink DataStream API的基本使用

Flink DataStream API的基本使用 文章目录 前言1. 基本使用方法2. 核心示例代码3. 完成工程代码pom.xmlWordCountExample测试验证 4. Stream 执行环境5. 参考文档 前言 Flink DataStream API主要用于处理无界和有界数据流 。 无界数据流是一个持续生成数据的数据源&#xff0…

基于MFC的串口通信(Mscomm)

1、串口通信的概述&#xff1a; 串口是一种重要的通信资源&#xff0c;例如鼠标口、USB接口都是串口。串行端口是CPU和串行设备间的编码转换器。当数据从CPU经过端口发送出去的时候&#xff0c;字节数据会被转为串行的位&#xff0c;在接收数据时&#xff0c;串行的位被转换为…

机器人仿真-gazebo学习笔记(4)xacro和传感器添加

1.xacro简介 URDF文件不具备代码复用的特性&#xff08;在上一篇文章也能发现&#xff0c;其实左右轮是极其相似的但还是要单独描述&#xff09;&#xff0c;一个复杂的机器人模型会拥有大量了的传感器和关节组件&#xff0c;这时候使用URDF文件就太难阅读了。精简化、可复用、…

学习视频剪辑:如何从指定时段快速抽出视频图片!高效技巧分享

随着数字媒体的普及&#xff0c;越来越多的人开始接触视频剪辑。在视频剪辑过程中&#xff0c;有时候我们需要从指定时段快速抽出视频图片。这不仅可以帮助我们提高剪辑效率&#xff0c;还可以让我们的视频更加丰富多彩。本文将分享一些高效技巧&#xff0c;帮助你轻松实现从指…

Vue路由(router)的安装和使用

Vue路由&#xff08;router&#xff09;的安装和使用 安装vue-router插件 第一步&#xff1a;在CMD窗口中&#xff0c;使用命令跳转到vue的安装路径下第二步&#xff1a;输入命令&#xff1a;npm i vue-router3 vue2 要安装 vue-router3 npm i vue-router3 vu3 要安装 vue-ro…

【Python微信机器人】第三篇:使用ctypes调用进程函数和读取内存结构体

目录修整 目前的系列目录(后面会根据实际情况变动): 在windows11上编译python将python注入到其他进程并运行注入Python并使用ctypes主动调用进程内的函数和读取内存结构体使用汇编引擎调用进程内的任意函数利用beaengine反汇编引擎的c接口写一个pyd库&#xff0c;用于实现inl…

Docker安装部署[8.x]版本Elasticsearch+Kibana+IK分词器

文章目录 Docker安装部署elasticsearch拉取镜像创建数据卷创建网络elasticsearch容器&#xff0c;启动&#xff01;踩坑&#xff1a;虚拟机磁盘扩容 Docker安装部署Kibana拉取镜像Kibana容器&#xff0c;启动&#xff01; 安装IK分词器安装方式一&#xff1a;直接从github上下载…