如何向聚合物自定义元素的子元素添加点击监听器?
How to add a click listener to polymer custom element's child?
我正在尝试将点击侦听器添加到 "created" 生命周期回调中自定义元素内的其中一个按钮(甚至尝试 "ready" 具有相同结果的回调)。
我遇到错误 "button element is undefined/null"。
注:
一个。我不能像这样为整个自定义组件添加点击侦听器。
listeners: {
'click': '_onClick'
},
我只需要给按钮添加一个监听器。如何获得这个简单的东西?对不起,我听起来很天真。
b。由于 CSP 限制,无法执行内联脚本
<paper-button id='saveBtn' on-click="handleClick">
Save
</paper-button>
错误信息:
Uncaught TypeError: Cannot read property 'addEventListener' of null
Polymer.created @
elements-imports.csp.js:10596Polymer.Base._addFeature._invokeBehavior
@ elements-imports.csp.js:267Polymer.Base._addFeature._doBehavior @
elements-imports.csp.js:262Polymer.Base.createdCallback @
elements-imports.csp.js:97Polymer.Base._addFeature.instanceTemplate @
elements-imports.csp.js:535Polymer.Base._addFeature._stampTemplate @
elements-imports.csp.js:531Polymer.Base._addFeature._initFeatures @
elements-imports.csp.js:4627Polymer.attached @
elements-imports.csp.js:5612Polymer.Base._addFeature._invokeBehavior @
elements-imports.csp.js:267Polymer.Base._addFeature._doBehavior @
elements-imports.csp.js:262Polymer.Base.attachedCallback @
elements-imports.csp.js:102Polymer.Base._addFeature.attachedCallback @
elements-imports.csp.js:603Polymer.Base._addFeature._readySelf @
elements-imports.csp.js:591(anonymous function) @
elements-imports.csp.js:5554Polymer.ImportStatus._importsLoaded @
elements-imports.csp.js:5553(anonymous function) @
elements-imports.csp.js:5564checkDone @
webcomponents-lite.js:968watchImportsLoad @
webcomponents-lite.js:990(anonymous function) @
webcomponents-lite.js:939whenDocumentReady @
webcomponents-lite.js:957checkReady @ webcomponents-lite.js:952
自定义元素:
<dom-module id="my-form">
<template>
<div>
<paper-input id="inputName" label="Name" required error-message="Required Input"> Name </paper-input>
<paper-input id="inputServer" label="Server URL" required error-message="Required Input"> Server </paper-input>
<paper-input id="inputUsername" label="Username" required error-message="Required Input">Username</paper-input>
<paper-input id="inputPassword" label="Password" type="password" required error-message="Required Input" value="">Password</paper-input>
<div class="rows layout horizontal right-justified certificate">
<paper-button id='cancelBtn' tabindex="0">Cancel</paper-button>
<paper-button id='saveBtn' tabindex="0">Save</paper-button>
</div>
</div>
</template>
</dom-module>
<script>
Polymer({
is: 'my-form',
created: function() {
var saveBtn = document.querySelector('#saveBtn');
saveBtn.addEventListener('click', function() {
document.getElementById('inputName').validate();
document.getElementById('inputServer').validate();
document.getElementById('inputUsername').validate();
document.getElementById('inputPassword').validate();
});
},
});
on-click="handleClick"
不是内联代码,它只是一个属性,所以在CSP下工作得很好。
created()
太早了,你的元素还没制作好
ready()
此时您的元素已创建,但它们不一定在 document
中,因此使用 document.querySelector
(或 document.getElement*
)不是一个好主意。
但是,Polymer 通过 id 作为 属性 提供模板中的元素映射,称为 $
,因此您可以编写 var saveBtn = this.$.saveBtn
(但您应该使用 on-click
代替)。
我正在尝试将点击侦听器添加到 "created" 生命周期回调中自定义元素内的其中一个按钮(甚至尝试 "ready" 具有相同结果的回调)。
我遇到错误 "button element is undefined/null"。
注:
一个。我不能像这样为整个自定义组件添加点击侦听器。
listeners: {
'click': '_onClick'
},
我只需要给按钮添加一个监听器。如何获得这个简单的东西?对不起,我听起来很天真。
b。由于 CSP 限制,无法执行内联脚本
<paper-button id='saveBtn' on-click="handleClick">
Save
</paper-button>
错误信息:
Uncaught TypeError: Cannot read property 'addEventListener' of null
Polymer.created @ elements-imports.csp.js:10596Polymer.Base._addFeature._invokeBehavior @ elements-imports.csp.js:267Polymer.Base._addFeature._doBehavior @ elements-imports.csp.js:262Polymer.Base.createdCallback @ elements-imports.csp.js:97Polymer.Base._addFeature.instanceTemplate @ elements-imports.csp.js:535Polymer.Base._addFeature._stampTemplate @ elements-imports.csp.js:531Polymer.Base._addFeature._initFeatures @ elements-imports.csp.js:4627Polymer.attached @ elements-imports.csp.js:5612Polymer.Base._addFeature._invokeBehavior @ elements-imports.csp.js:267Polymer.Base._addFeature._doBehavior @ elements-imports.csp.js:262Polymer.Base.attachedCallback @ elements-imports.csp.js:102Polymer.Base._addFeature.attachedCallback @ elements-imports.csp.js:603Polymer.Base._addFeature._readySelf @ elements-imports.csp.js:591(anonymous function) @ elements-imports.csp.js:5554Polymer.ImportStatus._importsLoaded @ elements-imports.csp.js:5553(anonymous function) @ elements-imports.csp.js:5564checkDone @ webcomponents-lite.js:968watchImportsLoad @ webcomponents-lite.js:990(anonymous function) @ webcomponents-lite.js:939whenDocumentReady @ webcomponents-lite.js:957checkReady @ webcomponents-lite.js:952
自定义元素:
<dom-module id="my-form">
<template>
<div>
<paper-input id="inputName" label="Name" required error-message="Required Input"> Name </paper-input>
<paper-input id="inputServer" label="Server URL" required error-message="Required Input"> Server </paper-input>
<paper-input id="inputUsername" label="Username" required error-message="Required Input">Username</paper-input>
<paper-input id="inputPassword" label="Password" type="password" required error-message="Required Input" value="">Password</paper-input>
<div class="rows layout horizontal right-justified certificate">
<paper-button id='cancelBtn' tabindex="0">Cancel</paper-button>
<paper-button id='saveBtn' tabindex="0">Save</paper-button>
</div>
</div>
</template>
</dom-module>
<script>
Polymer({
is: 'my-form',
created: function() {
var saveBtn = document.querySelector('#saveBtn');
saveBtn.addEventListener('click', function() {
document.getElementById('inputName').validate();
document.getElementById('inputServer').validate();
document.getElementById('inputUsername').validate();
document.getElementById('inputPassword').validate();
});
},
});
on-click="handleClick"
不是内联代码,它只是一个属性,所以在CSP下工作得很好。
created()
太早了,你的元素还没制作好
ready()
此时您的元素已创建,但它们不一定在 document
中,因此使用 document.querySelector
(或 document.getElement*
)不是一个好主意。
但是,Polymer 通过 id 作为 属性 提供模板中的元素映射,称为 $
,因此您可以编写 var saveBtn = this.$.saveBtn
(但您应该使用 on-click
代替)。