• JQuery——动态添加元素导致点击事件失效


    前言

    因为博皮当前版本有人反馈文章中标题导航点击无法生成;

    jquery-click-invalid: https://codesandbox.io/s/jquery-click-invalid-forked-xpt352

    内容

    • 一开始我以为是svg导致的点击事件失效,但是看来下代码结构,发现两者并不关联;
    • 开始觉得问题应该出现在.html()方法上,因为文章这块在博皮上是没做什么调整的,所以直接看博客园的blog-common.min.js;
    • 通过显示目录导航关键字进行搜索,就发现了关键之处,JQuery动态的添加元素,导致事先绑定的click事件失效了,因为.click只适用于静态元素;

    ?> 既然问题找到了,那修复起来就很快了; 因为我们无法改变blog-commom.min.js,所以通过改变自己博皮代码进行修复;

    原来代码

    通过.html()进行组合,这样导致button对应的click事件失效;

        /**
         * 设置文章标题-iconfont
         */
        (() => {
            let titleInfo = $('#cnblogs_post_body').find(':header');
            if (_.__config.articleContent.emoji && titleInfo.length > 0) {
                // 默认字体图标库
                import(/* webpackChunkName: "fonticon" */ '../../fonts/iconfont');
                titleInfo.html((i, c) => {
                    let arr = []
                    let num=Math.floor((Math.random()*(160-i))+i);
                    if(arr.indexOf(num)==-1){
                        arr.push(num)
                        return '<span><svg class="icon" style="pointer-events: none;"> <use xlink:href="#icon-' + iconfontMap.food[num]+ '"></use></svg></span>' + c;
                    }else{
                        i--;
                    }
                })
            }
        })();
    

    修复代码

    通过.prependTo()进行插入,不修改其他html代码;

        /**
         * 设置文章标题-iconfont
         */
        (() => {
            let titleInfo = $('#cnblogs_post_body').find(':header');
            if (_.__config.articleContent.emoji && titleInfo.length > 0) {
                // 默认字体图标库
                import(/* webpackChunkName: "fonticon" */ '../../fonts/iconfont');
                titleInfo.html((i, c) => {
                    let arr = []
                    let num=Math.floor((Math.random()*(160-i))+i);
                    if(arr.indexOf(num)==-1){
                        arr.push(num)
                        $('<svg class="icon"> <use xlink:href="#icon-'+ iconfontMap.food[num] +'"></use></svg>').prependTo(titleInfo[i])
                    }else{
                        i--;
                    }
                })
            }
        })();
    
  • 相关阅读:
    实验六 进程基础
    实验五 shell脚本编程
    实验四 Linux系统C语言开发环境学习
    实验三:Linux系统用户管理及vim配置
    实验二Linux简单文件操作命令
    实验一 Linux系统与应用准备
    实验八 进程间通信
    实验七 信号
    实验六 进程基础
    实验五 shell脚本编程
  • 原文地址:https://www.cnblogs.com/wangyang0210/p/16652916.html
Copyright © 2020-2023  润新知