(续上篇)

模拟鼠标事件

var btn=document.getElementById("myBtn");

//创建事件对象

var event=document.createEvent("MouseEvents");

//初始化事件对象

event.initMouseEvent("click",true,true,document.defaultView,0,0,0,0,0,false,false,false,false,0,null);

//触发事件

btn.dispatchEvent(event);

模拟键盘事件

“DOM2级事件”草案中本来包含了键盘事件,在定稿之前又删除了,Firefox根据草案实现了键盘事件;“DOM3级事件”与删除的“DOM2级事件”有很大不同

DOM3级规定,调用createEvent()并传入“KeyboardEvent”创建一个键盘事件,返回的对象包含initKeyEvent()方法,接收下列参数

type(字符串)要触发的事件类型,“keydown”

bubbles(布尔值)是否可以冒泡

cancelable(布尔值)是否可以取消

view(AbstractView)与事件关联的视图,几乎总是设置为document.defaultView

key(布尔值)按下的键的键码

location(整数)表示按下了哪里的键,0表示默认主键盘,1表示左,2表示右,3表示数字键盘,4表示移动设备的键盘(虚拟键盘),5表示手柄

modifiers(字符串)空格分隔的修改键列表,如“shift”

repeat(整数)在一行中按了这个键多少次

DOM3级不提倡使用keypress事件,只能利用这种技术来模拟keydown和keyup事件

var textbox=document.getElementById("myTextbox"),

  event;

//DOM3级事件

if(document.implementation.hasFeature("KeyboardEvent","3.0")){

      event=document.createEvent("KeyboardEvent");

//初始化对象

  event.initKeyboardEvent("keydown",true,true,document.defaultView,"a",0,"shift",0);

    }

//触发事件

textbox.dispatchEvent(event);

以上的例子是模拟按住shift的同时按下A键

在Firefox中,调用createEvent()并传入“KeyEvents”就可以创建一个键盘事件,返回的对象包含一个initKeyEvent()方法,接收10个参数

type(字符串)要触发的事件类型,“keydown”

bubbles(布尔值)是否可以冒泡

cancelable(布尔值)是否可以取消

view(AbstractView)与事件关联的视图,几乎总是设置为document.defaultView

ctrlKey(布尔值)是否按下了Ctrl键,默认为false

altKey(布尔值)是否按下了Alt键,默认为false

shiftKey(布尔值)是否按下了Shift键,默认为false

metaKey(布尔值)是否按下了Meta键,默认为false

keyCode(整数)被按下或释放的键的键码,这个参数对keydown和keyup事件有用,默认为0

charCode(整数)通过按键生成的字符的ASCII编码,这个参数对keypress事件有用,默认为0

//只适用于Firefox

var textbox=document.getElementById("myTextbox");

//创建事件对象

var event=document.createEvent("KeyEvents");

//初始化事件对象

event.initKeyEvent("keypress",true,true,document.defaultView,false,false,false,false,65,65);

//触发事件

textbox.dispatchEvent(event);

在其他浏览器中,则需要创建一个通用的事件,然后再向事件对象中添加键盘事件特有的信息

var textbox=document.getElementById("myTextbox");

//创建事件对象

var event=document.createEvent("Events");

//初始化事件对象

event.initEvent(type,bubbles,cancelable);

event.view=document.defaultView;

event.altKey=false;

event.ctrlKey=false;

event.shiftKey=false;

event.metaKey=false;

event.keyCode=65;

event.charCode=65;

//触发事件

textbox.dispatchEvent(event);

在此必须使用通用事件,而不能使用UI事件,因为UI事件不允许向event对象添加新的属性

这样的模拟事件虽然会触发键盘事件,但却不会向文本框中写入文本,这是由于无法精确模拟键盘事件造成的

模拟其他事件

模拟变动事件createEvent("MutationEvents"),包含initMutationEvent()方法的变动事件对象,接收type、bubbles、cancelable、relatedNode、preValue、newValue、attrName和attrChange

模拟HTML事件(如“focus”),createEvent("HTMLEvents"),initEvent()初始化

浏览器很少使用变动事件和HTML事件,因为它们会受到一些限制

自定义DOM事件

自定义事件不是由DOM原生触发的,它的目的是让开发人员创建自己的事件createEvent("CustomEvent"),返回的对象有一个initCustomEvent()方法,接收4个参数

type(字符串)触发的事件类型

bubbles(布尔值)事件是否可以冒泡

cancelable(布尔值)事件是否可以取消

detail(对象)任意值,保存在event对象的detail属性中

var div=document.getElementById("myDiv"),

  event;

EventUtil.addHandler(div,"myevent",function(event){

      alert("DIV:"+event.detail);

    });

EventUtil.addHandler(document,"myevent",function(event){

      alert("DOCUMENT:"+event.detail);

    });

if(document.implementation.hasFeature("CustomEvents","3.0")){

      event=document.createEvent("CustomEvent");

      event.initCustomEvent("myevent",true,false,"Hello world!");

      div.dispatchEvent(event);

    }

支持自定义事件的浏览器有IE9+和Firefox6+

IE中的模拟事件

IE8之前的版本模拟事件与DOM中的思路相似:创建event对象,指定相应信息,触发事件

var btn=document.getElementById("myBtn");

//创建事件对象(不接受参数)

var event=document.createEventObject();

//添加必要信息

event.screenX=100;

event.screenY=0;

event.clientX=0;

event.clientY=0;

event.ctrlKey=false;

event.altKey=false;

event.shiftKey=false;

event.button=0;

//触发事件(接收事件处理程序的名称和event对象2个参数),fireEvent()方法会自动为event对象添加srcElement和type属性

textbox.fireEvent("onkeypress",event);

与通用事件一样,这个例子触发了事件处理程序却不会在文本框中看到任何字符

-----------------------------------13章事件结束-----------------------------------

JavaScript高级程序设计51.pdf的更多相关文章

  1. JavaScript高级程序设计61.pdf

    JSON对象 早期的JSON解析器就是使用JavaScript的eval()函数,ECMAScript5对解析JSON的行为做出了规定,定义了全局对象JSON. JSON对象有2个方法:stringi ...

  2. JavaScript高级程序设计60.pdf

    错误处理 try-catch语句 try{ //可能会导致错误的代码 }catch(error){ //在错误发生时如何处理 } error是一个包含着错误信息的对象,它有一个message属性,保存 ...

  3. JavaScript高级程序设计58.pdf

    15章 使用Canvas绘图 略 16章 HTML5脚本编程 HTML5规范了新的HTML标记和JavaScript API,以便简化创建动态Web界面的工作 跨文档消息传递 简称XDM,指来自不同域 ...

  4. JavaScript高级程序设计57.pdf

    表单序列化 首先了解一下浏览器如何将数据发送给服务器 对表单字段的名称和值进行URL编码,使用和号(&)分隔 不发送禁用的表单字段 只发送勾选的复选框和单选按钮 不发送type为“reset” ...

  5. JavaScript高级程序设计55.pdf

    输入模式 HTML5为文本字段新增了pattern属性,这个属性的值是一个正则表达式,用于匹配文本框中的值 例如,只想在允许在文本字段中输入数值 <input type="text&q ...

  6. JavaScript高级程序设计54.pdf

    过滤输入 对于一些浏览器,可以使用正则表达式里的text()测试用户按下的按键,Firefox和safari(3.1版本之前)会对向上向下.退格键和删除键触发keypress事件,在Firefox中, ...

  7. JavaScript高级程序设计53.pdf

    共有的表单字段方法 每个表单字段都有两个方法:focus()和blur(),其中focus()用于将浏览器焦点设置到表单字段,激活表单字段.可以侦听页面的load事件 EventUtil.addHan ...

  8. JavaScript高级程序设计52.pdf

    表单脚本 表单的基础知识 在HTML中,表单是由<form>元素表示的,在Javascript对应的是HTMLFormElement类型,它继承自HTMLElement,因此具有与其他HT ...

  9. JavaScript高级程序设计50.pdf

    hashchange事件 HTML5新增了hashchange事件,以便在URL的参数列表(及URL中“#”号后面的所有字符串)发生变化时通知开发人员,之所以新增这个事件,是因为在Ajax应用中,开发 ...

随机推荐

  1. 新建DragonBones动画文件

    本篇文章由:http://www.sollyu.com/new-dragonbones-animation-file/ 说明 我在网上找了很久都没找到关于怎么创建一个DragonBones动画的文章, ...

  2. boost库----enable_shared_from_this类的作用和实现原理

    使用boost库时,经常会看到如下的类 class A:public enable_share_from_this<A> 在什么情况下要使类A继承enable_share_from_thi ...

  3. leetcode problem 31 -- Next Permutation

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  4. Python3 基础

    Hello world 在文本编辑器中,键入python执行代码,保存文件为hello.py print('hello, world') 注意print前面不要有任何空格.然后,选择一个目录,例如C: ...

  5. Delphi 我常用的几个下载源码的站点

    盒子.Delphi园地就不说了,介绍几个其它的: 源码爱好者,特别喜欢. http://www.codefans.net/sort/list_10_1.shtml 新兴源码: http://www.n ...

  6. CCTV评论员评论步行者与奇才的比赛

    步行者客场迎战主场作战的奇才,奇才的战士可能由于过度兴奋或是过度紧张身体僵硬,本来能打进的球都失掉了.反而,由于步行者取得了两位数的领先,越大心情越放松,打出了过去很少见的流畅局面. CCTV评论员就 ...

  7. [转贴]JAVA :CXF 简介

    Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache CXF 了,以下简称为 CXF.CXF 继 ...

  8. PLSQL Developer Debug

    如果要查看存储过程或者函数的执行过程,可以用debug的模式.PLSQL Developer提供了debug功能,以函数为例: 1. 找到你要debug的函数,然后右击—>选择“Add debu ...

  9. 【CF】86 B. Petr#

    误以为是求满足条件的substring总数(解法是KMP分别以Sbeg和Send作为模式串求解满足条件的position,然后O(n^2)或者O(nlgn)求解).后来发现是求set(all vali ...

  10. How to hide TabPage from TabControl

    No, this doesn't exist. You have to remove the tab and re-add it when you want it. Or use a differen ...