我使用普通 JavaScript 有以下 DOM 元素更改函数,其中我使用页面加载事件更改包含 DOM 的某些文本字符串的 span 元素。
使用以下代码,DOM 元素将按预期更改。但是,在变量 desktop 和 mobile 的 DOM 元素更改之前,他们仍然会看到最小部分的闪烁。
我认为发生这种情况是因为当页面的 DOM 内容完全加载时会应用 DOM 更改。我想隐藏现有的标签元素,直到应用更改,然后显示它们。
我想要操作的 desktop 和 mobile 的元素结构如下:
<span class="first-headline target-span">Text I want to change</span>
请参阅以下概念:
var changesObj = {
"us": {
title: "text1 changed"
},
"eu": {
title: "text2 changed"
}
};
function changes() {
var webshop = changesObj[window.location.pathname.split('/')[1]];
console.log(webshop);
var changesText;
if (!webshop) {
console.log('webshop not found');
}
changesText = webshop.title;
if (document.querySelector('.target-span').innerText.length > 0) {
var desktop = document.querySelector('.target-span');
console.log(desktop);
desktop.innerText = changesText;
console.log(desktop.innerText);
console.log("applied changes for dekstop");
}
if (document.querySelector('.target-span').innerText.lenght > 0) {
var mobile = document.querySelector('.target-span');
mobile.innerText = changesText;
console.log(mobile.innerText);
console.log("applied changes for mobile");
}
}
function invokeChanges() {
document.addEventListener("DOMContentLoaded", function () {
changes();
});
}
invokeChanges();
有没有办法先隐藏 DOM 元素,直到应用了对现有元素的更改,然后再显示它?
我正在考虑使用如下内联 CSS 规则:
设置.style.visbility='hidden',当文本内容改变时用.style.visbility='visble'显示。
但我不确定如何在我的代码中正确实现该解决方案。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
它闪烁的原因有很多,但您可以采取两个预防措施:
<script defer>上使用defer,因为这可以让浏览器处理脚本的运行顺序,而不是使用DOMContentLoaded。您还可以避免changes包装函数。但是,请注意,无论其中任何一个,这些仍然需要执行 JS,并且可能仍然会有延迟。如果您能够使用它,您可能会对预渲染您的网页感兴趣 -从您的 JS 代码中,它会查找路由名称(如果是
eu或us),这意味着您的页面是可预渲染的。无论如何,您都需要等到 DOM 加载完毕后才能对其进行操作。使用
DOMContentLoaded的偶数侦听器将是可行的方法。因此,需要发生三件事:visibility:hidden或display:none。不同之处在于,使用visibility:hidden元素仍会占用空间。因此,选择取决于上下文。在第一个示例中,我添加了一个超时,以便您可以在文本更改之前看到页面的外观。我还设置了
<p>(display: inline-block) 的样式,以便您可以看到隐藏跨度的大小。window.location.hash = "us"; // for testing on SO var changesObj = { "us": { title: "text1 changed" }, "eu": { title: "text2 changed" } }; function changes(e) { //let webshop = changesObj[window.location.pathname.split('/')[1]]; let webshop = changesObj[window.location.hash.substring(1)]; // for testing on SO if (webshop) { [...document.querySelectorAll('.target-span')].forEach(span => { span.textContent = webshop.title; span.classList.add('show'); }); } } document.addEventListener('DOMContentLoaded', e => { setTimeout(changes, 1000); });p { border: thin solid black; display: inline-block; } .target-span { visibility: hidden; } .target-span.show { visibility: visible; }