zepto | 用事件委托去解决无法给新增添的DOM添加事件的问题
前段时间在做一个任务的时候,碰见了一个问题:zepto无法用on事件去监听新增加的dom事件。这个问题用live可解决, 但是live在ios下失效,为了解决这个问题,我采用了暴力的方法去解决,每次添加dom都绑定一次事件,这样是可以解决问题的,但是这样的方式肯定消耗很多资源,不是一个好的方式,今天在读JavaScript富应用开发这本书时,找到了一个比较完美的解决方法,利用事件委托与自定义事件,封装成一个插件($.fn.xxx)的形式。
下面就模拟选项卡的形式去解决这个问题
zepto:http://apps.bdimg.com/libs/zepto/1.1.4/zepto.js
html
<ul id="tabs">
<li data-tab="tab_1" class="tab_1">tab_1</li>
<li data-tab="tab_2" class="tab_2">tab_2</li>
</ul>
<input type="button" name="" value="button" class="button">
这个button是为了动态添加dom
js
$.fn.tabs = function(){
var element = $(this);
element.delegate("li","click",function(){
var className = $(this).attr("class");
var dataTab = $(this).data("tab");
element.trigger("changes-tabs",[className,dataTab])
});
element.on("changes-tabs",function(e,className,dataTab){
// element.find("li").removeClass("active")
element.find("li").not("."+dataTab).removeClass("active");
element.find("."+className).addClass("active");
});
var firstClassName = element.find("li:first-child").attr("class");
var firstDataTab = element.find("li:first-child").data("tab");
element.trigger("changes-tabs",[firstClassName,firstDataTab]);
}
$("ul#tabs").tabs()
$(".button").on("click",function(){
var html = "<li data-tab='tab_3' class='tab_3'>tab_3</li>";
$("#tabs").append(html);
})
为什么会有一个data-tab这个属性,是因为我需要在点击当前li的时候,移除非当前li的active这个class,并让当前的li加上class
这样就很容易的给新增加的dom添加事件了
css
.active{
color: red;
}
zepto | 用事件委托去解决无法给新增添的DOM添加事件的问题的更多相关文章
- js事件委托篇(附js一般写法和js、jq事件委托写法)
参考: jQuery代码优化:事件委托篇 使用该技术能让你避免对特定的每个节点添加事件监听器:相反,事件监听器被添加在他们的父元素上,事件监听器会分析从子元素上冒泡上来的事件,并找到是哪个子元素事件. ...
- 如何给js动态创建的dom添加事件
delegate() 方法 实例 当点击鼠标时,隐藏或显示 p 元素: $("div").delegate("button","click" ...
- ECharts 报表事件联动系列二:柱状图,饼状图添加事件
代码如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...
- IE事件模型,如何给IE和非IE浏览器添加事件
<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title> ...
- dom添加事件
1.语法:document.getElementById('btn').addEventListener 2.可以添加多个EventListener,且不会覆盖 3.移除EventListener, ...
- Vue(基础五)_vue中用ref和给dom添加事件的特殊情况
一.前言 这篇文章涉及的主要内容有: 1.ref绑定在标签上是获取DOM对象 2.ref绑定在子组件上获取的是子组件对象 3.案列:自动获取input焦点 二.主要内容 1.基础内容: ref 被用来 ...
- focus、blur事件的事件委托处理(兼容各个流浏览器)
今天工作中遇到个问题,问题是这样的,一个form表单中有比较多的input标签,因为form中的input标签中的值都需要前端做客户端校验,由于本人比较懒而且特不喜欢用循环给 每个input元素添加b ...
- 对JS中事件委托的理解
什么是事件委托: 事件委托——给父元素绑定事件,用来监听子元素的冒泡事件,并找到是哪个子元素的事件.(不理解冒泡的可以去百度下) 定义:利用事件冒泡处理动态元素事件绑定的方法,专业术语叫事件委托. 使 ...
- js进阶---12-12、jquery事件委托怎么使用
js进阶---12-12.jquery事件委托怎么使用 一.总结 一句话总结:通过on方法(事件委托),给要绑定事件的元素的祖先绑定事件,从而达到效果. 1.事件委托是什么? 通过事件冒泡,让子元素绑 ...
随机推荐
- Mybatis-09-缓存
缓存 什么是缓存[Cache]? 存在内存中的临时数据 提高查询效率,解决高并发的性能问题 为什么使用缓存? 减少和数据库的交互次数,减少系统开销,提高系统效率 什么样的数据能使用缓存? 经常查询且不 ...
- 关于C#调用非托管DLL,报“内存已损坏的”坑,坑,坑
因客户需求,与第三方对接,调用非托管DLL,之前正常对接的程序,却总是报“内存已损坏的异常”,程序进程直接死掉,折腾到这个点(2018-05-11 00:26),终于尘埃落定,直接上程序. 之前的程序 ...
- 企业微信人员日程推送接口(python版)
企业在使用企业微信中,有时想批量推送员工日程信息.这里写了个接口工具分享给大家,供交流学习. 主入口程序: # -*- coding: utf-8 -*-import time as time imp ...
- Promise 方法
functionB(){ this.functionA() } functionA(){ return new Promise((resolve, reject) => { this.$http ...
- 无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
状况 如果在使用 vue 初始化项目的时候提示: vue : 无法将“vue”项识别为 cmdlet.函数.脚本文件或可运行程序的名称.请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次. ...
- hdfs-default.xml
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="confi ...
- 【接口自动化】Python+Requests接口自动化测试框架搭建【三】
经过上两篇文章的讲解,我们已经完成接口自动化的基础框架,现在开始根据实际项目丰满起来. 在PyCharm中新建项目,项目工程结构如下: config:配置文件夹,可以将一些全局变量放于配置文件中,方便 ...
- golang 创建 tun 设备
源码: package main import ( "flag" "fmt" "github.com/pkg/errors" "n ...
- 【译】Database Profiling with Visual Studio
你是否在排查运行缓慢的 web 应用程序时怀疑是数据库层造成的?以前排查数据库层需要特定的工具,现在可以使用 Visual Studio 的 Performance Explorer 中的数据库分析工 ...
- SpringBoot中关于Excel的导入和导出
前言 由于在最近的项目中使用Excel导入和导出较为频繁,以此篇博客作为记录,方便日后查阅.本文前台页面将使用layui,来演示对Excel文件导入和导出的效果.本文代码已上传至我的gitHub, ...