polymer - 开火事件过早
问题描述
我正在使用 <paper-dialog> 来显示我将以编程方式构建的 SVG 图像。在开始之前,我需要知道渲染容器的大小。我正在等待打开的属性更改为 true,但这显然太快了,因为 .clientWidth 在触发时为 0,但是稍后 .clientWidth 确实提供了正确的值。
<paper-dialog class="dialog" opened={{modalOpen}} modal>
<svg width="100%", height="100%" />
</paper-dialog>
如何等待计算 SVG clientWidth 和 clientHeight?
解决方案
有时 JS 事件在 DOM 有时间完成处理之前被触发,这里似乎就是这种情况。
要解决这个问题(或至少提供有关正在发生的事情的其他线索),请尝试将您的代码(用于clientWidth
属性)放在一个setTimeout()
函数中并给它一个零 (0) 毫秒超时。这只会将您的代码移动到 JS 执行堆栈的末尾,该堆栈应仅在 DOM 完成更新后处理......并且随后是 DOM 元素的大小和定位属性可用时。
这是一个例子......
modalOpen() {
setTimeout( () => {
/* Your code here... for example... */
const paperDialog = document.getElementsByTagName("paper-dialog")[0];
console.log("paperDialog width = ", paperDialog.clientWidth);
}, 0); /* 0 milliseconds = Execute immediately after everything else processes. */
}
警告:使用setTimeout()
通常不受欢迎,因为它不完全遵循异步开发并且可能产生意想不到的结果(例如过早触发或不尽快触发)。虽然这种方法很快并且在某些时候可以正常工作,但触发和处理事件通常是解决这些时序问题的最佳方法。
推荐阅读
- html - Html/Css 有时无法正确显示/加载,这是在没有任何模式的情况下发生的
- loops - 编写一个代码,该代码将平均一个学生的一组成绩并返回该学生的字母成绩
- macos - 如何在 OS X 中递归删除所有文件和文件夹名称中的所有空格?
- javascript - 使用 for 循环结果作为类名
- scala - Scala 中的通用过滤器函数中的错误
- java - 打开失败:EACCES(权限被拒绝)并尝试在空对象引用上调用虚拟方法“int android.graphics.Bitmap.getWidth()”
- javascript - 从索引为 1 到 5 Javascript 的数组中返回项目
- python - 匹配两个列表字段python的最快方法
- javascript - 上传时无法通过 jQuery 显示图像
- case - 公式时的netsuite案例