js高级(2)函数的柯里化,cookie的使用,10天免登录案例,购物车案例,拖动盒子小案例等等

news2024/11/18 0:33:33

1.函数的柯里化

  1. 自定义函数的柯里化

      // 自定义函数的柯里化
            function curry(fn) {
                //判断输入的函数有几个参数
                let len = fn.length;
                // 返回一个函数,并且有函数名为t
                return function t() {
                    // 获取到实参的个数
                    let innerLength = arguments.length
                    // 获取到真实参数,转化为数组[...]Array.from
                    let innerArr = Array.prototype.slice.call(arguments)
                    // 如果实参大于或等于fn的参数,执行fn
                    if (innerLength >= len) {//临界点,就不在自己调自己
                        // 直接运行最早传入的fn函数
                        return fn.apply(undefined, innerArr)
                    } else {
                        // 小于,自己调用自己,递归
                        return function () {
                            let innerArg = Array.prototype.slice.call(arguments)
                            let all = innerArr.concat(innerArg)
                            return t.apply(undefined, all)
                        }
                    }
                }
    
            }
            function add(a, b, c, d) {
                return a + b + c + d
            }
            let res1 = curry(add)
            console.log(res1(10)(20, 30, 40));
    
  2. lodash定义函数的柯里化

记得引入js 
function ajax(a, b) {
            return a + b
        }
        // 传入一个ajax函数,返回一个ajax函数
        var result = _.curry(ajax)
        // result相当于ajax,f相当于匿名函数
        var f = result("http://www.baidu.com")
        // console.log(f);
        // 给匿名函数传入参数,并返回拼接完后的内容
        console.log(f("/login"));
        console.log(f("/reg"));

2.cookie

1.概念:浏览器的本地存储技术

2.http:80 https:443

3.特点:

  1. 简单
  2. 灵活
  3. 无状态(对事物没有记忆能力) 断开式

4.为什么要有cookie?使用的场景?

因为 http 协议是无状态 (对事物没有记忆能力),为了解决这个问题,
            服务器就会生成sessionId(一串字符串),通过http协议响应给浏览器
            浏览器就需要存储,就存储在cookie,存储方式 key-value对象
            cookie有个最大的特点,会随着请求携带到服务器(cookie为钱包)

5.cookie的特性?

  1. 基于http协议,解决http无状态
  2. 会随着请求携带cookie到服务器
  3. 存储大小为4k左右的’字符串’
  4. 不是真正永久存储,能设置失效时间
  5. 不安全,容易被伪造,key-value对象模式

3.cookie的使用

  1. 添加

    document.cookie="age=22"
    document.cookie="sex=男"
    
  2. 修改(就跟添加差不多)

      // 设置失效时间
                var date = new Date()
                date.setDate(date.getDate() + 10)
                document.cookie = "age=20;expires=" + date.toUTCString()
                document.cookie = "sex=男"
    
  3. 查看

            // 多条数据用"; "分号+空格隔开
    var str=document.cookie
    console.log(str)
    
  4. 删除

     // 获取昨天的时间,已达到删除数据
                var data = new Date()
                data.setDate(data.getDate() - 1
                // toUTCString 东八区
                document.cookie = "age=20;expires=" + data.toUTCString()
    

4.js-cookie的使用

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/js-cookie/3.0.5/js.cookie.js"></script>
</head>

<body>
    <button>添加</button>
    <button>修改</button>
    <button>查看</button>
    <button>删除</button>
    <script>
        var btn = document.querySelectorAll("button")
        // 添加
        btn[0].onclick = function () {
            var list = [
                { id: 1, name: "小易1" },
                { id: 2, name: "小易2" },
                { id: 3, name: "小易3" }
            ]
            Cookies.set("users", JSON.stringify(list))
        }
        // 修改
        btn[1].onclick = function () {
            // 1.先获取
            var str = Cookies.get("users")
            // 2.转换为数组
            var oList = JSON.parse(str || '[]')
            // 3.根据下标修改值
            oList[1].name = "廖四"
            // 4.覆盖,保存7天
            Cookies.set("users", JSON.stringify(oList), {
                expires: 7
            })
        }
        // 查看
        btn[2].onclick = function () {
            var str = Cookies.get("users")
            console.log(str);
        }
        // 删除
        btn[3].onclick = function () {
            Cookies.remove("users")
        }
    </script>
</body>

</html>

5.小案例

  1. 10天内免登录

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script src="https://cdn.bootcdn.net/ajax/libs/js-cookie/3.0.5/js.cookie.js"></script>
        <style>
            form {
                width: 300px;
                height: 300px;
                border: 1px solid #000;
                /* margin: 200px ; */
                padding-left: 20px;
            }
        </style>
    </head>
    
    <body>
        <form action="get">
            账号:<input type="text" name="username"><br><br>
            密码:<input type="password" name="password"><br><br>
            <input type="checkbox" name="cbx">十天内免登录<br><br>
            <button type="submit">确定</button>
        </form>
        <script>
            var form = document.querySelector("form")
            form.onsubmit = function () {
                // 准备要保存的数据
                const oUser = {
                    user: this.username.value,
                    pwd: this.password.value
                }
                // 判断是否打了勾
                if (this.cbx.checked) {
                    Cookies.set("userInfo", JSON.stringify(oUser))
                }
                return false//阻止默认行为
            }
            // 页面加载 onload 
            window.addEventListener("DOMContentLoaded", () => {
                // 1.读取本地数据
                const oUser = JSON.parse(Cookies.get("userInfo") || '{}')
                if (oUser.user) {
                    form.username.value = oUser.user
                }
                if (oUser.pwd) {
                    form.password.value = oUser.pwd
                }
                form.cbx.checked = oUser.user && oUser.pwd
            })
        </script>
    </body>
    
    </html>
    
  2. 记录图片位置:
    页面上有一个红色div, 可以对该div实现拖拽, 每次拖拽后需要保存位置
    下次重新进入该页面时, 该红色div还是在最后一次拖拽松开时的位置
    在这里插入图片描述

    <!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>
            .box {
                width: 100px;
                height: 100px;
                background-color: pink;
                position: absolute;
            }
        </style>
        <script src="https://cdn.bootcdn.net/ajax/libs/js-cookie/3.0.5/js.cookie.js"></script>
    </head>
    
    <body>
        <div class="box"></div>
        <script>
            var box = document.querySelector(".box")
            // 给盒子绑定鼠标按下事件
            box.onmousedown = function (e) {
                // 获取拖动的点到盒子起始点的位置
                var disX = e.pageX - this.offsetLeft
                var disY = e.pageY - this.offsetTop;
                // 在按下鼠标的同时,拖动盒子,绑定鼠标移动事件
                document.onmousemove = function (e) {
                    box.style.left = e.pageX - disX + "px"
                    box.style.top = e.pageY - disY + "px"
                    box.innerHTML = "top:" + box.style.top + "<br>left:" + box.style.left
                    var move = {
                        left: box.style.left,
                        top: box.style.top
                    }
                    Cookies.set("wz", JSON.stringify(move))
                }
                // 鼠标松开不移动 清空绑定的移动事件
                // 文档的任何位置松开
                document.onmouseup = function (e) {
                    box.onmouseup = document.onmousemove = null
                }
    
            }
            // 页面一加载,获取最后一次的位置
            window.addEventListener("DOMContentLoaded", () => {
                // 读取本地数据
                const oMove = JSON.parse(Cookies.get("wz"))
                if (oMove) {
                    box.style.left = oMove.left
                    box.style.top = oMove.top
                    box.innerHTML = "top:" + box.style.top + "<br>left:" + box.style.left
                }
    
            })
    
    
    
    
        </script>
    </body>
    
    </html>
    

    3.使用cookie实现购物车功能:
    有以下商品, 点击加入购物车即可加入到购物车中(cookie中保存),
    点击查看购物车, 进入另一个页面, 并显示之前加入购物车的商品.
    在这里插入图片描述

列表页

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/js-cookie/3.0.5/js.cookie.js"></script>
</head>

<body>
    <ul></ul>
    <a href="./购物车页面.html">去购物车</a>
    <script>
        // 1.获取元素
        var ul = document.querySelector("ul")
        // 2.准备模拟数据
        var oGoodList = [
            { id: 1, name: "单车", price: "100" },
            { id: 2, name: "摩托", price: "1000" },
            { id: 3, name: "汽车", price: "10000" },
            { id: 4, name: "坦克", price: "100000" },
            { id: 5, name: "飞机", price: "1000000" },
            { id: 6, name: "飞船", price: "10000000" },
        ]
        // 3.封装一个渲染的函数
        const render = (arr) => {
            return arr.reduce((pre, cur) => {
                return pre += `
                    <li>id:${cur.id} 名称:${cur.name} 单价:${cur.price} '
                        <a href="javaScript:void(0)" class="add" data-id=${cur.id}>加入购物车</a>
                        </li>
                `
            }, "")
        }
        // 4.渲染到页面上
        ul.innerHTML = render(oGoodList)
        // 5.事件委托,点击加入购物车
        ul.addEventListener("click", (e) => {
            // 不是A,就返回不执行下面代码
            if (!(e.target.nodeName == "A" && e.target.className == "add")) {
                return
            }
            // 获取本地数据
            let oCarts = JSON.parse(Cookies.get("cars") || '[]')
            // 获取藏的值
            let id = e.target.getAttribute("data-id")
            // 拿着藏的值id去模拟数据进行比较,返回一条完整的数据
            var items = oGoodList.find((item) => {
                return item.id == id
            })
            // 设置一个开关,默认是没有添加
            let isAdd = true
            // 循环本地数据
            for (let i = 0; i < oCarts.length; i++) {
                // 如果本地数据的id,等于我点击的id,就表示我已经添加过了,修改状态
                if (oCarts[i].id == id) {
                    isAdd = false
                    // 再把数据进行加1
                    oCarts[i].num = Number(oCarts[i].num) + 1
                    // 再退出
                    break
                }
            }
            // 如果本地数据没有,就进行添加'
            if (isAdd) {
                // 把返回完整的一条数据添加到本地,并且把数量设置为1
                items.num = 1
                // 添加到本地
                oCarts.push(items)
            }
            // 覆盖原来的数据
            Cookies.set("cart",JSON.stringify(oCarts))
            alert("添加成功")
        })
    </script>
</body>

</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>
        table,
        tr,
        th,td,
        tbody {
            border: 1px solid #000;
        }

        table {
            width: 500px;
            border-spacing: 0px;
            border-collapse: 1px;
            text-align: center;
        }
    </style>
    <script src="https://cdn.bootcdn.net/ajax/libs/js-cookie/3.0.5/js.cookie.js"></script>
</head>

<body>
    <h1>购物车</h1>
    <a href="./列表页.html">返回列表页</a>
    <table>
        <thead>
            <tr>
                <th>id</th>
                <th>名称</th>
                <th>价格</th>
                <th>数量</th>
                <th>金额</th>
            </tr>
        </thead>
        <tbody></tbody>
    </table>
    <script>
        var tbody = document.querySelector("tbody")
        // 定义一个渲染的方法
        const render = function (arr) {
            return arr.reduce((pre, cur) => {
                return pre += `
                <tr>
                    <td>${cur.id}</td>
                    <td>${cur.name}</td>
                    <td>${cur.price}</td>
                    <td>${cur.num}</td>
                    <td>${cur.price * cur.num}</td>
                    </tr>
                `
            }, "")
        }
        // 2.获取本地数据进行渲染
        let oList = JSON.parse(Cookies.get("cart") || "[]")
        tbody.innerHTML=render(oList)
    </script>
</body>

</html>

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

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

相关文章

FPGA---UDP通信求助

项目场景&#xff1a; 使用UDP进行回环&#xff0c;网络调试助手&#xff0c;发送数据通过UDP接收模块接收&#xff0c;解析出数据&#xff0c;给到UDP发送模块&#xff0c;传回上位机。 问题描述 UDP接收模块中&#xff0c;接收到的CRC校验值与自己计算CRC校验值进行判断&am…

【电商API接口的应用:电商数据分析入门】初识Web API(一)

如何使用Web应用变成接口(API)自动请求网站到特定信息而不是整个网站&#xff0c;再对这些信息进行可视化。由于这样编写到程序始终使用最新到数据来生成可视化&#xff0c;因此即便数据瞬息万变&#xff0c;它呈现到信息也都是最新的。 使用Web API Web API是网站的一部分&am…

javapoet 注释中添加枚举值

问题描述 使用javapoet生成源代码 为了实现这么一个目的 解决 翻了一下源代码&#xff0c;他的实现如下&#xff1a; 这个方法是私有的&#xff0c;暂时不确定如何调用 照着这个方法&#xff0c;即可实现大多数类型的基本调用 即可实现上图需要的效果

为Yolov7环境安装Cuba匹配的Pytorch

1. 查看Cuba版本 方法一 nvidia-smi 找到CUDA Version 方法二 Nvidia Control Panel > 系统信息 > 组件 > 2. 安装Cuba匹配版本的PyTorch https://pytorch.org/get-started/locally/这里使用conda安装 conda install pytorch torchvision torchaudio pytorch-cu…

[华为认证]路由表和FIB表

路由器转发数据包的关键是路由表和FIB表&#xff0c;每个路由器都至少保存着一张路由表和一张FIB&#xff08;Forwarding Information Base&#xff09;表。路由器通过路由表选择路由&#xff0c;通过FIB表指导报文进行转发。 路由表 每台路由器中都保存着一张本地核心路由表&…

Java学数据结构(4)——PriorityQueue(优先队列) 二叉堆(binary heap)

前言 数据结构与算法作为计算机科学的基础&#xff0c;是一个重点和难点&#xff0c;在实际编程中似乎看不它们的身影&#xff0c;但是它们有随处不在&#xff0c;如影随形。 本系列博客是《数据结构与算法分析—Java语言描述》的读书笔记&#xff0c;合集文章列表如下&#…

delphi socket cross开源跨平台通讯库

delphi socket cross是Pascal开源跨平台的tcp通讯组件 windows下用的iocp linux下用的epoll 支持http&#xff0c;https 开源地址&#xff1a;GitHub - winddriver/Delphi-Cross-Socket: Delphi cross platform socket library 下图来自网络&#xff1a;

陪诊系统|陪诊系统解放繁琐,为陪诊添便利

在当代快节奏的生活中&#xff0c;随着医疗服务的不断发展&#xff0c;陪诊成为了越来越多人的需求。然而&#xff0c;传统的陪诊方式却存在着时间成本高、沟通不畅、服务体验差等问题。但近年来&#xff0c;陪诊小程序的兴起却为这一难题提供了创新的解决方案。 陪诊小程序&a…

Congestion Control for Large-Scale RDMA Deployments

文章目录 IntroductionDCQCNBuffer Setting Introduction PFC是粗粒度的流量控制机制&#xff0c;在端口层面发挥作用&#xff0c;不区别不同的流。这会导致很多弊端&#xff0c;比如不公平&#xff0c;受害流等。 解决PFC限制的解决方法是flow-level的拥塞控制&#xff0c;D…

拥抱AI变革,实现企业数字化重生!

在当今这个数字化快速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;正在逐渐成为企业转型的核心驱动力。本文将探讨AI如何在企业数字化转型中发挥重要作用&#xff0c;以及应对数字化转型中可能出现的风险和挑战。 目前&#xff0c;企业数字化转型的趋势日益明显…

如何更改照片底色(免费)

一、小程序截图 ①微信上找证件照的小程序&#xff0c;比如“独九证件照” ②换底色然后上传照片&#xff1a; ③ 原图&#xff1a; 换底色后的图&#xff1a; ④截图&#xff1a; ⑤裁剪 然后就得到免费的换底片后的证件照了。 二、PS修改 方法一&#xff08;更建议用&…

VueRouter与expres/koa中间件的关联

ueRouter: runQueue 路由守卫都是有三个参数to,from,next。其中next就是下方的fn执行时候传入的第二个参数(回调函数)&#xff0c;只有该回调执行后才会挨个遍历queue内的守卫。 中间件的作用 隔离基础设施与业务逻辑之间的细节。详细的内容位于《深入浅出Node.js》P210 另外一…

408-2014

一、单项选择题 1.下列程序段的时间复杂度是_______。 count0; for(k1;k<n;kk*2)for(j1;j<n;j)count; A.O() B.O(n) C.O() D.O(n*n) 解答&#xff1a;C 外层循环的时间复杂度为 O() &#xff0c;内层循环的时间复杂度为 O(n)&#xff0c;因此结果…

Matlab图像处理——基于机器视觉的苹果中心花及边花识别

一、简介 基于机器视觉技术&#xff0c;实现苹果中心花及边花识别&#xff0c;并将程序集合为GUI界面&#xff0c;在界面上完成相应的操作。实现了对图像进行预处理&#xff0c;分割出花心和边花&#xff0c;然后统计边花的数量。并且可以根据自己的需求和图像的特性来调整阈值…

idea中使用git【图文详解】

配置 配置Git 设置——Version Control——Git——Path to Git executab【D:\Git\Git\bin\git.exe】 创建Git查看 最上面VCS——Create Git Repository 添加忽略项 安装ignore插件&#xff1a;设置——plugins——搜索ignore 新建ignore文件&#xff1a;右击项目——new——.…

Hazelcast系列(三):hazelcast集成(服务器/客户端)

系列文章 Hazelcast系列(一)&#xff1a;初识hazelcast Hazelcast系列(二)&#xff1a;hazelcast集成&#xff08;嵌入式&#xff09; Hazelcast系列(三)&#xff1a;hazelcast集成&#xff08;服务器/客户端&#xff09; Hazelcast系列(四)&#xff1a;hazelcast管理中心 …

紫光同创FPGA 多路视频处理:图像缩放+视频拼接显示,OV7725采集,提供PDS工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐FPGA图像缩放方案推荐FPGA视频拼接叠加融合方案推荐紫光同创FPGA图像采集方案推荐紫光同创FPGA图像缩放方案推荐紫光同创FPGA视频拼接方案推荐 3、设计思路框架为什么选择OV7725摄像头&#xff1f;视频源选择OV7725摄像头配置及采集动态彩…

JUC学习笔记

基础知识 线程 线程是进程中的一个实体&#xff0c;线程本身是不会独立存在的。一个进程中至少有一个线程&#xff0c;进程中的多个线程共享进程的资源。 进程 是程序的一次执行&#xff0c;是系统进行资源分配和调度的基本单位。每一个进程都有自己独立的内存空间和系统资…

2023年下半年WSK-PETS5报名启动

2023年下半年全国外语水平考试&#xff08;WSK-PETS5&#xff09;网上报名时间为10月17日9时-10月19日16时&#xff0c;知识人网小编特别提醒考生注意报名截止时间是16点&#xff08;下午4点&#xff09;&#xff0c;切勿错过&#xff01; 国家公派留学人员全国外语水平考试&am…

2023年【陕西省安全员B证】考试试卷及陕西省安全员B证模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 陕西省安全员B证考试试卷是安全生产模拟考试一点通总题库中生成的一套陕西省安全员B证模拟考试&#xff0c;安全生产模拟考试一点通上陕西省安全员B证作业手机同步练习。2023年【陕西省安全员B证】考试试卷及陕西省安…