我想根据服务器上呈现的HTML片段动态更新页面,第一种简单的方法是从服务器获取片段,然后通过.innerHTML
更新目标。
不幸的是,这会导致两个问题(基本上是相同的):
1.当用户选择动态内容中的任何文本时,选择将被清除。即使,如果所选文本没有更改。这可以在下面的示例中看到:当选择foo
时,它将在更新后被清除,但实际上并没有改变。
1.任何附加到元素的状态也会被删除。特别是我的页面的动态内容有一些按钮,它们会在请求处理时显示加载指示器。对我来说,如果内容更改时指示器消失了,这没关系,但每秒被清除的状态使指示器变得无用。
我真正的问题是,是否有一种简单的方法只更新更改的元素。特别是当元素可以添加,删除或重新排序时。
let counter = 0;
setInterval(() => {
counter++;
// assume this is fetched from the server
content = '<ul><li>foo</li><li>'+counter+'</li><li>bar</li></ul>';
document.getElementById("dynamic-content").innerHTML = content;
}, 1000);
<div>
<h1>my page</h1>
<div id="dynamic-content">
<ul>
<li>foo</li>
<li>0</li>
<li>bar</li>
</ul>
</div>
</div>
2条答案
按热度按时间x8diyxa71#
这取决于你想替换什么,以及知道如何针对它。在这里我做了一个完全人工的部分替换的例子。
wfypjpf42#
我发现了一个简单的库,叫做idiomorph,它可以完成我想要的很多功能。通常有多个库可以用于这个用例,它们将自己描述为DOM“变形”库。
所以你不用
我只需要
此外,我必须在每个元素上放置
id
标记,但在我的情况下这很容易。