- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个提供 API 方法 sayHello
的自定义元素。如果元素从 DOM 中删除,我需要在 disconnectedCallback
中“销毁”对自定义元素的所有引用。我怎样才能做到这一点?
class RemoveEl extends HTMLButtonElement {
constructor() {
super();
this.type= 'button';
this.addEventListener('click', () => {
this.parentElement.removeChild(this);
})
}
sayHello() {
console.log('hello');
}
disconnectedCallback() {
if (!document.body.contains(this)) {
console.log('removed');
// here I need something like
// this = null;
}
}
}
customElements.define('remove-el', RemoveEl, { extends: 'button' });
var sayHello = document.getElementById('sayHello');
var removeEl = document.getElementById('removeEl');
sayHello.addEventListener('click', () => {
if (removeEl) {
removeEl.sayHello();
}
})
<div>Test:
<button is="remove-el" id="removeEl">Click to remove</button>
<button id="sayHello" type="button">Say Hello</button>
</div>
最佳答案
根据我的理解,只要您在 JavaScript 端持有对元素的引用,垃圾收集器就无法销毁您的元素,即使它已从 DOM 中删除也是如此。您的元素仍然存在,您将能够调用它的方法。
您必须自己管理引用资料。在自定义元素的 disconnectedCallback
中,设置一个属性以将其标记为已删除,例如:this.destroyed = true
。
然后您可以使用该属性来保护访问,但该元素不会被垃圾回收:
class RemoveEl extends HTMLButtonElement {
constructor() {
super();
this.type= 'button';
this.addEventListener('click', () => {
this.parentElement.removeChild(this);
})
}
sayHello() {
console.log('hello');
}
disconnectedCallback() {
if (!document.body.contains(this)) {
this.destroyed = true;
console.log('removed');
}
}
}
customElements.define('remove-el', RemoveEl, { extends: 'button' });
const sayHello = document.getElementById('sayHello');
const removeEl = document.getElementById('removeEl');
sayHello.addEventListener('click', () => {
if (removeEl && !removeEl.destroyed) {
removeEl.sayHello();
}
})
<div>Test:
<button is="remove-el" id="removeEl">Click to remove</button>
<button id="sayHello" type="button">Say Hello</button>
</div>
或者创建一个引用包装器,仅当内部引用有效时才能在其上应用函数,垃圾收集仍然无法销毁该引用,因为由于 do
使用 el
的函数:
class RemoveEl extends HTMLButtonElement {
constructor() {
super();
this.type= 'button';
this.addEventListener('click', () => {
this.parentElement.removeChild(this);
})
}
sayHello() {
console.log('hello');
}
disconnectedCallback() {
if (!document.body.contains(this)) {
this.destroyed = true;
console.log('removed');
}
}
}
customElements.define('remove-el', RemoveEl, { extends: 'button' });
const ref = el => ({ do: fn => { if (el && !el.destroyed) fn(el); } })
const sayHello = document.getElementById('sayHello');
const removeEl = ref(document.getElementById('removeEl'));
sayHello.addEventListener('click', () => {
removeEl.do(el => el.sayHello());
})
<div>Test:
<button is="remove-el" id="removeEl">Click to remove</button>
<button id="sayHello" type="button">Say Hello</button>
</div>
或者您可以使用代理来管理该引用。只要 destroyed
为 false,就会在对象上调用这些方法,但是一旦代理检测到 destroyed = true
,它就会返回默认值属性并销毁它自己对该元素的引用,这有望让垃圾收集器摆脱它。
有点像这样:
class RemoveEl extends HTMLButtonElement {
constructor() {
super();
this.type= 'button';
this.addEventListener('click', () => {
this.parentElement.removeChild(this);
})
}
sayHello() {
console.log('hello');
}
disconnectedCallback() {
if (!document.body.contains(this)) {
this.destroyed = true;
console.log('removed');
}
}
}
customElements.define('remove-el', RemoveEl, { extends: 'button' });
const ref = (el, defaultEl) => {
let destroyed = el.destroyed;
const checkEl = () => {
if (!destroyed && el && el.destroyed) {
destroyed = true;
el = null;
}
return destroyed;
}
return new Proxy({}, {
get: (obj, prop) => {
return checkEl() ? defaultEl[prop] : el[prop];
}
});
}
const sayHello = document.getElementById('sayHello');
const removeEl = ref(document.getElementById('removeEl'), { sayHello: () => console.log('bye') });
sayHello.addEventListener('click', () => {
removeEl.sayHello();
})
<div>Test:
<button is="remove-el" id="removeEl">Click to remove</button>
<button id="sayHello" type="button">Say Hello</button>
</div>
关于javascript - 在 disconnectedCallback 中取消从 DOM 中删除的自定义元素的所有引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54923839/
我有一个提供 API 方法 sayHello 的自定义元素。如果元素从 DOM 中删除,我需要在 disconnectedCallback 中“销毁”对自定义元素的所有引用。我怎样才能做到这一点? c
spec说: However, note that connectedCallback can be called more than once, so any initialization work
我想知道我是否在正确的轨道上 目标:需要确保所有元素最终都在 shadowDOM 中 因此手动创建的 HTML 文件 A B 在 的 lightDOM 中创建卡片 如果我然后将它们移动到
我正在为 Web 组件构建一个 TypeScript mixin 以添加拖动行为。到目前为止,一切都进展顺利。但是,在可拖动 Web 组件断开连接后尝试删除事件监听器时,我遇到了一个难题。 drag.
我是一名优秀的程序员,十分优秀!