javascript - 用特殊字符编码类样式属性
问题描述
我试图用样式属性填充两个 svg 元素。一个带有strokedashoffset,另一个带有transform: rotate。这是我预期的CSS:
<circle class="progressbar-line-timer" id="timerOffset"
style="strokedashoffset: 76.1942px;" r="48.5" cx="50" cy ="50"
/>
<circle class="progressbar-marker-timer" id="timerRotate"
style="transform: rotate(270deg);" r="6" cx="50" cy="1.5" />
我创建了一个函数来计算这两个值。
我正在尝试使用 getElementById() 来填充值。我已经为 svg 元素分配了一个 ID。
<circle class="progressbar-line-timer" id="timerOffset"
r="48.5" cx="50" cy ="50" />
<circle class="progressbar-marker-timer" id="timerRotate"
r="6" cx="50" cy="1.5" />
因为这些样式属性具有特殊字符 - 破折号、冒号和括号,所以我使用 encodeURI 对字符串进行编码,因为我读到它可以处理特殊字符。
我似乎无法获得正确的值来正确编码。我在 document.getElementById("timerOffset") 语句中收到此错误:
VM88:31 Uncaught TypeError: Cannot read property 'style' of
null
at <anonymous>:31:47
(anonymous) @ VM88:31
这是我的javascript代码:
//calculated values rotateTimer
// offsetTimer
// using escape to recognize the double quotes
timerURIComprotateHold = ('\"stroke-dashoffset: '+rotateTimer+'\"')
var timerURIComprotate = encodeURI(timerURIComprotateHold);
console.log('timerURIComprotate '+timerURIComprotate );
// erroring on this statement
document.getElementById("timerOffset").style.timerURIComprotate;
// calculated value of timerURIComprotate %22stroke-dashoffset:%20125.99999999999999px;%22
%22 引号和 %20 不是空格吗?这不应该吗?
我也尝试过 encodeURIComponent ,但没有运气。我可以尝试另一种编码方法吗?编码也需要处理括号,因为它们位于我要设置样式的第二个元素的样式属性中。
谢谢您的帮助。
解决方案
如果您的 JavaScript 没有通过其 ID 成功获取元素,则可能是您的 JavaScript 在元素被渲染之前被加载。也就是说:在你的 JavaScript 运行时,浏览器并不“知道”这些<circle>
元素。
Web 浏览器逐行执行您的代码,从上到下和从左到右执行您编写的代码,所以如果您的 JavaScript 在<script>
HTML 的第 5 行的标记中,并且您的<circle>
元素在第 32 行,您的 Web 浏览器将在读取 HTML 之前运行 JavaScript <circle>
。这就是为什么它说它不能修改style
“null”——它试图修改一些尚不存在的东西。
为了防止这种情况,您需要告诉浏览器在 DOM 的内容(所有 HTML 元素)加载之前不要运行 JavaScript。这通常通过以下两种方式之一完成:
window.addEventListener('DOMContentLoaded')
(参见https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded中的示例),或- 将 JavaScript 放在HTML 其余部分之后
<script>
的标记中,通常就在结束标记之前。</body>
推荐阅读
- firebase - Firebase 添加虚拟身份验证记录以进行无需验证的测试
- javascript - 如何在javascript中从html表单中获取数据
- html - 无法正确响应地制作图像网格堆栈。有两列堆叠不正确
- obfuscation - Red Gate - .NET Reflector Visual Studio Extension 版本 10 - Visual Studio 2017 - 需要禁用混淆
- c# - 如何通过 c# 在图像中播放材质的着色器?(统一 5.2.0f3)
- java - 如何使用 log4j 创建受密码保护的 zip 文件?可以通过log4j吗?
- php - PHP创建和合并多维数组
- vba - VBA PowerPoint“ObjectsGroup”问题“整数超出范围”
- r - 识别长数据框中每个值第一次出现时的年龄
- javascript - setInterval 是否存储要执行的表达式值/代码?