EVENTS:事件绑定机制

还有 DOCEVENTS 哦亲

EVENTS

我们可以用 .EVENTS 给 HelloWorld 的 el 节点绑定事件,也可以在 el 节点上代理其子节点的事件:

HelloWorld.EVENTS = {
    "": { // 空表示事件直接绑定在 el 上
        click: function() {
            // 这里的 this 指向当前组件实例,即 new HelloWorld 所返回的值
            top.console.log('节点被点击');
        }
    },
    "#spanName": {
        click: function(e){
            e.halt();   // 阻止冒泡
            this.set('name', "I'm Clicked");
            S.one(e.currentTarget).html(this.get('name'));
        }
    }
};

如果属性为空,则直接绑定到 el 节点上。

其他属性,例如上例中的 #spanName,则作为 KISSY Event 中 .delegate 方法的第二个参数, 同时遍历 #spanName 属性所指的对象,将这些事件代理到 el 节点上:

this.get('el').delegate('click', '#spanName', fn);

DOCEVENTS

如果事件需要直接绑定到 document,或者在 document 上代理,则请使用 .DOCEVENTS

HelloWorld.DOCEVENTS = {
    "": { // 空表示事件直接绑定在document上
        "click": function() {
            top.console.log('document 被点击');
        }
    }
};

它的逻辑与 EVENTS 是一致的,区别只是事件所绑定的节点不同。

事件代理中的当前上下文(this)是当前组件的实例对象

点击组件外层的“点击我”会触发组件绑定在 document 上的事件, 点组件内部的“点击我”会触发代理事件。

<div id="container1">
    点击我
    <div id="helloworld1">
        <span>Hello <span id="spanName">点击我</span></span>
    </div>
</div>
KISSY.use('helloworld', function(S, HelloWorld){
    var config = {
        name: 'World',
        tmpl:'#helloworld1'
    }
    var helloworld = new HelloWorld(config);
});

events

如果组件内部提供的代理事件不能满足业务需求,那么,我们提供了一个配置项 events 来满足特殊的需求 (当然,我们建议修改组件内部,来满足业务需求),他的写法同 EVENTS 的写法。

紧急情况下,我们可以这么做:

KISSY.use('helloworld', function(S, HelloWorld) {
    var events = {
        "#spanName":{
            click: function(e) {
                top.console.log('我是自定义点击');
            }
        }};
    var config = {
        name: 'World',
        tmpl: '#helloworld1',
        events: events
    };
    var helloworld = new HelloWorld(config);
});