JavaScript动态绑定详解

发布时间 - 2026-01-11 03:15:18    点击率:

问题描述:

假设我们的网页中动态生成了一个按钮,在这个按钮生成之前我们按照一般的事件绑定方法为此按钮绑定了触发事件,但是问题是绑定的事件并没有生效(JavaScript中为元素绑定的事件失效)

分析

1.首先我们来看一下这个按钮是怎么回事:

问题中按钮有一个很关键的特性:动态生成,也就是说是在网页加载完成之后执行某些操作才产生的,它一开始是不存在的;

2.然后我们来分析一下事件的绑定

对于动态生成的元素,它不同于一般的网页既有元素,它的事件绑定不能通过普通的事件绑定实现。

3.关于JavaScript事件绑定的小解(针对本题盗图解析)

这里写图片描述

由图中我们可以看到事件冒泡即由最具体的元素(文档嵌套最深节点)接收,然后逐步上传至document

事件捕获会由最先接收到事件的元素然后传向最里边(我们可以将元素想象成一个盒子装一个盒子,而不是一个积木堆积)

然后我们进入dom事件流

DOM2级事件规定事件包括三个阶段:

① 事件捕获阶段

② 处于目标阶段

③ 事件冒泡阶段

我们分析一下第一阶段就可以知道为什么了,js中一般事件绑定是在网页生成的时候针对具体元素去绑定的,那么请问:网页初始生成时按钮存在吗?答:NOP。这就是为什么事件没有绑定上去,因为都没找到元素啊啊啊啊啊,绑个毛线

解决方法(jQuery on方法)

通过将事件绑定到存在的父元素上让子元素的事件有效

jQuery on用法格式:

$(selector).on(event,childSelector,data,function,map)

示例,比如说id为btn的元素为动态生成,它的父元素为btnParent(必须是网页加载时就有的元素,也可以直接绑定到body上去)那么我们可以这样为它绑定处理事件

$("#btnParent").on("click","#btn",function(){
  console.log('binded!');
 });

如果想要更深层次的理解,那么请跟我一起阅读一下jQuery.on()的源码实现

on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
  var type, origFn;

  // 类型可以使类型映射或者句柄映射
  if ( typeof types === "object" ) {
    // ( types-Object, selector, data )
    if ( typeof selector !== "string" ) {
      // ( types-Object, data )
      data = data || selector;
      selector = undefined;
    }
    // 遍历types对象,针对每一个属性绑定on()方法
    // 将types[type]作为fn传入
    for ( type in types ) {
      this.on( type, selector, data, types[ type ], one );
    }
    return this;
  }

  // 参数修正
  // jQuery这种参数修正的方法很好
  // 可以兼容多种参数形式
  // 可见在灵活调用的背后做了很多处理
  if ( data == null && fn == null ) {
    // ( types, fn )
    fn = selector;
    data = selector = undefined;
  } else if ( fn == null ) {
    if ( typeof selector === "string" ) {
      // ( types, selector, fn )
      fn = data;
      data = undefined;
    } else {
      // ( types, data, fn )
      fn = data;
      data = selector;
      selector = undefined;
    }
  }
  if ( fn === false ) {
    // fn传入false时,阻止该事件的默认行为
    // function returnFalse() {return false;}
    fn = returnFalse;
  } else if ( !fn ) {
    return this;
  }

  // one()调用on()
  if ( one === 1 ) {
    origFn = fn;
    fn = function( event ) {
      // Can use an empty set, since event contains the info
      // 用一个空jQuery对象,这样可以使用.off方法,
      // 并且event带有remove事件需要的信息
      jQuery().off( event );
      return origFn.apply( this, arguments );
    };
    // Use same guid so caller can remove using origFn
    // 事件删除依赖于guid
    fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
  }

  // 这里调用jQuery的each方法遍历调用on()方法的jQuery对象
  // 如$('li').on(...)则遍历每一个li传入add()
  // 推荐使用$(document).on()或者集合元素的父元素
  return this.each( function() {
    jQuery.event.add( this, types, fn, data, selector );
  });
},

关于jQuery还有很多其他的事件绑定方法,当然不一定适用,也提一下

.bind(), .live(), .delegate()

但是说到底.bind(), .live(), .delegate()都是通过.on()来实现的,.unbind(), .die(), .undelegate(),也是一样的都是通过.off()来实现的

我们看一下jQuery的.bind(), .live(), .delegate()的实现源码就清楚了

jQuery.fn.extend( {

  bind: function( types, data, fn ) {
    return this.on( types, null, data, fn );
    //注意this.on()
  },
  unbind: function( types, fn ) {
    return this.off( types, null, fn );
    //注意this.off()
  },

  delegate: function( selector, types, data, fn ) {
    return this.on( types, selector, data, fn );
  },
  undelegate: function( selector, types, fn ) {
    return arguments.length === 1 ?
      this.off( selector, "**" ) :
      this.off( types, selector || "**", fn );
  }
} );

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# js  # 动态绑定  # vue.js删除动态绑定的radio的指定项  # vue.js选中动态绑定的radio的指定项  # AngularJS 单选框及多选框的双向动态绑定  # 详解Vue.js动态绑定class  # AngularJS动态绑定HTML的方法分析  # AngularJS单选框及多选框实现双向动态绑定  # Chrome扩展页面动态绑定JS事件提示错误  # Javascript动态绑定事件的简单实现代码  # js循环动态绑定带参数函数遇到的问题及解决方案[转]  # javascript下动态this与动态绑定实例代码  # 绑定  # 遍历  # 都是  # 是在  # 我们可以  # 来实现  # 是一个  # 加载  # 很好  # 在这个  # 句柄  # 这就是  # 都没  # 其他的  # 推荐使用  # 而不  # 不存在  # 可以看到  # 问题是  # 可以直接 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 使用C语言编写圣诞表白程序  Laravel如何实现本地化和多语言支持?(i18n教程)  如何续费美橙建站之星域名及服务?  Python文件异常处理策略_健壮性说明【指导】  高性价比服务器租赁——企业级配置与24小时运维服务  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  Linux安全能力提升路径_长期防护思维说明【指导】  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  bootstrap日历插件datetimepicker使用方法  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  googleplay官方入口在哪里_Google Play官方商店快速入口指南  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  使用spring连接及操作mongodb3.0实例  Laravel怎么使用artisan命令缓存配置和视图  微信小程序 wx.uploadFile无法上传解决办法  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  网易LOFTER官网链接 老福特网页版登录地址  如何安全更换建站之星模板并保留数据?  如何在服务器上配置二级域名建站?  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  微信小程序 HTTPS报错整理常见问题及解决方案  网站制作大概多少钱一个,做一个平台网站大概多少钱?  如何快速重置建站主机并恢复默认配置?  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  黑客如何利用漏洞与弱口令入侵网站服务器?  如何快速搭建自助建站会员专属系统?  使用Dockerfile构建java web环境  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  实例解析angularjs的filter过滤器  如何在Windows服务器上快速搭建网站?  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  历史网站制作软件,华为如何找回被删除的网站?  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  潮流网站制作头像软件下载,适合母子的网名有哪些?  Laravel怎么为数据库表字段添加索引以优化查询  制作企业网站建设方案,怎样建设一个公司网站?  公司网站制作价格怎么算,公司办个官网需要多少钱?  如何获取PHP WAP自助建站系统源码?  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  JS中对数组元素进行增删改移的方法总结  Angular 表单中正确绑定输入值以确保提交与验证正常工作  北京的网站制作公司有哪些,哪个视频网站最好?  奇安信“盘古石”团队突破 iOS 26.1 提权  如何为不同团队 ID 动态生成多个非值班状态按钮