【发布时间】:2021-05-18 03:24:33
【问题描述】:
我正在尝试使用 DOM 中的元素更新字符串化 HTML 元素。 此字符串化 HTML 元素位于 localStorage 的数组中。
首先,这是我将其转换为可操作的 HTML 的方法:
let toBeUpdated = document.createElement('div');
toBeUpdated.innerHTML = `${var_stringify_html_from_localstorage}`;
toBeUpdated = toBeUpdated.firstElementChild;
这个toBeUpdated 元素是一个div,其中包含一个id 为updateMe 的元素。
我想用来自 DOM 的元素更新这个“虚拟”(不可见)#updateMe 元素。
我先试了:
let updateme = toBeUpdated.querySelector("#updateMe");
let updateme_DOM = document.querySelector("#updateMe");
toBeUpdated.replaceChild(updateme, updateme_DOM);
返回Uncaught DOMException: Node.replaceChild: Child to be replaced is not a child of this node
其次我尝试了:
let updateme = toBeUpdated.querySelector("#updateMe");
let updateme_DOM = document.querySelector("#updateMe");
updateme.replaceWith(updateme_DOM);
这会从 DOM 中删除原始的 #updateMe 并且不会更新 toBeUpdated 元素。
我显然错过了什么,但我看不到什么......
我试图尽可能地重现我的情况:
//initial state of local storage
let motd = ["<div id='toBeUpdated'><h1>Hello World</h1><p id='updateMe'>Message of tomorrow</p></div>"];
window.localStorage.setItem('motds', JSON.stringify(motd));
// My situation, later in the code
let motds = JSON.parse(window.localStorage.getItem('motds'));
let toBeUpdated = document.createElement('div');
toBeUpdated.innerHTML = `${motds[0]}`;
toBeUpdated = toBeUpdated.firstElementChild; // this is the div#toBeUpdated
let DOMUpdateMe = document.getElementById('updateMe');
let storageUpdateMe = toBeUpdated.querySelector("#updateMe"); // getElementById doesn't work here
// Replace
storageUpdateMe.replaceWith(DOMUpdateMe);
// Back in local storage
motds[0] = toBeUpdated.outerHTML;
window.localStorage.setItem('motds', JSON.stringify(motds));
<body>
<div id="toBeUpdated">
<h1>Hello World</h1>
<p id="updateMe">Message of tomorrow</p>
</div>
</body>
【问题讨论】:
-
updateme.replaceWith(updateme_DOM);不应该与updateme_DOM.replaceWith(updateme);相反 -
感谢@Breezer,但我想要更新我的“虚拟”(不是真正在 DOM 中)元素,而不是用户看到的 DOM
标签: javascript html local-storage