浅谈JavaScript的Polymer框架中的事件绑定
既然是一套完整的前端框架那就一定有提供事件绑定相关的支持。其实在之前的例子中就使用过事件绑定,只是没有单独系统地介绍过而已。Polymer的事件思想是对事件处理函数尽可能地都命名并定义到VM上,我觉得这个做法是在有意地把VM这一层隔离出来。
下面这个例子给按钮和其所在的ShadowDOMHost都绑定了个事件,点击按钮后两个事件都会触发。
运行
<script>varPolymer={dom:'shadow'};</script>
<basehref="http://www.web-tinker.com/share/"/>
<linkrel="import"href="polymer/polymer.html"/>
<dom-moduleid="demo-test">
<template>
<buttonon-click="clickHandler">求点击(=~ω~=)</button>
</template>
<script>
Polymer({
is:'demo-test',
listeners:{
'click':'clickHandler'
},
clickHandler:function(e){
console.log(e.target);
}
});
</script>
</dom-module>
<demo-test></demo-test>
listeners是一个用于给当前ShadowDOMHost添加事件的(虽然我觉得它没卵用)。直接在DOM元素上的on-*属性也可以给某个元素绑定事件。这些方式绑定的都是DOM事件,事件触发时传递过去的对象就是原生的事件对象。
除了以上这些直接作为属性设置的事件绑定方式之外,我们还可以动态地绑定事件。
运行
<script>varPolymer={dom:'shadow'};</script>
<basehref="http://www.web-tinker.com/share/"/>
<linkrel="import"href="polymer/polymer.html"/>
<dom-moduleid="demo-test">
<template>
<button>求点击(=~ω~=)</button>
</template>
<script>
Polymer({
is:'demo-test',
ready:function(){
//Polymer内置
this.listen(this,'click','clickHandler');
//原生
this.addEventListener('click',this.clickHandler);
},
clickHandler:function(e){
console.log(e);
}
});
</script>
</dom-module>
<demo-test></demo-test>
Polymer总是希望我们对事件处理函数命名,比如其自带的listen方法对元素绑定的不是一个事件处理函数,而是一个事件处理函数名。也许这么做的目的是将VM和M完全隔离开来,但是我并不喜欢这样。不过ShadowDOMHost本身也是一个原生对象,所以直接使用原生的addEventListener也是可以的,不过既然框架内有提供,我也不推荐写原生。也许是我的思想太low的,无法领悟Polymer如此设计的良苦用心吧?