转载请注明:http://blog.csdn.net/lichwei1983
第一种方法: 直接修改WebCore的Window, HTML中关于Event名称,监听器。
1 修改HTMLAttributeName.in,增加event name: onirkeyevent;
2 修改DOMWindow.idl,增加事件监听器:attribute EventListener
onirkeypress;
3 修改Domcument.idl,增加事件监听器 attribute [DontEnum]
EventListener onirkeypress;
4 修改Document.h,定义事件监听器 DEFINE_ATTRIBUTE_EVENT_LISTENER(irkeypress);
第二中方法: 使用event专用IDL的构造模板
我们可以使用两个关键词来创建自己的Event:[ConstructorTemplate]是用来修饰接口的, [InitializedByEventConstructor]是用来修饰属性的。
用法: [ConstructorTemplate=Event]. 这种方法只能用于制定事件接口. [InitializedByEventConstructor]可以用来修饰接口的属性,举例如下:
[ ConstructorTemplate=Event ] interface MichaelIREvent { attribute DOMString str1; [InitializedByEventConstructor] attribute DOMString str2; };
因为事件接口的构建器(constructor)要求特殊的绑定,我们需要使用这种方法来实现,通常的Constructor是不行的。
当把如上IDL文件加入Webkit编译以后,测试的JavaScript代码如下,首先建一个MichaelIREvent的DOM对象:
var e = new MichaelIREvent("type", { bubbles: true, cancelable: true });
然后,WebCore里的MichaelIREvent::create()就会被调用. Specifically, WebCore会自动生成如下方法并把它作为构建器的回调函数:
PassRefPtr<FooEvent> MichaelIREvent::create(const AtomicString& type, const FooEventInit& initializer) { ...; }
[InitializedByEventConstructor] 应该修饰那些需要构造器初始化的属性. Event接口的Spec规定了哪些属性需要初始化.具体参看W3C的链接:the
spec of Event.
[Constructor(DOMStringtype, optional EventInit eventInitDict), Exposed=(Window,Worker)] interfaceEvent{ readonly attribute DOMString type; readonly attribute EventTarget? target; readonly attribute EventTarget? currentTarget; const unsigned short NONE = 0; const unsigned short CAPTURING_PHASE = 1; const unsigned short AT_TARGET = 2; const unsigned short BUBBLING_PHASE = 3; readonly attribute unsigned short eventPhase; void stopPropagation(); void stopImmediatePropagation(); readonly attribute boolean bubbles; readonly attribute boolean cancelable; void preventDefault(); readonly attribute boolean defaultPrevented; [Unforgeable] readonly attribute boolean isTrusted; readonly attribute DOMTimeStamp timeStamp; void initEvent(DOMStringtype, booleanbubbles, booleancancelable); }; dictionary EventInit{ boolean bubbles = false; boolean cancelable = false; };
EventInit有属性:bubbles 和 cancelable, 因此bubbles 和 cancelable唯一需要被Event构建器初始化的两个参数. 换句话说,对于自定义的事件,你只需要为bubbles和cancelable属性指定InitializedByEventConstructorIn修饰即可。