iron-a11y-keys提供一个符合WAI-ARIA best practices处理键盘命令的一个规范化的接口,元素负责浏览器键盘事件差别和使用一个表达语法过滤按键。
使用的键属性表达组合键将触发事件触发
使用目标属性在一个特定的节点设置事件处理程序。按下一个组合键设置键属性触发对应的按键事件。html
Example:node
这个元素将在如下符号元素按下时触发arrowHandler:浏览器
<iron-a11y-keys target="{{}}" keys="up down left right" on-keys-pressed="{{arrowHandler}}"> </iron-a11y-keys>
键语法:
键属性能够接受一个空格分离 +链接组修饰键和一些常见的键盘键dom
键盘能够用如下按键: a-z, 0-9 (top row and number pad), * (shift 8 and number pad), F1-F12, Page Up, Page Down, Left Arrow, Right Arrow, Down Arrow, Up Arrow, Home, End, Escape, Space, Tab, and Enter keys函数
修饰键能够用如下按键: Shift, Control, and Altthis
全部键盘键能够使用小写和简写: Left Arrow is left, Page Down is pagedown, Control is ctrl, F1 is f1, Escape is esc etc.spa
给键盘设置如下属性 "ctrl+shift+f7 up pagedown esc space alt+m", <iron-a11y-keys>
元素设置keys-pressed事件 当如下按键按下: Control and Shift and F7 keys, Up Arrow key, Page Down key, Escape key, Space key, Alt and M key.code
Keys Syntax Grammar:
键盘语法规定:server
EBNF语法的关键属性 .htm
modifier = "shift" | "ctrl" | "alt"; ascii = ? /[a-z0-9]/ ? ; fnkey = ? f1 through f12 ? ; arrow = "up" | "down" | "left" | "right" ; key = "tab" | "esc" | "space" | "*" | "pageup" | "pagedown" | "home" | "end" | arrow | ascii | fnkey ; keycombo = { modifier, "+" }, key ; keys = keycombo, { " ", keycombo } ;
API 参考
Properties | --- | --- |
---|---|---|
keys | String | default: '' |
target | ?Node |
bower install --save PolymerElements/iron-a11y-keys#^1.0.0
恩 iron-a11y-keys 还要安装依赖库 iron-a11y-keys-behavior
bower install --save PolymerElements/iron-a11y-keys-behavior#^1.0.0
分析如下代码 iron-a11y-keys
Polymer({ is: 'iron-a11y-keys', behaviors: [ Polymer.IronA11yKeysBehavior ], properties: { /** @type {?Node} */ target: { type: Object, observer: '_targetChanged' }, keys: { type: String, reflectToAttribute: true, observer: '_keysChanged' } }, attached: function() { if (!this.target) { this.target = this.parentNode; } }, _targetChanged: function(target) { this.keyEventTarget = target; }, _keysChanged: function() { this.removeOwnKeyBindings(); this.addOwnKeyBinding(this.keys, '_fireKeysPressed'); }, _fireKeysPressed: function(event) { this.fire('keys-pressed', event.detail, {}); } });
观察属性发现target {?Node} 是一个 dom node 元素??? 搞什么 querySelector 怎么办
behaviors
polymer支持扩展定制元素的原型与共享的代码模块,称为行为 恩 有点像mixin 一个行为是一个对象,相似于一个典型的聚合物原型 能够定义行为lifecycle callbacks , declared properties, default attributes, observers, and listeners.
behaviors 是polymer的属性 类型array 放置behavior
Polymer({ is: 'super-element', behaviors: [SuperBehavior] })
polymer先执行当前元素的生命循环 在执行behviors里的生命循环
行为对象上的任何非周期函数混入基原型。这些多是添加的API或实施的行为规定观察员或事件侦听器回调颇有用的。在原型定义的函数老是优先于一个行为定义的函数。若是有多个行为定义相同的功能, 最后在行为中的行为排列优先。
能够参照元素定义来定义行为
highlight-behavior.html:
<script> HighlightBehavior = { properties: { isHighlighted: { type: Boolean, value: false, notify: true, observer: '_highlightChanged' } }, listeners: { click: '_toggleHighlight' }, created: function() { console.log('Highlighting for ', this, 'enabled!'); }, _toggleHighlight: function() { this.isHighlighted = !this.isHighlighted; }, _highlightChanged: function(value) { this.toggleClass('highlighted', value); } }; </script>
my-element.html:
<link rel="import" href="highlight-behavior.html"> <script> Polymer({ is: 'my-element', behaviors: [HighlightBehavior] }); </script>
使用命名空间保护本身的行为不冲突
MyBehaviors = MyBehaviors || {}; MyBehaviors.HighlightBehavior = { ... }
Extending behaviors:
<!-- import an existing behavior --> <link rel="import" href="oldbehavior.html"> <script> // Implement the extended behavior NewBehaviorImpl = { // new stuff here } // Define the behavior NewBehavior = [ OldBehavior, NewBehaviorImpl ] </script>
类型: boolean
设置为'真',当property值发生变化以使相应的attribute上变化。若是属性值是布尔值,使用标准的HTML布尔属性(若是是真则设置,若是是假的则不设置)。对于其余的属性类型,属性值是属性值的字符串表示。
类型: String
设置一个观察者函数
properties: { /** @type {?Node} */ target: { type: Object, observer: '_targetChanged' }, keys: { type: String, reflectToAttribute: true, observer: '_keysChanged' } },
恩 没有target 我也本身找一个
attached: function() { if (!this.target) { this.target = this.parentNode; } },
keyEventTarget 是由iron-a11y-keys-behavior混合过来的
当_keysChanged时触发_fireKeysPressed事件
_targetChanged: function(target) { this.keyEventTarget = target; }, _keysChanged: function() { this.removeOwnKeyBindings(); this.addOwnKeyBinding(this.keys, '_fireKeysPressed'); }, _fireKeysPressed: function(event) { this.fire('keys-pressed', event.detail, {}); }