js之商城排序小案例

运用所学的知识做了一个商城排序的案例,实现了以下需求:

  1. 分别点击上架时间、价格和热度,能按照点击的类别进行相应的排序;
  2. 升序的时候,代表升序的小三角变颜色,降序的时候正好反过来。

    虽然只是个小小的案例,但是有许多问题解决,比如点击时候,排序小三角变化,当点击的三角变化时,其他没点击的小三角要恢复原来状态等等。可以说,涉及到了很多基础知识。

    当然,代码中只有结构和js代码,css和json的文件不在。虽然有点粗糙,但是还是拿出来献丑一下!!!

    如果需要全部代码和文件的,可以看下我gitHub。https://github.com/GHwangxingren/Sorting-of-goods


<div class="content">
    <div class="header">
        <span>排序</span>
        <a href="javascript:;">上架时间
            <i class="up"></i>
            <i class="down"></i>
        </a>
        <a href="javascript:;">热度
            <i class="up"></i>
            <i class="down"></i>
        </a>
        <a href="javascript:;">价格
            <i class="up"></i>
            <i class="down"></i>
        </a>
    </div>
    <ul id="list">
        <li>
            <img src="img/1.jpg" >
            <span>华为畅享7(香槟金)</span>
            <span>2018-01-01</span>
            <span>1</span>
            <span>992</span>
        </li>
    </ul>
</div>
<script>
    var list = document.getElementById("list");
    var oLi = list.getElementsByTagName("li");
    var oHeader = document.getElementsByClassName("header")[0];
    var oLinks = oHeader.getElementsByTagName("a");

    //获取json数据
    var goodsList = null;
    var xhr = new XMLHttpRequest();//创建ajax实例
    xhr.open("get", "./json/product.json", false);//获取请求(请求方式,请求的api,设置同异步)
//监听xhr的readyState状态的change事件
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
            goodsList = xhr.responseText;
        }
    };
    xhr.send(null);
    goodsList = JSON.parse(goodsList);//将json字符转换为json对象。

    //绑定数据
    var str = "";
    for (var i = 0; i < goodsList.length; i++) {
        var goods = goodsList[i];
//es6模板字符串
        str += `<li data-price="${goods.price}" data-hot="${goods.hot}" data-time="${goods.time}">
                <img src="${goods.img}" >
                <span>${goods.title}</span>
                <span>上架时间:${goods.time}</span>
                <span>热度:${goods.hot}</span>
                <span>价格:¥${goods.price}</span>
                </li>`
    }
    list.innerHTML = str;

    //绑定点击事件
    for (var i = 0; i < oLinks.length; i++) {
        oLinks[i].index = i;
        oLinks[i].flag = -1;
        oLinks[i].onclick = function () {
            for (var k = 0; k < oLinks.length; k++) {
                if (oLinks[k]!==this){
                    oLinks[k].flag=-1;  // 恢复标志的默认-1
                }
            }
            var oIs1 = oHeader.getElementsByTagName("i");
            for (var j = 0; j < oIs1.length; j++) {
                oIs1[j].classList.remove("bg")
            }
            var oIs = this.getElementsByTagName("i");
            if (this.flag == -1) {
                oIs[0].classList.add("bg");
                oIs[1].classList.remove("bg");
            } else {
                oIs[1].classList.add("bg");
                oIs[0].classList.remove("bg");
            }

            this.flag *= -1;
            mySort.call(this);
        }
    }

    //排序
    function mySort() {
        var newLi = [].slice.call(oLi);// 获取完不是一个数组,需要转换成数组,然后在排序
        var flag = this.flag;
        var index = this.index;
        newLi.sort(function (a, b) {
            var aTtr, bTtr;
            if (index == 0) {
                aTtr = a.getAttribute("data-time").replace(/-/g, "");
                bTtr = b.getAttribute("data-time").replace(/-/g, "");
            } else if (index == 1) {
                aTtr = a.getAttribute("data-hot");
                bTtr = b.getAttribute("data-hot");
            } else {
                aTtr = a.getAttribute("data-price");
                bTtr = b.getAttribute("data-price");
            }
            return (aTtr - bTtr) * flag;
        });
        for (var i = 0; i < newLi.length; i++) {
            list.appendChild(newLi[i]);
        }
    }

</script>

原文地址:https://www.cnblogs.com/wangxingren/p/10225912.html

时间: 2024-10-27 19:13:25

js之商城排序小案例的相关文章

js学习总结----经典小案例之表格排序

具体代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style type="text/css"> *{margin:0;padding:0;font-family:"微软雅黑";font-size:14px

js学习总结----经典小案例之选项卡

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> body,div,ul,li{ margin:0; padding: 0; font-family: Arial; font-size:12px; } ul li{ list-style:none

JS实现拖拽小案例

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>简单的拖拽</title> <link rel="stylesheet" href="../toolkit/reset.min.css"> <style> #box{ height: 200px

JS小案例分析

a.微博输入删除小案例 <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title></title> <style> * { margin: 0; padding: 0; } ul { list-style: none; } .box { width: 600px; margin: 100px auto; b

node.js(小案例)_实现学生信息增删改

一.前言 本节内容主要对小案例做一个总结: 1.如何开始搭建小项目 2.路由设计 3.模块应用 4.项目源码以及实现过程github地址: 项目演示如下: 二.主要内容 1.项目的关键性js源码: 项目的入口: /** * app.js 入门模块 * 职责: * 创建服务 * 做一些服务相关配置 * 模板引擎 * body-parser 解析表单 post 请求体 * 提供静态资源服务 * 挂载路由 * 监听端口启动服务 */ var express = require('express') v

小案例带你揭秘JS事件

小案例带你揭秘JS事件 ### 什么是事件? 在js中一个事件的组成由那些呢? 谁触发事件:事件源 触发什么事件: 事件的类型 触发事件干什么事:事件处理函数 事件传播的过程 捕获阶段 就是从window事件处理函数开始,依次向内,只要事件目标的事件处理函数都会执行 执行顺序是从上到下的函数执行顺序 目标阶段 你触发在哪个元素上那么这个事件的目标源就是谁 冒泡阶段 从事件目标的时间处理函数开始,依次向外,知道window的事件处理函数触发 执行顺序是从内到外的 事件委托 就是我们把要做的事情委托

JS高级---闭包小案例

闭包小案例 普通的函数 //普通的函数 function f1() { var num = 10; num++; return num; } console.log(f1()); //11 console.log(f1()); //11 console.log(f1()); //11 函数模式的闭包 //函数模式的闭包 function f2() { var num = 10; return function () { num++; return num; } } var ff = f2();

关于js数组的一道小考题

网上看到的一道关于js数组的小考题,借此学习练习一下,也是拿来作为博客开篇之作吧! 题目如下: 给定一个随机数组,数组可能包含数组(也就是说数组元素可能为数组).要求用js实现一个函数,返回该数组中所有元素,重复的要求去掉.例如:数组[2,3,[4,6,[3,8]],12,10],返回结果为:[2,3,4,6,8,12,10]. 我的答案如下:(额外增加了排序) 1 var arr = [2,3,[4,6,[3,8,[15,16,[17,18,[1,2,3,[19,20]]]]],[13,14]

Thinkphp 生成订单号小案例

Thinkphp 生成订单号小案例小伙伴们在日常的商城项目开发中,都会遇到订单号生成的问题,今天呢思梦PHP就带领大家去解读一下生成订单号的问题!首先,订单号我们要明确它有有3个性质:1.唯一性 2.不可推测性 3.效率性,唯一性和不可推测性不用说了,效率性是指不能频繁的去数据库查询以避免重复.况且满足这些条件的同时订单号还要足够的短.不知道小伙伴们在日常的项目中是否也和我一样去思考过生成订单的一些小问题,可能你也会说,这些东西不用想的那么复杂,其实呢,小编也是同意大家的看法,但是殊不知我们做程