- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个简单的网页,该网页通过AJAX调用加载了大部分内容,该调用返回了大量复杂的HTML。当我将检索到的HTML放入DOM时,它会使浏览器瘫痪相当长的一段时间(Chrome中为5秒,Edge中为35秒)。
我如何将HTML附加到DOM的示例:
$.ajax("example.php").done(function (response) {
const contentElement = document.getElementById('results');
contentElement.innerHTML = response;
});
最佳答案
第1部分-这不是代码的加载方式,只是代码无效,即使在页面上进行了硬编码也无法正常工作。
“奇怪的是,在已经看到插入的HTML之后,浏览器就会崩溃一小会儿。请参见下面的时间轴,在此之前,我可以在大约5秒钟的Parse HTML事件发生之前在屏幕上看到HTML(具有正确的样式)。 ”。
关于HTML的实用性(其荒谬可言),其有效性(并非如此)和功能性(其并非而且可能从未拥有),应该解决一些问题。
您应该validate your HTML因为它是非常无效的,但是在进入这一阶段之前,当您决定验证该混乱时,您需要将其分成大约16个部分,因为大多数在线服务会在很短的时间内摔倒或缩短验证过程。一次要处理这么多。
以下是由于错字而并非孤立问题的问题列表。这些问题会重复多次。我最担心的是值和大多数变量似乎是手工定制的。希望我弄错了,您没有花几个小时来定制会阻碍而不是真正有用的值。
1. #ID
s must be unique-在任何情况下,同一页面上均不得重复## cc。
14 ID
-固定,14 #accordion
-固定,7 #headingOne
,7 #model
,7 #type
,...
还有更多受骗的#brand
,我将#ID
更改为#accordion
1到14,因为有必要使每个#acordion
起作用,而不仅仅是第一个。与#accordion
有直接关系的所有相关属性也需要更改,为了功能起见,我设法更改了#accordion
。因此,有15个可操作的手风琴,我添加了带有适当设计的手风琴的主页选项卡,如果您决定重新设计其他14个手风琴,则可以将其用作模板。
2.为了使用Bootstrap组件,请根据文档进行制作。
OP代码几乎没有任何制表符,如果您引用Bootstrap documents或什至W3School's short tutorials,您就会知道每个选项卡都必须有一个toggle-parent="#accodion
,因此代码很短16 <a>
的数量可切换16个标签。这就是为什么您的页面仅显示16个选项卡的第一个选项卡,而不是因为浏览器中途失败而导致的。
3.我注意到的另一个无效之处是,属性<a>
(和readonly
在较小程度上)被应用于几乎每个表单控件。
为什么在required
标记上需要readonly
属性?在为元素分配属性时,不要开始向所有内容添加大量属性。混乱使可读性,维护和调试变得不可能。
4.有2个柱塞:
Plunk 1是OP(原始帖子)问题的解决方案,此答案的第2部分对此进行了详细说明。 HTML已部分修复,我没有足够的时间修复所有内容。
它有16个标签和15个手风琴起作用。
加载时间从34秒减少到2秒。与边缘。似乎Edge英勇地试图理解已解析的HTML,然后失败了。像Firefox和Chrome这样的真正的浏览器只是将其转储并保留在那里。
Plunk 2是OP代码中的HTML,我的解决方案正在加载它。
结果是一样的,OP代码失败是由于代码本身,而不是因为加载问题。
第2部分-一种将庞大的字符串解析为HTML的稳定方法。如果OP代码确实有效,则不需要。
尝试通过<select>
向DOM添加大量标记时,OP遇到严重的延迟。最多需要34秒才能使用Edge完全渲染它,而其他浏览器OP则报告3秒。
我在Edge上的加载时间降低到了2到3秒,而在真正的浏览器(Chrome和Firefox)上立即得到了加载。
尽管OP已经尝试使用createDocumentFragment(),但我认为这是快速加载和解析所述HTML的关键。 OP可能未使用的其他关键组件是:
insertAdjacentHTML()和Immediately Invoked Function Expression
使用innerHTML
方法而不是insertAdjacentHTML()
属性。 innerHTML
是insertAdjacentHTML()
的功能强大且用途广泛的版本。
相似之处:
两者都将采用给定的字符串并将其解析为HTML。
两者都很快。
差异:innerHTML
将HTML插入DOM,它不会覆盖DOM中的元素或任何地方的任何现有HTML。 insertAdjacentHTML()
覆盖元素的内部。
通过引用innerHTML
指向要接收字符串的元素,并使用给定的字符串覆盖该元素的所有内容。如果innerHTML
仅指向没有字符串的元素,则它将与该元素的HTML内容一起返回。 innerHTML
不能获取的唯一能力是innerHTML
的能力。相反,insertAdjacentHTML()
SET的功能十分强大,如下所述:insertAdjacentHTML()
不仅通过引用元素来定向,还通过其第一个参数(即4个DOMString中的一个)准确告诉相对于引用元素的位置与职位相关:
“ beforebegin”将字符串放在元素开头之前。
`$elector.before(str)`★
`$elector.after(str)`★
`$elector.prepend(str)`★
`$elector.append(str)`★
insertAdjacentHTML()
第二个参数是将被解析为HTML的字符串。使用
Template Literals代替文字字符串使我们更容易进行字符串操作。
`element.insertAdjacentHTML("beforeend", <input id="${ID+i}" type="${typeArr[i]}" value="${Math.floor(Math.random() * i}">)`
`(function() { var x = function() {...} x})();`
insertAdjacentHTML()
是为了让我们能够完成涉及DOM的所有繁琐而繁琐的任务-脱离DOM。我们可以向DocumentFragment及其后代添加尽可能多的元素,文本,属性,设置事件处理程序等,而无需接触DOM。完成所有操作后,只需执行一项DOM操作:
`document.body.appendChild(frag);`
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>Monstrosity</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0/css/bootstrap.min.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" />
</head>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0/js/bootstrap.min.js"></script>
<script>
(function() {
const str = `Huge Disaster of HTML`
const frag = document.createDocumentFragment();
const node = document.createElement('div');
let build = function(node, str, frag) {
node.insertAdjacentHTML('beforeend', str);
frag.appendChild(node);
document.body.appendChild(frag);
}
build(node, str, frag);
}());
</script>
</body>
</html>
关于javascript - 如何加快向DOM中添加大量复杂HTML的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49496716/
我在想出一个算法时遇到了麻烦... 我有一系列 GPS 数据,以 1 秒为间隔记录时间、速度、距离。假设距离是米,速度是米/秒。可能有超过 2 小时的数据,或 7200 个点。这里的“时间”字段主要是
使用java排序器,即: Collections.sort(myArrayList, new Comparator() { @Override public int c
有什么区别吗 SELECT * FROM my_table 和 SELECT my_column_id FROM my_table 地点: my_table 有百万行 网站上有大量并发用户进行sql查
有2个样本。 在第一个示例中,使用 orderby 可以更快地获得结果。 (根据 phpmyadmin 速度报告) 在另一个例子中,我没有使用 order by,它给出的结果较慢。 (根据 phpmy
我注意到,如果我将训练数据加载到内存中并将其作为 numpy 数组提供到图中,与使用相同大小的 shuffle 批次相比,速度会有很大差异,我的数据有大约 1000 个实例。 使用内存 1000 次迭
我在 python 中使用破折号。我正在绘制记录到 SQLite 数据库中的实时数据,目前,我正在绘制单个值与时间线图。我计划再添加 20 个图表,但目前,随着时间的增加, plotly 变慢,我认为
我试图调用 hasNext Velocity 模板中的方法,以便根据 foreach 循环中的位置影响行为 - 仅 hasNext没有按照文档工作。 这是 Velocity 用户指南的片段,关于 ha
在我正在制作的游戏中,我有两个点,pt1 和 pt2,我想计算出它们之间的角度。我已经在较早的计算中计算出距离。显而易见的方法是对垂直距离上的水平距离进行反正切 (tan(theta) = opp/a
我经常遇到字符串值不存在和/或为空的情况。这是测试这种情况的最佳方法吗? #if( $incentive.disclaimer && $!incentive.disclaimer != '' )
我想将一个模板nested包含在其他模板cont1,cont2和cont3中。 并且嵌套模板应仅对cont1隐藏一个特定控件。 在包含在cont1中之前,我想为一些标志变量$hideMyControl
是否可以更改从“Windows Azure Media Encoder”输出的音频的播放速度? 我正在使用配置为“WMA High Quality Audio”的“Windows Azure Medi
我使用速度将String(template)与字段合并 hi there I'am ${name}, And I'am ${age} old. velocity将字段${name}和${age}与一种
我使用的是 LockedBitmap 类,它简化了 C# 中位图数据的处理。目前它正在将数据复制到本地 byte[] 数组中,然后通过其类方法访问该数组以获取/设置像素颜色值。 这比直接通过指针访问锁
我尝试在 VM_global_library.vm 文件中添加一堆 #set($x=abc) 语句,但这些变量在我的 VM 模板中不可用。 我想为图像的基本路径等设置一个全局变量。这可能吗? 最佳答案
我的项目结构: -src --main ---java ----makers -----SomeClass ---resources ----htmlPattern.vm 如何告诉 SomeClass
我正在尝试从 Velocity 中的字符串中删除不需要的字符(换行符可以,但不能像 EM 和 CAN ASCII 控制字符那样)。 #set($cleanScreen = $cleanScreen.r
我想在日.月.年之间的点处分割日期。例如:2015 年 1 月 14 日至 {14, 01, 2015}这是我使用的代码:dates3.get(0) 包含我从页面的文本字段获取的字符串“14.01.2
之后,从 1.5 升级到速度引擎 1.7 出现了 1.5 没有的问题。为了解释这个问题,我必须展示一个代码片段: #foreach($someVariable in $someCollection)
我想知道从表中选择所有字段是否更快: SELECT * 或只选择您真正需要的: SELECT field1, field2, field3, field4, field5... 假设表有大约 10 个
我正在尝试模仿照片应用程序的行为,在该应用程序中,用户用手指平移照片并且照片具有一定的速度。由于我不会深入的原因,我不能将 UIScrollView 与它的缩放 UIImageView 一起使用,而是
我是一名优秀的程序员,十分优秀!