1.javascript中的事件.

事件流

javascript中的事件是以一种流的形式存在的. 一个事件会也有多个元素同时响应. 有时候这不是我们想要的效果, 我们只是需要某个特定的元素相应我们的绑定事件, 或者只需要这样一个.

事件分类

捕获型事件(非IE), 冒泡型事件 (所有浏览器都支持)

捕获型事件是自上而下的, 而冒泡型事件是自下而上的. 或许有图会更直观一点.

冒泡型事件在平常遇到可能会比较多一些, 但捕获型事件怎样才会执行到呢? 而如果我们想要在非IE浏览器中创建捕获型事件, 只需将 addEventListener  的第三个参数设计为true就可以了.

这样的dom结构

----------->>

<div id='div1' style="width:300px;height:300px;background:#0000ff;">

<div id='div2' style="width:200px;height:200px;position:relative; left:50%;top:50%;background:#ffff00;">

</div>

</div>

------------>>

var $ = document.getElementById;

$('div1').addEventListener('click', alertID, true);

$('div2').addEventListener('click', alertID, true);

function alertID(){

alert(this.id);

}

----------->>

ID为div1和div2的两个元素都被绑定了捕捉阶段的事件处理函数, 这样:

当点击#div1(蓝色区域)时, 应该会alert出'div1'

当点击#div2(黄色区域)时, 应该会先alert出'div1', 再alert出'div2', 因为在事件捕捉阶段, 事件是从根元素向下传播的, #div1是#div2的父元素, 自然绑定在#div1上的click事件也会优先于#div2上的click事件被执行.

冒泡型事件例子:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>冒泡事件</title>
<script type="text/javascript">
var i = 1;
function Add(sText,objText)
{
document.getElementById("Console").innerHTML +=sText + "执行顺序:" + i + "<br />" + "<hr />";
i = i + 1;
//window.event.cancelBubble = true;
}
</script>
</head>
<body onclick="Add('body事件触发<br />','body')">
<div onclick="Add('div事件触发<br />','div')">
<p onclick="Add('p事件触发<br />','p')" style="background:#c00;">点击</p>
</div>
<div id="Console" style="border:solid 1px #ee0; background:#ffc;"></div>
</body>
</html>

这个例子当中可以很清楚看到事件冒泡是从元素p一直上升到body元素.

那么冒泡型事件如何阻止? 或许我在某个时候不想要这种事件机制.

如下有一个函数, 兼容了IE和其他浏览器的阻止事件冒泡.

function stopBubble(e) {
//如果提供了事件对象, 则这是一个非IE浏览器
if( e && e.stopPropagation ){
//因此它支持W3C的stopPropagation()方法
e.stopPropagation();
}else{
//否则, 我们需要使用IE的方式来取消事件冒泡
window.event.cancelBubble = true;
}
}

在IE中并没有 stopPropagation 方法, 但我们可以通过 window.event.cancelBubble 来阻止事件冒泡.

监听函数

IE    :    attachEvent, detachEvent

非IE :    addEventListener,  removeEventListener

除了上面四个函数还有一个比较通用的方法是 document.getElementById(元素ID).onclick = function( ){ }

事件对象

当触发事件, 在监听函数执行函数里怎样才可以获取事件对象呢? 在IE 中使用 window.event,srcElement, 而在非IE浏览器则用 e.currentTarget

例代码:

btn.onclick = ctdClickEvent;
function ctdClickEvent(e){
if( window.event ) //IE
{
var readonly = 'readOnly';
var obj = window.event.srcElement;
}else
{
//非IE
var readonly = 'readOnly';
var obj = e.currentTarget;
}
var id = obj.id.replace("btn_", "");
if( obj.value )
{
......
}
}

原文地址:http://www.nowamagic.net/javascript/js_EventAnalysis.php

javascript 中的事件机制的更多相关文章

  1. jQuery中的事件机制深入浅出

    昨天呢,我们大家一起分享了jQuery中的样式选择器,那么今天我们就来看一下jQuery中的事件机制,其实,jQuery中的事件机制与JavaScript中的事件机制区别是不大的,只是,JavaScr ...

  2. JavaScript中的事件循环机制跟函数柯里化

    一.事件循环机制的理解 test();//按秒输出5个5 function test() { for (var i = 0; i < 5; i++) { setTimeout(() => ...

  3. JavaScript中的事件委托机制跟深浅拷贝

    今天聊下JavaScript中的事件委托跟深浅拷贝 事件委托 首先呢,介绍一下事件绑定 //方法一:通过onclick <button onclick="clickEvent()&qu ...

  4. 深入理解javascript中的事件循环event-loop

    前面的话 本文将详细介绍javascript中的事件循环event-loop 线程 javascript是单线程的语言,也就是说,同一个时间只能做一件事.而这个单线程的特性,与它的用途有关,作为浏览器 ...

  5. JavaScript中的事件对象

    JavaScript中的事件对象 JavaScript中的事件对象是非常重要的,恐怕是我们在项目中使用的最多的了.在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含这所有与事件有 ...

  6. JavaScript 进阶教程一 JavaScript 中的事件流 - 事件冒泡和事件捕获

    先看下面的示例代码: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Jav ...

  7. 了解javascript中的事件(二)

    本文目录如下: 零.寒暄 一.事件的分类 二.事件代理 2.1 问题引出 2.2 什么是事件代理 2.3 完整示例 二.事件代理 三.事件代理思想的用处 四.总结 零.寒暄 这篇博客本该出现在两个月以 ...

  8. javascript中onclick事件能调用多个方法吗

    Q: javascript中onclick事件能调用多个方法吗? A: 可以的,方法如下onclick="aa();bb();cc();"每个方法用“;”分号隔开就行了

  9. js实例分析JavaScript中的事件委托和事件绑定

    我们在学习JavaScript中,难免都会去网上查一些资料.也许偶尔就会遇到“事件委托”(也有的称我“事件代理”,这里不评论谁是谁非.以下全部称为“事件委托”),尤其是在查JavaScript的事件处 ...

随机推荐

  1. Endless Sky源码学习笔记-5

    游戏启动后的UI划分为三个区域,左侧滚动显示credits等信息以及偏好设置和退出按钮,中间显示载入动画,右侧显示玩家信息以及载入存档按钮,调用void MenuPanel::Draw()实现.首先画 ...

  2. oracle 表被锁定 杀死进程

    /*查出被锁biao*/ select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_obje ...

  3. PTA Strongly Connected Components

    Write a program to find the strongly connected components in a digraph. Format of functions: void St ...

  4. 第四章 ngrok使用

    网址(下载):http://www.ngrok.cc/ 注册:http://www.ngrok.cc/login 管理后台:http://www.ngrok.cc/user.html 创建隧道,产生隧 ...

  5. dbcp数据源配置杂谈

    <!-- 数据源1 --> #驱动信息(driver, url, username, password)driverClassName=net.sourceforge.jtds.jdbc. ...

  6. HR开发 读取员工工资

    1.使用函数读取员工工资. ①数据结构工资结果 DATA: GT_RGDIR TYPE TABLE OF PC261 , GS_RGDIR TYPE PC261 , GT_PAYRESULT TYPE ...

  7. PHP图片裁剪_图片缩放_PHP生成缩略图

    在制作网页过程中,为了排版整齐美观,对网页中的图片处理成固定大小尺寸的图片,或是要截去图片边角中含有水印的图片,对于图片量多,每天更新大量图,靠人工PS处理是不现实的,那么有没有自动处理图片的程序了! ...

  8. 介绍几个 window 下面的terminal

    1. putty 配合 winscp 这个是标配 但是如果开多个ssh连接,管理起来很是不方便. 2. MTputty ,如果要管理多态机器,那么这个工具就是相当给力. 可以连接多个Tab,配置和保存 ...

  9. PHP从mysql获取数据的方法

    <?php require "database.php"; //读取数据库中的数据 $sql_1 = "SELECT * FROM test_table" ...

  10. angular中的表单验证

    angular中的表单验证很强大, 一共有5中验证信息,$valid,$invalid,$pristine,$dirty,$error. $valid-----当验证通过的时候,为true,不通过的时 ...