zoukankan      html  css  js  c++  java
  • localStorage实现按钮点击禁用

    HTML5 提供了两种在客户端存储数据的新方法:

    1.localStorage - 没有时间限制的数据存储
    2.sessionStorage - 针对一个 session 的数据存储
    之前,这些都是由 cookie 完成的。但是 cookie 不适合大量数据的存储,因为它们由每个对服务器的请求来传递,这使得 cookie 速度很慢而且效率也不高。而关于他们三者之间的相同和区别这边就不详述了。

    突然说起localStorage是有原因的,上周接到项目有一个需求就是按钮被点击一次后禁用,想了想localStorage出来这么久了还没玩过,就用起来吧,也当试验下,做了个小demo

    HTML

    <input data-num="" class="clickMe" type="button" value="点我">
    
    <input data-num="" class="clickMe" type="button" value="点我">
    
    <input data-num="" class="clickMe" type="button" value="点我">
    

    JS

    (function(){
        function Disabled(){
            var dataNum=[];
            for(var i = 0, len = clickMe.length; i < len; i++){
                //保存自定义属性的值
                dataNum[i] = clickMe[i].dataset.num == 0? 0: 1;
            }
            
            if(window.localStorage){
                //存
                localStorage.setItem("num",dataNum);
            }
            
        }
        var clickMe=document.querySelectorAll(".clickMe");
        
        for(var i = 0, len = clickMe.length; i < len; i++){
            //预设自定义属性的值
            clickMe[i].dataset.num=0;
            clickMe[i].addEventListener("click", function(e){ 
                //监听click事件,改变自定义属性的值、dom状态
                this.dataset.num=1;
                this.setAttribute("disabled","true");
                //实时存储
                Disabled();
            }, false)
        }
        //取
        var strStoreData = localStorage.getItem("num");
        if (strStoreData) {
            //遍历数组
            strStoreData.split(",").forEach(function(item, index,array) {
                if (item == 1) {
                    //根据自定义属性值执行click实现本地存储循环实现效果
                    clickMe[index].click();
                }
            }); 
        }
    })()
    
    (function(){        
        var clickMe=document.querySelectorAll(".clickMe");
        for(var i = 0, len = clickMe.length; i < len; i++){
           clickMe[i].addEventListener("click", (function(index){                    
                return  function(){                
                    this.setAttribute("disabled","true");
                    localStorage.setItem("disabled"+index,true);
                }
            })(i),false);
            if(localStorage.getItem("disabled"+i)!=null){
                 clickMe[i].setAttribute("disabled",localStorage.getItem("disabled"+i));
            } 
        };            
    })()
    

    上面两段都JS代码都能实现功能,第一段有了一种封装,更易于扩展,第二段只实现了最基本的功能,不过第二种写法得注意for循环中的闭包,说到底localStorage就是个存和取,更多高端玩法需要我们自己去探究。

  • 相关阅读:
    [loj6039]「雅礼集训 2017 Day5」珠宝 dp+决策单调性+分治
    [loj6038]「雅礼集训 2017 Day5」远行 lct+并查集
    [BZOJ4945][Noi2017]游戏 2-sat
    [BZOJ4942][Noi2017]整数 线段树+压位
    [BZOJ3672][Noi2014]购票 斜率优化+点分治+cdq分治
    12.17模拟赛
    [BZOJ3150][Ctsc2013]猴子 期望dp+高斯消元
    杜教筛
    Swagger展示枚举类型参数
    spring boot 如何映射json格式请求中的枚举值
  • 原文地址:https://www.cnblogs.com/web-lexi/p/4835791.html
Copyright © 2011-2022 走看看