html⿏标中键事件,Javascript事件模拟(⿏标事件、键盘事
件)
在javascript编程中,事件是⽤来描述⽹页中某⼀特定有趣时刻的,众所周知事件通常是在由⽤户和浏览器进⾏交互时触发,其实不然,通过Javascript可以在任何时间触发特定的事件,并且这些事件与浏览器创建的事件是相同的。
会有适当的事件冒泡,并且浏览器会执⾏分配的事件处理程序。这种能⼒在测试web应⽤程序的时候,是⾮常有⽤的,在DOM 3级规范中提供了⽅法来模拟特定的事件,IE9 chrome FF Opera 和 Safari都⽀持这样的⽅式,在IE8及以前的办法的IE浏览器有他⾃⼰的⽅式来模拟事件。
a)、Dom 事件模拟
可以通过document上的createEvent()⽅法,在任何时候创建事件对象,此⽅法只接受⼀个参数,既要创建事件对象的事件字符串,在DOM2 级规范上所有的字符串都是复数形式,在DOM 3级事件上所有的字符串都采⽤单数形式,所有的字符串如下:
UIEvents:通⽤的UI 事件,⿏标事件键盘事件都是继承⾃UI事件,在DOM 3 级上使⽤的是 UIEvent。
MouseEvents:通⽤的⿏标事件,在DOM 3 级上使⽤的是 MouseEvent。
MutationEvents:通⽤的突变事件,在DOM 3 级上使⽤的是 MutationEvent。
HTMLEvents:通⽤的HTML事件,在DOM3级上还没有等效的。
注意,ie9是唯⼀⽀持DOM3级键盘事件的浏览器,但其他浏览器也提供了其他可⽤的⽅法来模拟键盘事件。
⼀旦创建了⼀个事件对象,就要初始化这个事件的相关信息,每⼀种类型的事件都有特定的⽅法来初始化,在创建完事件对象之后,通过dispatchEvent()⽅法来将事件应⽤到特定的dom节点上,以便其⽀持该事件。这个dispatchEvent()事件,⽀持⼀个参数,就是你创建的event对象。
b)、⿏标事件模拟
⿏标事件可以通过创建⼀个⿏标事件对象来模拟(mouse event object),并且授予他⼀些相关信息,创建⼀个⿏标事件通过传给createEvent()⽅法⼀个字符串"MouseEvents",来创建⿏标事件对象,之后通过iniMouseEvent()⽅法来初始化返回的事件对
象,iniMouseEvent()⽅法接受15
参数,参数如下:
type string类型 :要触发的事件类型,例如‘click'。
bubbles Boolean类型:表⽰事件是否应该冒泡,针对⿏标事件模拟,该值应该被设置为true。
cancelable bool类型:表⽰该事件是否能够被取消,针对⿏标事件模拟,该值应该被设置为true。
view 抽象视图:事件授予的视图,这个值⼏乎全是document.defaultView.
detail int类型:附加的事件信息这个初始化时⼀般应该默认为0。
screenX int类型 : 事件距离屏幕左边的X坐标
screenY int类型 : 事件距离屏幕上边的y坐标
clientX int类型 : 事件距离可视区域左边的X坐标
clientY int类型 : 事件距离可视区域上边的y坐标
ctrlKey Boolean类型 : 代表ctrol键是否被按下,默认为false。
altKey Boolean类型 : 代表alt键是否被按下,默认为false。
shiftKey Boolean类型 : 代表shif键是否被按下,默认为false。
metaKey Boolean类型: 代表meta key 是否被按下,默认是false。
button int类型: 表⽰被按下的⿏标键,默认是零.
relatedTarget (object) : 事件的关联对象.只有在模拟mouseover 和 mouseout时⽤到。
注意,initMouseEvent()的参数直接与event对象相映射,其中前四个参数是由浏览器⽤到,只有事件处理函数⽤到其他的参数,当事件对象作为参数传给dispatch()⽅式,target属性将会⾃动被赋上值。
例⼦,
复制代码 代码⽰例:
var btn = ElementById("myBtn");
var event = ateEvent("MouseEvents");
event.initMouseEvent("click", true, true, document.defaultView, 0, 0, 0, 0, 0,false, false, false, false, 0, null);
btn.dispatchEvent(event);
在DOM实现的浏览器中,所有其他的事件都包括dbclick,都可以通过相同的⽅式来实现。
c)键盘事件模拟
键盘事件已经从DOM2级事件中移出了,起初在DOM2级事件的草案版中,键盘事件是作为草案的⼀部分的,但在最终版被移出了,FF已经实现了草案版中的键盘事件,值得注意的是在DOM3级事件中实现的键盘事件与DOM2级事件草案版中的键盘事件还是存在很⼤差异的。
在dom3级事件中创建⼀个键盘事件对象是通过createEvent()⽅法,并传⼊KeyBoardEvent字符串作为参数,对返回的event对象,调⽤initKeyBoadEvent()⽅法初始化,初始化键盘事件的参数有以下⼏个: www.jquerycn
type (string) - 要触发的事件类型,例如"keydown".
bubbles (Boolean) — 代表事件是否应该冒泡.
cancelable (Boolean) — 代表事件是否可以被取消.
view (AbstractView) — 被授予事件的是图. 通常值为:document.defaultView.
key (string) — 按下的键对应的code.
location (integer) — 按下键所在的位置. 0 :默认键盘, 1 左侧位置, 2 右侧位置, 3 数字键盘区, 4 虚拟键盘区, or 5 游戏⼿柄.
modifiers (string) — ⼀个有空格分开的修饰符列表.
repeat (integer) — ⼀⾏中某个键被按下的次数.
注意,在DOM3事件中,费掉了keypress事件,因此按照下⾯的⽅式,你只能模拟键盘上的keydown 和 keyup事件。
复制代码 代码⽰例:
var textbox = ElementById("myTextbox"),event;
if (document.implementation.hasFeature("KeyboardEvents", "3.0")){
event = ateEvent("KeyboardEvent");
event.initKeyboardEvent("keydown", true, true, document.defaultView, "a",0, "Shift", 0);
}
textbox.dispatchEvent(event);
在FF下,允许你通过使⽤ateEvent('KeyEvents'),这种⽅式来创建键盘事件,初始化的⽅法为initKeyEvent(),这个⽅法接受10个参数,
type (string) — 要触发的事件类型,例如"keydown".
bubbles (Boolean) — 代表事件是否应该冒泡.
cancelable (Boolean) — 代表事件是否可以被取消.
view (AbstractView) — 被授予事件的是图. 通常值为:document.defaultView.
ctrlKey (Boolean) — 代表ctrol键是否按下. 默认 false.
altKey (Boolean) — 代表alt键是否按下. 默认 false.
shiftKey (Boolean) — 代表shift键是否按下. 默认 false.
metaKey (Boolean) — 代表meta键是否按下. 默认 false.
keyCode (integer) — 键按下或释放时键所对应的键码. 默认是0;
charCode (integer) — 按下的键的字符所对应的ASCII code.是共keypress事件使⽤的 默认是0.
D)、模拟其他事件
⿏标事件和键盘事件是在浏览器中最长被模拟的事件,,但是某些时候同样需要模拟突变事件和HTML事件。可以⽤
createEvent('MutationEvents'),来创建⼀个突变事件对象,可以采⽤initMutationEvent()来初始化这个事件对象,参数包括type, bubbles, cancelable, relatedNode, prevValue,
newValue, attrName, 和attrChange.可以采⽤下⾯的⽅式来模拟⼀个突变事件:
复制代码 代码⽰例:
var event = ateEvent('MutationEvents');
event.initMutationEvent("DOMNodeInserted", true, false, someNode, "","","",0);
target.dispatchEvent(event);
对于HTML事件,直接上代码。
复制代码 代码⽰例:
var event = ateEvent("HTMLEvents");
event.initEvent("focus", true, false);
target.dispatchEvent(event);
对于突变事件和HTML事件是很少在浏览器中⽤到,因为他们收应⽤程序的限制。
E)、定制DOM事件
在DOM3级事件中定义了⼀类事件称之为 custom event,我称之为客户事件,客户事件不会原⽣的被dom触发,⽽是直接提供,以⾄于开发者可以创建他们⾃⼰的事件,你可以创建⼀个⾃⼰的客户事件,通过调⽤createEvent('CustomEvent'),对返回的事件对象调
⽤,initCustomEvent()⽅法,其中传递四个参数type,bubbles,cancelable,detail。ps:⼩弟对这部分理解有限,在这⾥只是抛砖引⽟。
F)、IE中的事件模拟
从IE8,以及更早版本的IE,都在模仿DOM模拟事件的⽅式:创建事件对象,初始化事件信息,之后触发事件。当然IE在完成这⼏个步骤的过程是不同的。
⾸先不同于dom中创建event对象的⽅法,IE采⽤ateEventObject()⽅法,并且没有参数,返回⼀个通⽤的事件对象,接下来要对返回的event对象赋值,此时ie并没有提供初始化函数,你只能采⽤物理⽅法⼀个⼀个的赋值,最后在⽬标元素上调⽤fireEvent()⽅法,参数为两个:事件处理的名称和创建的事件对象。当fireEvent⽅法被调⽤的时候,event对象的srcElement和type属性将会被⾃动赋值,其他将需要⼿动赋值。
例⼦:
复制代码 代码⽰例:
var btn = ElementById("myBtn");
var event = ateEventObject();
原生js和js的区别event.screenX = 100;
event.screenY = 0;
event.clientX = 0;
event.clientY = 0;
event.altKey = false;
event.shiftKey = false;
event.button = 0;
btn.fireEvent("onclick", event);
这个例⼦创建了⼀个事件对象,之后通过⼀些信息初始化该事件对象,注意事件属性的赋值是⽆序的,对于事件对象来说这些属性值不是很重要,因为只有事件句柄对应的处理函数(event handler)会⽤到他们。对于创建⿏标事件、键盘事件还是其他事件的事件对象之间是没有区别的,因为⼀个通⽤的事件对象,可以被任何类型的事件触发。
注意,在Dom的键盘事件模拟中,对于⼀个keypress模拟事件的结果不会作为字符出现在textbox中,即使对应的事件处理函数已经触发。
与DOM事件模拟相⽐,个⼈觉得IE的事件模拟更容易让⼈记忆和接受,统⼀的事件模型可以带来⼀些便捷。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。