javascript - 在 textarea 中交换大型数据集的最快方法
问题描述
我的 UI 中可能有几十组日志。为了节省资源,它们一次一个,在初始日志之后,我们只接收部分更新,这些更新会附加到预先存在的数据中。它们达到了 9000 行左右的限制,我们预计一次最多 20 行。
通过选择一个选项卡来显示每个日志。UI 在 Bootstrap 中,虽然我们正在使用该tab-nav
组件,但我们并没有切换内容区域。我们只是继续重复使用单个文本区域。
我试过了:
value
只是在 DOM 中分配textarea- 在更新值之前从 DOM 中分离(参见下面的代码:)
- 与上面类似,但更新逻辑作为一个函数被包装在旧的“setTimeout”技巧中以强制异步行为。
来自 #2 尝试的示例代码:
$('#myTab a[data-toggle="tab"]').on('show.bs.tab', function (e) {
var myId = e.target.dataset.tabid; // the "e" is a show.bs.tab event
var textArea = document.getElementById('logs');
var par = textArea.parentElement;
par.removeChild(textArea);
textArea.value = window.storedData[myId]; // storage for prototyping
par.appendChild(textArea);
})
归根结底,它们的表现都非常相似,这让我猜测回流不是问题,而且“异步”技巧并没有给我带来任何好处,因为 DOM 更新本身仍然必须在它的在适当的时候穿线。
有没有更好的方法来有效地“交换”大量数据?我的总体目标是在交换发生时不阻塞 UI。
[更新:] 尽管有标题,但我并不完全同意它是一个文本区域。但它是理想的,因为用户可以 CTRL-A 并执行其他纯文本选择操作,这些操作在使用无序列表或表格时有时会出错。
解决方案
在同事的建议下,我做的最有效的事情是禁用浏览器的内置生产力工具:
<textarea
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"
rows="15"
class="form-control"
id="logs">
</textarea>
我不认为使用“行”属性(而不是 CSS 高度)很重要,但你永远不知道。它主要是禁用自动内容和拼写检查。将插入时间减少了大约三分之一,这使其目前的响应速度可以接受。如果未来的需求不同,将根据 Gabriele 的建议调查 clusterize.js.org。
推荐阅读
- java - POS:如何将每件商品的价格相加得到总价?
- spring-boot - Set-Cookies 响应标头 cookie 未正确并立即在 VPS 上设置
- ios - 我尝试在 iPhone 的后台显示 FCM 通知,但是当我使用 Swift 发送此通知时它不起作用
- javascript - 保存数组状态,稍后编辑
- c# - 需要帮助从 C# 中的 Web 服务读取 xml 响应
- css - 页面内容更改时 Fill-Height 属性出现问题
- go - 如何在 Go 程序中使用 ltrace
- python - Cypher 中的有效查询(如在 Neo4J 中)以查找最短路径的联合
- java - 如果满足条件,则复制特定元素
- c - What is the difference between derefencing and assigning the address of a variable to pointer variable in C?