Webkit里创建Event的两种方法

转载请注明: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修饰即可。

时间: 2024-10-11 04:59:35

Webkit里创建Event的两种方法的相关文章

Javascript使用function创建类的两种方法

1.使用function类 //myFunction.js var CMyFunc=function() { //类的公共方法,供外部调用 this.Func1=function() { var i=0; return i; } this.Func2=function() { _privateFunc(); } //类中的私有方法,供公共方法调用 function _privateFunc() { return 0; ] } CMyFunc myFunc=new CMyFunc(); 使用:其它

(转)java创建线程的两种方法比较

Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法:  ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢? 在Java中,类仅支持单继承

Java 创建线程的两种方法

Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法: ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢? 在Java中,类仅支持单继承,

创建二叉树的两种方法以及三种遍历方法

二叉树的两种创建方法和三种遍历方法 这里的两种创建方法,一种值得是 数据结构上面的创建方法: 方法一 代码如下: 二叉树的结构定义如下: typedef struct BinaryTreeNode{ char value; struct BinaryTreeNode *left; struct BinaryTreeNode *right; }; - c语言版 void CreateBinaryTree(BinaryTreeNode **T) { char data; scanf("%d"

AO创建IFeature的两种方法

原文地址:http://www.cnblogs.com/MyLucifer/archive/2010/12/01/1893212.html 在ArcGIS Resouce Center中,ESRI介绍了两种创建Feature的方法(可以在本地的Geodatabase和sde的featureclass) 第一种是IFeatureClass.CreateFeature,在这种方法最后需要加上IFeature.Store去提交创建的要素,本人认为这种方法相比下面一种方法更好些,因为Store的方法能够

Java创建线程的两种方法

大多数情况,通过实例化一个Thread对象来创建一个线程.Java定义了两种方式: 实现Runnable 接口: 可以继承Thread类. 下面的两小节依次介绍了每一种方式. 实现Runnable接口 创建线程的最简单的方法就是创建一个实现Runnable 接口的类.Runnable抽象了一个执行代码单元.你可以通过实现Runnable接口的方法创建每一个对象的线程.为实现Runnable 接口,一个类仅需实现一个run()的简单方法,该方法声明如下:    public void run( )

创建线程的两种方法

第一种:继承Thread类 子类覆写父类的run方法,将线程代码写在run()中. 建立子类对象,些时线程也被创建了. 通过start方法启动线程. 第二种:实现Runnable接口 子类覆盖接口的run方法,将线程代码写在run()中. 通过Thread类创建线程,并将实现Runnable接口的子类对象作为参数传递给Thread类的构造函数. Thread对象调用start方法启动线程. 两者的比较: 继承Thread类,相对简单,但因为单继承的局限性,同份资源不共享,而不建议使用:而实现Ru

OC动态创建的问题变量数组.有数组,在阵列13要素,第一个数据包阵列,每3元素为一组,分成若干组,这些数据包的统一管理。最后,一个数组.(要动态地创建一个数组).两种方法

<span style="font-size:24px;">//////第一种方法 //        NSMutableArray *arr = [NSMutableArray array]; //        for (int i = 0; i < 13; i ++) { //            [arr addObject:[NSString stringWithFormat:@"lanou%d",i + 1]]; //        

MySQL 创建数据库的两种方法

使用 mysqladmin 创建数据库 使用普通用户,你可能需要特定的权限来创建或者删除 MySQL 数据库. 所以我们这边使用root用户登录,root用户拥有最高权限,可以使用 mysql mysqladmin 命令来创建数据库. 实例 以下命令简单的演示了创建数据库的过程,数据名为 TUTORIALS: [[email protected]]# mysqladmin -u root -p create TUTORIALS Enter password:****** 以上命令执行成功后会创建