zoukankan      html  css  js  c++  java
  • 事件委托与绑定问题

    问题描述:前端动态生成的按钮元素,通过js方式委托事件,在通过ajax向后端请求数据,会造成程序的重复执行。

    好像是比较简单,但是没经历过的,可能还是不知所云。那就从事件绑定开始说起:

    这里说到的两种事件绑定分别是这样婶儿的:

    js方式的事件委托:

    document.querySelector(".popUp_ok").addEventListener('click', function(e) {
       console.log("原生事件委托"); 
    })

    jquery方式绑定:

    $(".popUp_ok").on('click', function(e) {
        console.log("jquery事件绑定");
    })

    然后上一段碰到问题的代码:

    document.querySelector(".popUp_ok").addEventListener("click", function(e) {  
           ...
                $.ajax({
                    type: "POST",
                    url: ...,
                    data: {...},               
                    dataType: 'json',            
                    cache: false,
                    success: function (data, textStatus) {
                        if (!data.error) {
                            ...       
                        }
                    },
                    error: function () {}
    })

    这里的过程是:点击按钮之后,触发委托的事件,ajax获取数据成功后,就会局部刷新页面的内容。

    当第一次操作时,没什么问题,但是当第二次刷新的时候,同样会将之前的过程执行一趟,而且会将之前已经局部刷新的数据,再一次修改成另外一个数据,第三次,同样会把之前两次修改过的数据,再修改成其他的数据,...以此类推。很明显有问题!

    最后,经过一番折腾,发现:这样的操作,会给每一个同样className的元素,创建一个委托事件队列(如下图);

    所以就想到了每一次操作完成之后,给元素解绑。但是,在js原生方法中,remove委托事件,不起作用,最后就换成了jquery中的办法:前面不用委托事件,直接给元素绑定事件,页面局部刷新之后,解绑,搞定!(非前端人员,不求甚解,欢迎指点)

    正确做法:

    $(".popUp_ok").on('click', function(e) {
                ...
    
                $.ajax({
                    type: "POST",
                    url: ...,
                    data: {...},               
                    dataType: 'json',            
                    cache: false,
                    success: function (data, textStatus) {
                        if (!data.error) {
                            ...
                            //以上步骤执行完成之后,将事件解绑
                            $(".popUp_ok").off('click');         
                        }
                    },
                    error: function () {}
                });
            });                
  • 相关阅读:
    UML和序列图
    MVC超链接
    《Flink SQL任务自动生成与提交》后续:修改flink源码实现kafka connector BatchMode
    分布式条件下Integer大小比值的问题
    distribute by在spark中的一些应用
    桌面秀
    结构体sizeof的问题
    Android开发:View中调用自定义dialog出现的异常
    获取Android的源码
    【原创】VS2010中水晶报表与VS2008水晶报表版本冲突问题
  • 原文地址:https://www.cnblogs.com/Archie2018/p/13673069.html
Copyright © 2011-2022 走看看