在自定义元素阴影中选择槽文本 DOM
Selecting slot text in Custom Element Shadow DOM
我用正则 html/css/js 制作了一个简单的复制粘贴组件。我试图将它变成一个网络组件,但无法再让复制粘贴行为起作用。
阴影里面的标记 DOM 基本上是
<span contenteditable="true">
<slot></slot>
</span>
<button>Copy</button>
Javascript:
class CopyPaste extends HTMLElement {
constructor() {
super();
let shadowRoot = this.attachShadow({mode: 'open'});
shadowRoot.appendChild(copyPasteTemplate.content.cloneNode(true));
}
connectedCallback() {
let copyButton = this.shadowRoot.querySelector('button');
let textToCopy = this.shadowRoot.querySelector('span');
function selectElementContents(el) {
var range = document.createRange();
range.selectNodeContents(el);
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
}
function copyText() {
selectElementContents(textToCopy);
document.execCommand('copy');
}
copyButton.addEventListener('click', copyText);
textToCopy.addEventListener('click', copyText);
}
}
window.customElements.define('copy-paste', CopyPaste);
在您的示例中,textToCopy
变量引用 <slot>
元素,其中没有文本。
如果要从<copy-paste>
元素的light DOM获取分布式节点,应该使用<slot>
元素的assignedNodes()
方法:
let textToCopy = this.shadowRoot.querySelector('slot').assignedNodes()[0];
PS:请注意,contenteditable
属性可能无法像您在给定示例中预期的那样工作。
我用正则 html/css/js 制作了一个简单的复制粘贴组件。我试图将它变成一个网络组件,但无法再让复制粘贴行为起作用。
阴影里面的标记 DOM 基本上是
<span contenteditable="true">
<slot></slot>
</span>
<button>Copy</button>
Javascript:
class CopyPaste extends HTMLElement {
constructor() {
super();
let shadowRoot = this.attachShadow({mode: 'open'});
shadowRoot.appendChild(copyPasteTemplate.content.cloneNode(true));
}
connectedCallback() {
let copyButton = this.shadowRoot.querySelector('button');
let textToCopy = this.shadowRoot.querySelector('span');
function selectElementContents(el) {
var range = document.createRange();
range.selectNodeContents(el);
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
}
function copyText() {
selectElementContents(textToCopy);
document.execCommand('copy');
}
copyButton.addEventListener('click', copyText);
textToCopy.addEventListener('click', copyText);
}
}
window.customElements.define('copy-paste', CopyPaste);
在您的示例中,textToCopy
变量引用 <slot>
元素,其中没有文本。
如果要从<copy-paste>
元素的light DOM获取分布式节点,应该使用<slot>
元素的assignedNodes()
方法:
let textToCopy = this.shadowRoot.querySelector('slot').assignedNodes()[0];
PS:请注意,contenteditable
属性可能无法像您在给定示例中预期的那样工作。