轻松抓住Enter提交表格

时间:2014-07-27 22:37:12

标签: polymer-1.0

是否有一种简单的方法可以启用命令输入以执行带有纸张输入的表单的某些javascript。我可以抓住每个元素的击键,但这看起来很乏味。

2 个答案:

答案 0 :(得分:8)

使用当前的Polymer版本1.0,我可以使用iron-a11y-keys来解决这个问题。

这是绑定到整个表单的示例,它触发任何子输入元素的提交:

<iron-a11y-keys id="a11y" target="[[_form]]" keys="enter"
                  on-keys-pressed="submitForm"></iron-a11y-keys>
  <form is="iron-form" id="form"
        method="post"
        action="{{url}}">

...

Polymer({
  is: 'example-form',
  properties: {
    _form: {
      type: Object,
      value: function() {
        return this.$.form;
      }
    }
  },
  submitForm: function() {
    document.getElementById('form').submit();
  },

答案 1 :(得分:5)

目前(Polymer 0.3.4)当按下纸张输入中的回车键时,似乎没有事件被触发。但您可以扩展 paper-input 元素并添加此功能(请参阅Polymer doc中的Extending other elements):

<polymer-element name="my-paper-input" extends="paper-input">
  <template>
    <shadow></shadow>
  </template>
  ...
</polymer-element>

然后,您可以在按下返回键时触发自定义事件:

ready: function() {
  self = this;
  this.$.input.addEventListener('keypress', function(e) {
    if (e.keyCode == 13) {
      self.async(function() {
        self.fire('enter', self.value);
      });
    }
  });
}

为方便起见,输入值将传递给事件处理程序。现在你可以使用你的新元素了:

<my-paper-input ... on-enter="{{inputEntered}}"></my-paper-input>

编辑1:

由于事件在元素层次结构中冒泡,因此可以在周围的表单元素上捕获它:

<my-form on-enter="{{anyInputEntered}}" ...>

然后在一个地方获取所有输入元素的事件(可以通过调用事件对象上的stopPropagation();来停止事件传播。)

编辑2:

最好为自定义事件指定唯一名称,以便它们不会与将来可能添加的核心事件的名称发生冲突(例如my-unique-prefix-input-entered)。