我对javascript相当陌生,并且一直在玩网络组件。我想访问 web 组件的 shadow DOM 中元素的 CSS color 属性。当我使用 getComputedStyle() 方法时,我无法访问在 connectedCallback 中运行的样式属性。
在这里,我试图访问颜色属性,在将值记录到控制台时它显示 RGB(0, 0, 0) 而在等待一毫秒然后记录时,RGB(0, 128, 0) 的正确值显示向上。为什么会这样?
我认为这是因为当我第一次运行该函数时尚未计算样式?对此有什么更优雅的解决方案?我怎样才能完全等到样式被计算出来才能运行我的函数,而不是我现在指定的任意时间?
JS
document.addEventListener('DOMContentLoaded',()=>{
class CustomComponent extends HTMLElement{
constructor(){
super();
this.attachShadow({mode:'open'});
const template=document.querySelector('#component');
this.shadowRoot.appendChild(template.content.cloneNode(true));
};
connectedCallback(){
console.log('Element added to DOM');
let text=this.shadowRoot.querySelector('.text');
console.log(getComputedStyle(text).getPropertyValue('color'));
setTimeout(()=>{console.log(getComputedStyle(text).getPropertyValue('color'))},1)
};
};
customElements.define('custom-component',CustomComponent);
});
CSS
.container{
--color-variable:#f2c846;
}
.text{
color:green;
}
HTML
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title>Random title</title>
<script src='./CustomComponent.js'></script>
</head>
<body>
<template id='component'>
<link rel='stylesheet' href='./CustomComponent.css'/>
<div class=container>
<div class='text'>
Colored Text
</div>
</div>
</template>
<custom-component>
</custom-component>
</body>
</html>