javascript Animation.commitStyles:未渲染目标

k4emjkb1  于 2023-03-16  发布在  Java
关注(0)|答案(1)|浏览(130)

我在网页上使用JavaScript动画。现在我注意到我得到这个错误:
未捕获DOM异常:Animation.commitStyles:未渲染目标
我找不到任何关于这个的信息。这是什么意思?在Windows上的Firefox 110中会发生这种情况。在Chrome 111中也会发生同样的错误:
未捕获DOM异常:无法对“动画”执行“commitStyles”:不呈现目标元素。
代码如下所示:

let keep = undefined;
let anim = this.first.animate(keyframes, {
    duration: duration,
    fill: keep !== false ? "forwards" : "none"
});
if (keep !== false) {
    anim.addEventListener("finish", () => {
        anim.commitStyles();
        anim.cancel();
    });
}
ccrfmcuu

ccrfmcuu1#

未呈现目标元素

当您尝试对DOM中未 * render * 的元素执行commitStyles时,您将看到浏览器API抛出Target element is not rendered异常。
最有可能的是,您试图设置commitStyles的元素具有使该元素不呈现的CSS规则。
display: none
您可以通过检查元素是否已呈现来防止出现异常。
This answer详细介绍了检查元素是否已呈现的合理方法。

示例/模拟

通常,您可以在调用commitStyles之前检查元素是否已呈现

const divElem1 = document.querySelector(".item");

const toggleClass = () => {
  divElem1.classList.toggle("display-none");
}

function isHidden(el) {
  return (el.offsetParent === null)
}

let isSafeguarding = true;
const toggleSafeguard = (e) => {
  isSafeguarding = !isSafeguarding
  e.target.textContent = `safeguard is: ${isSafeguarding?'ON':'OFF'}`

}

document.body.addEventListener("mousemove", (evt) => {
  const anim1 = divElem1.animate({
    transform: `translate(${evt.clientX}px, ${evt.clientY}px)`
  }, {
    duration: 500,
    fill: "forwards"
  });

  if (!isSafeguarding || !isHidden(divElem1)) {
    anim1.commitStyles();
  }
});
.item {
  padding: 50px;
  display: inline-block;
  border: 2px solid navy;
  background-color: azure;
  position:absolute;
}

.item.display-none {
  display: none;
}

body {
  background-color: PeachPuff;
  width: 100vw;
  height: 100vh;
}

button {
  margin: 6px;
}
<div class="item one">moves to pointer</div>
<div>
  <div>Hide the element and turn off the safeguard to see an error.</div>
  <button onClick="toggleClass()">toggle display:none</button>
  <button onClick="toggleSafeguard(event)">safeguard is: ON</button>
</div>

结束语:

commitStyles相对较新,在mayor浏览器中的采用大约始于2020
这可能就是为什么社区中提供的文档仍然很少的原因。
从某种意义上说,你是在为将来谷歌搜索这个特定错误提供文档😁。
如果您喜欢阅读 chrome 源,则可以看到抛出错误的确切位置和条件。
如果您喜欢阅读规范,这里有一个特定于提交样式的条目

相关问题