如何将JavaScript添加到自定义元素
How to add JavaScript to Custom Elements?
我有以下代码,它创建了一个自定义元素,用Shadow DOM封装:
'use strict'
var proto = Object.create(HTMLElement.prototype);
proto.createdCallback = function() {
var root = this.createShadowRoot();
var divEl = document.createElement('div');
divEl.setAttribute("id", "container");
divEl.innerHTML =
"<input id='input' type='text'>"
+ "<br>"
+ "Result: <span id='result'></span>"
+ "<br><button onclick='performTask()'>Run</button>";
root.appendChild(divEl);
};
document.registerElement('custom-ele', {
prototype: proto
});
其想法是,当单击"Run"时,将从input元素中获取输入并进行处理(在performTask()中),然后将输出放入"#result"中。我的两个问题是:
- 如何从Shadow DOM中的输入字段获取值
- 如何将输出放入#result
这个之前的堆栈溢出帖子看起来应该回答了我的问题,但所有建议的链接都不再有效,所以我想知道是否有人能给我指正确的方向:)
附言:我宁愿不使用模板,因为并非所有浏览器都支持HTML导入,而且我希望所有自定义元素代码都包含在一个文件中。
原来你可以向影子根本身添加函数,然后你可以在影子根上调用this.parentNode.fn(),直接让孩子访问shadowRoot。。。
proto.createdCallback = function() {
let root = this.createShadowRoot();
root.innerHTML = "<input id='input' type='text'>"
+ "<br>"
+ "Result: <span id='result'></span>"
+ "<br><button onclick='this.parentNode.process()'>Run</button>";
this.shadowRoot.process = function() {
let spanEle = this.querySelector('span');
let inputEle = this.querySelector('input');
spanEle.textContent = performAlgorithm(inputEle.value.split(','));
};
};
document.registerElement('custom-ele', { prototype: proto });
(感谢MarcG给我的初步见解)
关闭
您可以在Shadow DOM root
上使用方法querySelector
来获取内部元素:
'use strict'
var proto = Object.create( HTMLElement.prototype )
proto.createdCallback = function ()
{
//HTML ROOT
var root = this.createShadowRoot()
root.innerHTML = "<input id='input' type='text'>"
+ "<br>"
+ "Result: <span id='result'></span>"
+ "<br><button>Run</button>"
//UI
var buttonEle = root.querySelector( "button" )
var inputEle = root.querySelector( "input" )
var spanEle = root.querySelector( "#result" )
buttonEle.onclick = function ()
{
var input = inputEle.value
// do some processing...
spanEle.textContent = input
}
}
document.registerElement( 'custom-ele', { prototype: proto } )
注意:您可以在同一页面中使用不带HTML导入的template
。请参阅以下片段:
<html>
<body>
<custom-ele></custom-ele>
<template id="custelem">
<input id='input' type='text'>
<br>Result:
<span id='result'></span>
<br>
<button>Run</button>
</template>
<script>
var proto = Object.create(HTMLElement.prototype)
proto.createdCallback = function() {
//HTML ROOT
var root = this.createShadowRoot()
root.innerHTML = custelem.innerHTML
//UI
var buttonEle = root.querySelector("button")
var inputEle = root.querySelector("input")
var spanEle = root.querySelector("#result")
buttonEle.onclick = function() {
var input = inputEle.value
// do some processing...
spanEle.textContent = input
}
}
document.registerElement('custom-ele', {
prototype: proto
})
</script>
</body>
</html>
不关闭
如果您不想使用闭包,您可以在自定义元素上声明一个名为handleEvent
的方法,并添加一个将重定向到它的事件侦听器:
proto.createdCallback = function ()
{
//HTML ROOT
var root = this.createShadowRoot()
root.innerHTML = custelem.innerHTML
//EVENT
var buttonEle = root.querySelector( "button" )
buttonEle.addEventListener( "click", this )
}
proto.handleEvent = function ( ev )
{
var inputEle = this.shadowRoot.querySelector( "input" )
var spanEle = this.shadowRoot.querySelector( "#result" )
// do some processing...
spanEle.textContent = inputEle.value
}
相关文章:
- 如何使用javascript独立地为聚合物自定义元素的每个实例的lightdom设置样式
- 注册后是否可以定义HTML5自定义元素中的生命周期回调
- 如何在 Aurelia(奥雷利亚)中访问自定义元素中的变量
- Javascript 向影子根中的自定义元素添加函数
- 在自定义元素中扩展 HTMLCanvasElement 问题
- 聚合物 - 访问自定义元素内的 DOM 输入元素
- 在具有CONTENT标记的自定义元素中使用SELECT标记时出现问题
- 聚合物种子-自定义元素依赖关系
- 自定义元素在JavaScript中创建
- 访问嵌套Polymer自定义元素中的JavaScript方法
- 当.js和.html不在同一文件夹中时,如何在Aurelia中创建自定义元素
- 自定义元素之间的聚合物双向结合[包括示例]
- 从 React 中的自定义元素中修改属性
- 聚合物:创建一个“;一般的“;自定义元素
- Aurelia-仅HTML自定义元素的内联定义
- 手动编译由 aurelia 中的其他自定义元素组成的 dom 元素
- 为什么我们必须注册一个自定义元素
- 聚合物自定义元素和聚合物手势
- 在 aurelia 中使用 repeat.for 绑定自定义元素的正确方法是什么
- 根据在单选按钮中选择的值隐藏时间表中的自定义元素