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 两个时间控件。完整代码如下:

     

    不积跬步无以至千里
  • 相关阅读:
    【华为云技术分享】ArcFace简介
    [学]PHP爬虫框架phpspider
    zend studio 自动注释、备注和常用有用快捷键
    mysql 为什么加了排序字段后不会自动按ID升序排序?
    【PHP转义字符】单引号双引号以及转义字符【原创】
    Javascript小结(四)----包装对象
    JavaScript小结(三)----字符串操作
    JavaScript小结(二)-----Date()函数
    Javascript小结(一)----prototype对象
    PHP底层原理分析和底层扩展编写
  • 原文地址:https://www.cnblogs.com/lyt0207/p/12322574.html
Copyright © 2011-2022 走看看