polymer 扩展标签库iron介绍 (二) iron-a11y-keys

 阅读约 12 分钟

iron-a11y-keys介绍

iron-a11y-keys提供一个符合WAI-ARIA best practices处理键盘命令的一个规范化的接口,元素负责浏览器键盘事件差异和使用一个表达语法过滤按键。
使用的键属性表达组合键将触发事件触发
使用目标属性在一个特定的节点设置事件处理程序。按下一个组合键设置键属性触发对应的按键事件。

Example:

这个元素将在以下符号元素按下时触发arrowHandler:

<iron-a11y-keys target="{{}}" keys="up down left right" 
    on-keys-pressed="{{arrowHandler}}">
</iron-a11y-keys>

键语法:
键属性可以接受一个空格分离 +连接组修饰键和一些常见的键盘键

键盘可以用以下按键: 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 Alt

所有键盘键可以使用小写和简写: Left Arrow is left, Page Down is pagedown, Control is ctrl, F1 is f1, Escape is esc etc.

给键盘设置以下属性 "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.

Keys Syntax Grammar:
键盘语法规定:

EBNF语法的关键属性 .

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

iron-a11y-keys安装

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>

reflectToAttribute

类型: boolean
设置为'真',当property值发生变化以使相应的attribute上变化。如果属性值是布尔值,使用标准的HTML布尔属性(如果是真则设置,如果是假的则不设置)。对于其他的属性类型,属性值是属性值的字符串表示。

observer

类型: 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, {});
    }
阅读 1.4k发布于 2015-08-02

推荐阅读
月西江
用户专栏

日暮江水远  入夜随风潜(迁)秋叶乱水月  疏影倚窗边夜末香未眠  寻花情已倦愁上晚柳月 思念两处闲...

10 人关注
28 篇文章
专栏主页
目录