我创建了一个名为“memory-box”的自定义元素,如下面的代码所示 请注意“memory-box-template”中的“logthis”功能。
存储器box.html
<template id="memory-box-template">
<input id="memory-box" type="form" />
<input type="button" id="testbutton" />
<script type="text/javascript">
function logthis(me){
console.log(me);
}
</script>
</template>
<script type="text/javascript">
(function() {
var thisDoc = document.currentScript.ownerDocument;
var storage = localStorage;
var proto = Object.create(HTMLElement.prototype, {
createdCallback: {
value: function() {
var temp = thisDoc.querySelector('#memory-box-template');
var con = document.importNode(temp.content, true);
this.createShadowRoot().appendChild(con);
var input = this.querySelector('::shadow #memory-box');
var data = storage.getItem(this.id);
input.value = data;
input.addEventListener('input', saveData.bind(input, this.id));
}
},
});
document.registerElement('memory-box', {
prototype: proto
});
function saveData(id, e) {
storage.setItem(id, this.value);
}
})();
</script>
现在,我使用自定义元素“memory-box”,如下面的代码。
的index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="import" href="/html/memory-box.html">
</head>
<body>
<div><memory-box id="memory1"></memory-box></div>
<div><memory-box id="memory2"></memory-box></div>
<div><memory-box id="memory3"></memory-box></div>
<div><memory-box id="memory4"></memory-box></div>
</body>
<script type="text/javascript">
logthis(this);
</script>
</html>
正如你所看到的,我在index.html中添加了一个脚本并将其称为“logthis”,因为我很好奇。并且没有发生错误
为什么呢?
函数“logthis”在每个阴影中。我认为它不应该在影子dom之外调用。
答案 0 :(得分:5)
正如here所解释的那样,虽然封装了Shadow DOM中的HTML,但任何JavaScript都不是 - 它在全局范围内,除非您使用特定的JavaScript技术(namescaping,IIFE)来执行此操作。
希望这有帮助,
Jonathan Dodd