实现效果
- 根据上架时间/热度/价格进行升序/降序排序
- 上箭头亮代表升序,下箭头亮代表降序
渲染 li 标签
- 获取 ul 以便让每一个 li 渲染到页面
1 | var lists = document.querySelector(".lists"); |
把每一个 li 渲染到页面上
这里为了操作方便,给每一个 li 绑定自定义属性,之后根据属性值获取其中内容
li.getAttribute(...)
即可如果不这样做,则需要通过
li.querySelector(...).innerText
获取注意:
querySelectorAll
获取到的是类数组,因为需要进行排序,使用数组的 sort() 方法,所以需要用[].slice.call()
或Array.from
转换成数组
1 | function Init(data) { |
点击 a 标签进行排序
- 获取 a 标签
1 | var links = document.querySelectorAll(".top a"); |
给 a 标签添加鼠标点击事件
为实现每次排序都是上一次的倒序,需要给每一个 a 标签添加一个自定义属性作为标志
links[i].flag = -1
,flag 值为1代表升序,每次点击事件只需 flag 取反即可this.flag *= -1
注意: sort() 方法中回调函数 this 指向 window,所以需要用一个变量存储 this
let that = this;
1 | for (let i = 0; i < links.length; i++) { |
点击 a 标签点亮排序箭头
- 升/降序高亮对应箭头字体图标
1 | let arrows = this.querySelectorAll("b"); |
优化
- for 每进行一次循环都会引起浏览器的回流,非常耗性能
1 | for (let i = 0; i < lis.length; i++) { |
可以使用
DocumentFragment
来创建一个新的空白的文档片段,把元素附加到这个文档片段中,之后通过这个文档片段附加到 DOM 树因为文档片段存在内存中,并不在 DOM 树中,所以将子元素插入到文档片段时不会引起页面回流。因此,使用文档片段会带来更好的性能
1 | let frg = document.createDocumentFragment(); |
- 如果希望点击完当前a标签,再点击其他a标签时都是升序排列的话,需要每次都将其他标签的flag设置为 -1
1 | for (let i = 0; i < links.length; i++) { |
完整代码
index.html(html+css)
- 创建
index.html
文件,粘贴如下代码
1 |
|
data.json
- 这里需要用 Ajax 请求一下如下 json 数据
- 创建
data.json
,粘贴如下数据
1 | [ |
index.js
1 | // 获取页面元素 |