现代浏览器都支持的事件

  • click
  • dbclick
  • mouseover
  • mousemove
  • mouseout
  • focus
  • blur
  • change(表单输入框特有)
  • submit(表单特有)

addEventListener/removeEventListenr

  • 注意如果第二个参数是匿名函数的话,不销毁这个元素节点则监听不会停止;
第三参数 对应事件 效果 取消事件
true 事件捕捉 从外向内传播
false 事件冒泡 从内向外传播 e.stopPropagation()
  • 阻止默认行为: e.preventDefault() / return false

事件对象

  • 事件类型

    • bubbles: 表示事件是否通过DOM以冒泡形式触发
  • 环境信息属性
    • button:表示鼠标所按下的按钮

      • 0:左
      • 1:中
    • ctrlKey/altKey/shiftKey 表示是否按下相应键
  • 键盘事件属性
    • isChar:表示当前按下的键是否表示一个字符
    • charCode:表示当键的unicode值(仅对keypress有效)
    • keyCode:表示非字符按键的unicode值
    • which:表示当前按键的unicode值,不管是否是字符
  • 事件发生的环境参数
    • pageX/pageY:相对于可视区域的坐标
    • screenX,screenY:想对于屏幕的坐标
  • 和事件相关的元素
    • currentTarget:事件冒泡阶段当前所在的DOM元素
    • target,originateTarget:原始的DOM元素
    • relatedTarget:其他和事件相关的DOM元素(有的话)

切换上下文

  • 在addEventListener()方法中的执行函数中,上下文已经切换到当前监听的节点,如果想改变,请使用之前提到的方法

事件委托

  • 从冒泡事件开始就开始了事件委托;可以直接给父元素绑定事件监听
list.addEventListener("click", function(e) {
if(e.currentTarget.tagName == "LI") {
/**/
}
}, false)

自定义事件

以jquery插件为例;下面代码使用自定义事件让代码变得整洁,在点击选项卡时触发一个change.tabs事件,并绑定若干回调方法来修改active类

<ul id="tabs">
<li data-tab="user">Users</li>
<li data-tab="group">Groups</li>
</ul>
<div id="tabsContent">
<div data-tab="user">user</div>
<div data-tab="group">group</div>
</div>
jQuery.fn.tabs = function(control) {
var elem = $(this);
control = $(control); elem.on("click", "li", function() {
var tabName = $(this).attr("data-tab");
elem.trigger("change.tabs", tabName);
});
elem.on("change.tabs", function(e, tabName) {
elem.find("li").removeClass("active");
elem.find(">[data-tab='" + tabName + "']").addClass("active");
});
elem.on("change.tabs", function(e, tabName) {
control.find(">[data-tab]").removeClass("active");
control.find(">[data-tab='" + tabName + "']").addClass("active");
}); //将切换选项卡的动作和窗口的hash做关联,这样可以使用浏览器的退后按钮
elem.on("change.tabs", function(e, tabName) {
window.location.hash = tabName;
});
$(window).on("hashchange", function() {
var tabName = window.location.hash.slice(1);
elem.trigger("change.tabs", tabName);
}) var firstName = elem.find("li:first").attr("data-tab");
elem.trigger("change.tabs", firstName);
return this;
} $("ul#tabs").tabs("#tabsContent");

DOM无关事件

  • 基于事件的编程可以使应用框架充分解耦,事件本质上是和DOM无关的,因此可以开发事件驱动的库;
  • 这种模式称为发布/订阅的消息模式,发布者和订阅者是完全解耦的,彼此不知道对方的存在,两者仅仅共享一个信道名称;
  • 应用这种模式只需要记录回调和事件名称的对应关系及调用他们的方法;
var PubSub = {
//订阅
subscribe: function(ev, callbacks) {
//双重赋值
var calls = this._callbacks || (this._callbacks = {});
(this._callbacks[ev] || (this._callbacks[ev] = [])).push(callbacks);
return this;
},
//发布
publish: function() {
var args = Array.prototype.slice.call(arguments, 0);
var ev = args.shift();
var list, calls, i, l;
if(!(calls = this._callbacks)) return this;
if(!(list = this._callbacks[ev])) return this;
for(i = 0, l = list.length; i < l; i++) list[i].apply(this, args);
return this;
}
} PubSub.subscribe("wem", function() {});
PubSub.publish("wem");
//可以使用命名空间的方式管理事件名称
PubSub.subscribe("user:create", function() {});

将其扩充到一个局部对象

var Asset = {};
jQuery.extend(Asset, PubSub);
Asset.subscribe("test", function() {alert("test")});
Asset.publish("test");

使用jquery实现该模式

(function($) {
var o = $({});
$.subscribe = function() {
o.bind.apply(o, arguments);
};
$.unsubscribe = function() {
o.unbind.apply(o, arguments);
};
$.publish = function() {
var arguments = $.makeArray(arguments);
var type = arguments[0];
arguments.shift();
o.trigger.apply(o, [type, arguments]);
}
})(jQuery); $.subscribe("/some/topic", function(event, a, b, c) {
console.log(event.type, a + b +c);
});
$.publish("/some/topic","a","b","c");

mvc-2事件监听的更多相关文章

  1. 第34天学习打卡(GUI编程之组件和容器 frame panel 布局管理 事件监听 多个按钮共享一个事件 )

    GUI编程 组件 窗口 弹窗 面板 文本框 列表框 按钮 图片 监听事件 鼠标 键盘事件 破解工具 1 简介 GUi的核心技术:Swing AWT 1.界面不美观 2.需要jre环境 为什么要学习GU ...

  2. Java中用得比较顺手的事件监听

    第一次听说监听是三年前,做一个webGIS的项目,当时对Listener的印象就是个"监视器",监视着界面的一举一动,一有动静就触发对应的响应. 一.概述 通过对界面的某一或某些操 ...

  3. 4.JAVA之GUI编程事件监听机制

    事件监听机制的特点: 1.事件源 2.事件 3.监听器 4.事件处理 事件源:就是awt包或者swing包中的那些图形用户界面组件.(如:按钮) 事件:每一个事件源都有自己特点有的对应事件和共性事件. ...

  4. Node.js 教程 05 - EventEmitter(事件监听/发射器 )

    目录: 前言 Node.js事件驱动介绍 Node.js事件 注册并发射自定义Node.js事件 EventEmitter介绍 EventEmitter常用的API error事件 继承EventEm ...

  5. .NET事件监听机制的局限与扩展

    .NET中把“事件”看作一个基本的编程概念,并提供了非常优美的语法支持,对比如下C#和Java代码可以看出两种语言设计思想之间的差异. // C#someButton.Click += OnSomeB ...

  6. 让 select 的 option 标签支持事件监听(如复制操作)

    这标题,让option支持事件监听,应该不难的呀,有什么好讲的? 其实还是有的,默认在浏览器代码是无法直接对option标签进行操作的,不仅包括JS事件监听,还是CSS样式设置 查了一些资料,姑且认为 ...

  7. [JS]笔记12之事件机制--事件冒泡和捕获--事件监听--阻止事件传播

    -->事件冒泡和捕获-->事件监听-->阻止事件传播 一.事件冒泡和捕获 1.概念:当给子元素和父元素定义了相同的事件,比如都定义了onclick事件,点击子元素时,父元素的oncl ...

  8. [No00006A]Js的addEventListener()及attachEvent()区别分析【js中的事件监听】

    1.添加时间监听: Chrom中: addEventListener的使用方式: target.addEventListener(type, listener, useCapture); target ...

  9. java 事件监听 - 鼠标

    java 事件监听 - 鼠标 //事件监听 //鼠标事件监听 //鼠标事件监听有两个实现接口 //1.MouseListener 普通的鼠标操作 //2.MouseMotionListener 鼠标的 ...

  10. java 事件监听 - 键盘

    java 事件监听 - 键盘 //事件监听 //键盘事件监听,写了一个小案例,按上下左右,改变圆形的位置,圆形可以移动 import java.awt.*; import javax.swing.*; ...

随机推荐

  1. matlab figure 论文级别绘图

    1.将figure调整为最大: figure;set(gcf,'outerposition',get(0,'screensize')); 2.获得figure中的大小 [x,y] = ginput 3 ...

  2. 探讨关于C#中Foreach的本质

    一.为什么数组和集合可以使用foreach遍历 01. 因为数组和集合都实现了IEnumerable接口,该接口中只有一个方法,GetEnumerator() 02.数组类型是从抽象基类型 Array ...

  3. @version ||= version

    # -*- encoding : utf-8 -*- class InterfaceBaseController < ActionController::Base private def set ...

  4. Tomcat打包时多项目共享jar和精确指定jar版本

    在产品打包发布时一个tomcat中如果存在多个war,部署的一般方式是部署到%TOMCAT_HOME%/webapps目录下,目录结构遵循J2EE规范,把引用的jar放到%TOMCAT_HOME%/w ...

  5. [flag飞起]

    重度Flag: Rush 未来程序・改 (note: 由于代码存放地址原因(物理)无法本周完成) 轻度Flag: 未来程序・改写完后刷QTREE与主席树 严重Flag: 计算几何...

  6. cookie注入讲解

    我们首先还是来看看中网景论坛的最新版本"(CNKBBS2007)中网景论坛2007v5.0 "官方下载地址" http://www.cnetking.com/websys ...

  7. RAID阵列的初始化与管理

    如果我们创建RAID阵列的目的是新部署一台服务器,我们建议所有新创建的RAID阵列都应该做初始化操作,这样,硬盘上原有的用户数据将被清除,以便进行后续的系统,软件安装. 转自: http://zh.c ...

  8. chrome打开本地文件目录

    chrome地址栏输入: file:///

  9. 修改setup.py的源

    方法一: 修改文件 ~/.pydistutils.cfg为: [easy_install] index_url = http://pypi.douban.com/simple 方法二: 直接在setu ...

  10. 【Other】千字文 硬笔 楷书 字帖

    <千字文>是我国最优秀的一篇训蒙教材,用一千个汉字勾划出一部完整的中国文化史的基本轮廓,代表了中国传统教育启蒙阶段的最高水平.<千字文>通篇首尾连贯,音韵谐美,读起来朗朗上口, ...