|
在处理节点的第一节里就提及过,普遍的观点认为,每一次在文档中处理节点,浏览器就要重绘一次,会占用一定的内存资源。所以推荐使用文档片段来先把节点处理好再附加到指定节点处。然而,这一点在VBA里实现并不是一件容易的事情。 因为JavaScript跟VBA最大的区别在于,前者几乎是不用定义变量类型的,随便定义一个变量,后面再根据需要来确定类型。但是VBA不太方便这样处理,虽然也可以不用定义类型,但问题是,不定义类型,想使用其中某个方法或属性时,除非你特别熟悉,否则就准备翻帮助文件吧。——最大的问题是,有些帮助文件可能没那么容易找,例如,DOM。{:soso_e113:}——这也是我不推荐大家使用后期绑定(即前期不引用库,定义变量时使用这种语句:set xx=createObject("xxx")类型)来写程序的原因之一。
扯远了,我们继续回到前面的话题。在js里createDocumentFragment只需要创建一个就够了,然后用forEach迭代完成,例如:
- var div=document.querySelector("div");
- var docFrg=document.createDocumentFragment();
- var t=["红","橙","黄","绿","蓝","靛","紫"];
- function test(){
- t.forEach(function test(e){
- var p=document.createElement('p');
- p.textContent=e;
- docFrg.appendChild(p);
- });
- div.appendChild(docFrg);
- }
复制代码 但是VBA……对不起,好像只能用数组吧?因此,即便JavaScript里的文档片段有这个优势,在VBA里也荡然无存了。——不用数组也行,不过也不见得有太大优势。我的例子里是不用数组的,每次创建一个文档片段,再把HTML附加上来。最后修改HTML。
——如果你有更好的办法,不妨回帖一起探讨。
- Private Sub cmdCreateDocFragment_Click()
- Dim wb As WebBrowser
- Dim doc As HTMLDocument
- '定义一个元素数组
- Dim p(1 To 10000) As IHTMLElement
- Dim docFrg As IHTMLElement
- Dim strHTML As String
- '定义文本节点
- Dim nodeText As IHTMLDOMNode
- Dim i As Long
- Set wb = Me.WebBrowser0.Object
- Set doc = wb.Document
- Dim t
- t = Timer
- For i = 1 To 10000
- '创建P元素
- Set p(i) = doc.createElement("p")
- '创建文本节点
- Set nodeText = doc.createTextNode("我是新来的" & i)
- '将文本节点附到P元素上
- p(i).appendChild nodeText
- '再将已经包含文本的P节点添加到BODY上
- Set docFrg = doc.createDocumentFragment.appendChild(p(i))
- strHTML = strHTML & docFrg.outerHTML
- Next
- doc.querySelector("div").innerHTML = docFrg
- MsgBox "耗时" & Timer - t
- End Sub
复制代码
当创建上万个文档片段,再读取它的OuterHTML,不见得比直接创建,然后渲染快。事实上,我测试了创建10000个元素时,使用文档片段大约1.99秒,而直接创建则是1.14秒多。十万的时候,直接创建是130多秒【虽然有段时间假死】,文档片段呢?——直接挂了,然后报错。
所谓“实践出真知”,说的大概就是这个吧。{:soso_e113:}
上一节
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|