zoukankan      html  css  js  c++  java
  • addEventListenerbang多层嵌套,多次执行的问题

    https://www.jianshu.com/p/682870264f69

    问题:

    解决办法

    1:闭包

    var longtimefunc = function () {
        longtime()
    }
    var choosetimefunc = function () {
        choosetime()
    }
    //有效日期
    function longtime(){
        mui(".yxData input")[0].value = '长期有效';
        mui('#timepopover').popover('hide');
        mui('#jnpopover').popover('show');
    }
    function choosetime(){
        var picker = new mui.DtPicker({
            type:'date',
            beginYear:1900
        });
        picker.show(function(rs) {
            mui(".yxData input")[0].value = rs.text;
            picker.dispose(); //销毁时间控件
        });
        mui('#timepopover').popover('hide');
        mui('#jnpopover').popover('show');
    }
    
    $.query(".longtime").addEventListener('tap', longtime(),false)//选择长期有效
    $.query('.timedata').addEventListener('tap',  choosetime(),false)//选择具体时间

    2:事件销毁

    //有效日期
    function longtime(){
        mui(".yxData input")[0].value = '长期有效';
        mui('#timepopover').popover('hide');
        mui('#jnpopover').popover('show');
    }
    function choosetime(){
        var picker = new mui.DtPicker({
            type:'date',
            beginYear:1900
        });
        picker.show(function(rs) {
            mui(".yxData input")[0].value = rs.text;
            picker.dispose(); //销毁时间控件
        });
        mui('#timepopover').popover('hide');
        mui('#jnpopover').popover('show');
    }
    
    if(mui('.longtime')[0].longtime){
        mui('.longtime')[0].removeEventListener('tap',longtime())
    }else{
        mui('.longtime')[0].addEventListener('tap', longtime())//选择长期有效
    }
    if(mui('.timedata')[0].choosetime){
        mui('.timedata')[0].removeEventListener('tap',choosetime())
    }else{
        mui('.timedata')[0].addEventListener('tap',  choosetime())//选择具体时间
    }

    虽然这两种方法都可以解决重复调用问题,但是这样写会造成另一个问题,就是立即调用,都没等我第二层弹出框弹出就弹出了时间控件,这并不是我想要的效果,所以最终改写成如下:

    var longterm
    var timedata
    mui(".yxData .img")[0].addEventListener('click',function (){
        mui('#timepopover').popover('show'); //第二层弹出框
        mui(".longtime")[0].addEventListener('tap', function longtime (){
            console.log('长期有效')
            mui(".yxData input")[0].value = '长期有效';
            mui(".longtime")[0].removeEventListener('tap',longtime) //销毁事件
            mui('#timepopover').popover('hide');
            mui('#jnpopover').popover('show');
        },false)
        
        //选择具体时间
        mui('.timedata')[0].addEventListener('tap', function timechoose (){
            var picker = new mui.DtPicker({
                type:'date',
                beginYear:1900
            });
            picker.show(function(rs) {
                mui(".yxData input")[0].value = rs.text;
                timedata = rs.text
            });
            mui('.timedata')[0].removeEventListener('tap', timechoose) //销毁事件
            mui('#timepopover').popover('hide');
            mui('#jnpopover').popover('show');
        },false)
    },false);

    但是这样写还是有问题,当我第一次选择了长期有效之后,我要想改成具体时间,在不刷新页面的情况下就会弹出两个时间控件,打断点看了一下发现有问题:

     

    在我点击了有效时间后弹出了这个选择框,同时外层点击事件包含了长期有效事件和选择具体时间,所以不管我是否点击了这两个选项都会给这两个选项绑定事件,但是第一次若是我选了长期有效事件,那么具体时间事件的绑定并不会释放,因为代码不会执行到里面销毁事件的代码,所以当我第二次点击了具体时间事件,就会执行两次代码,弹出两个时间控件,我的解决办法是把new picker的那个代码放到这个事件的外面,那样就不会再执行两次的情况下new 两个时间控件。完整代码如下:

     

    不积跬步无以至千里
  • 相关阅读:
    LVS负载均衡原理详解和使用
    Linux---RPM和YUM
    【Codeforces】CF Round #676 (Div. 2)
    莫队学习笔记
    AtCoder Beginner Contest 187 题解
    【CodeForces】 Educational Codeforces Round 94
    【CodeForces】CF Round 649 (Div.2)
    【CodeForces】CF Round 648 (Div.2)
    【AtCoder】ABC 169
    【题解 LOJ2546「JSOI2018」潜入行动】
  • 原文地址:https://www.cnblogs.com/lyt0207/p/12322574.html
Copyright © 2011-2022 走看看