Полимерные событие click не срабатывает

на данный момент я пробую свои первые шаги с полимерным. Теперь у меня есть простая страница с бумажной кнопкой, но я не могу зарегистрировать событие click для нее. Я пробовал с этим кодом:

<paper-button raisedButton 
              id="test"
              class="colored" 
              label="Click"
              link="http://twitter.com"
              on-click="{{ goLink }}">
</paper-button>

<script>
        Polymer('#test', {
            goLink: function(e) 
            {
                window.location.href = e.target.getAttribute('link');
            }
       });
</script>

событие click не срабатывает. Что не так с кодом? И второй вопрос: Должен ли я использовать on-click или on-tab в моем коде?

3 ответов


вы не можете определить полимерный компонент, просто вызвав Polymer() функция с идентификатором некоторого произвольного элемента. Либо вам нужно создать полимерный элемент, который содержит кнопку и код обработчика так:

<body unresolved>

  <polymer-element name="link-button">
    <template>
      <paper-button raisedButton id="test" class="colored"
        label="Click" link="http://twitter.com"
        on-click="{{ goLink }}">
      </paper-button>
    </template>
    <script>
      Polymer('link-button', {
        goLink: function(e) {
          window.location.href = e.target.getAttribute('link');
        }
      })
    </script>
  </polymer-element>

  <link-button></link-button>

</body>

или вам нужно обернуть кнопку в авто-привязка шаблона:

<body unresolved>

  <template id="bind" is="auto-binding">
    <paper-button raisedButton id="test" class="colored"
      label="Click" link="http://twitter.com"
      on-click="{{ goLink }}">
    </paper-button>
  </template>

  <script>
    var bind = document.querySelector('#bind');
    bind.goLink = function(e) {
      window.location.href = e.target.getAttribute('link');
    }
  </script>

</body>

С первой версией вы можете создать многоразовый link-button элемент, если вы преобразуете жестко закодированную ссылку (и, возможно, некоторые другие значения) в атрибуты.

и кстати. вы можете использовать "on-tap" или "on-click". Оба события запускаются при нажатии кнопки с помощью мыши.

Edit:

если все, что вам нужно, это кнопка fancy paper, вы можете обойтись без какого-либо полимерного программирования, просто добавив прослушиватель событий к элементу:

<paper-button raisedButton id="test" class="colored"
  label="Click" link="http://twitter.com">
</paper-button>

<script>
  document.querySelector('#test').addEventListener('click', function(e) {
    window.location.href = e.target.getAttribute('link');
  })
</script>

но я думаю, что вы пропустите много силы полимера (и веб-компонентов в целом), если вы сосредоточитесь только на компонент-потребительская сторона.


Я знаю, что это старая нить, но потому, что больше людей могут получить здесь, как я, см. ниже Правильный и обновленный ответ, полимер 1.X совместимость (ответ Дирка Граппендорфа был довольно прав, но устарел):

для создания полимерного элемента:

<dom-module id="module-name">
  <style>
    Enter your CSS style here
  </style>
  <template>
    <paper-button raisedButton id="test" link="http://twitter.com" on-tap="goLink">Click</paper-button>
  </template>
  <script>
    Polymer({
      is: 'module-name',
      goLink: function(e) {
        window.location.href = e.target.getAttribute('link');
      }
    });
  </script>
</dom-module>

чтобы создать шаблон автоматической привязки:

<template id="bind" is="dom-bind">
  <paper-button raisedButton id="test" link="http://twitter.com" on-tap="goLink">Click</paper-button>
</template>
<script>
  var bind = document.querySelector('#bind');
  bind.goLink = function(e) {
    window.location.href = e.target.getAttribute('link');
  };
</script> 

или с помощью слушателей:

<paper-button raisedButton id="test" link="http://twitter.com">Click</paper-button>
<script>
  var button = document.getElementById('test');
  button.addEventListener('tap', function(e) {
    window.location.href = e.target.getAttribute('link');
  });
</script>

Paper-icon-button и paper-fab работают точно так же.

что выбрать? Я бы выберите создать элемент, если я собираюсь повторно использовать эту кнопку в нескольких проектах или в других частях того же проекта; автоматическая привязка, если я не собираюсь повторно использовать этот код, но мой интерфейс имеет много событий для обработки (проще инкапсулировать весь пользовательский интерфейс в один шаблон DOM-bind и создать все необходимые обработчики с помощью bind.синтаксис handlerName, чем создавать прослушиватели для всех элементов пользовательского интерфейса, которые запускают события - и один прослушиватель для каждого события запускает один и тот же элемент). И опции , прослушиватели, только если то, что я хочу, не может быть выполнено другими параметрами (например, когда вы запускаете пользовательские события) или на странице есть только 1 или 2 события (в этом случае код кажется короче, чем другие параметры).


для полимера 2, вы сделали бы это:

<dom-bind id='top'>
  <template>
   <paper-button raisedButton id="test" link="http://twitter.com" on-tap="goLink">Click</paper-button>
  </template>
</dom-bind>

<script>
  const bind = document.getElementById('top');
  bind.goLink = ()=>{ }
</script>

ваш шаблон немедленно помечается, и все привязки данных относятся к элементу DOM bind.

вы могли бы даже добавить 2 способ привязки и т. д. Например:
<dom-bind id='top'>
  <template>
   <paper-button raisedButton id="test" link="[[url]]" on-tap="goLink">[[display]]</paper-button>
  </template>
</dom-bind>

<script>
  const bind = document.getElementById('top');
  bind.goLink = ()=>{ }
  bind.url = 'http://twitter.com'
  bind.display = 'Click'
</script>

см.https://www.polymer-project.org/2.0/docs/devguide/templates#dom-bind


или для быстрого и грязного решения вы можете просто использовать глобальный обработчик событий (не лучшая идея хотя...).

<paper-button raisedButton id="test" link="http://twitter.com" onclick="goLink()">Click</paper-button>

<script>
  window.goLink = ()=>{}
</script>