设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2720|回复: 9
打印 上一主题 下一主题

[多媒体] 浅谈DOM之九:文档片段

[复制链接]
跳转到指定楼层
1#
发表于 2015-7-11 17:59:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
       在处理节点的第一节里就提及过,普遍的观点认为,每一次在文档中处理节点,浏览器就要重绘一次,会占用一定的内存资源。所以推荐使用文档片段来先把节点处理好再附加到指定节点处。然而,这一点在VBA里实现并不是一件容易的事情。       因为JavaScript跟VBA最大的区别在于,前者几乎是不用定义变量类型的,随便定义一个变量,后面再根据需要来确定类型。但是VBA不太方便这样处理,虽然也可以不用定义类型,但问题是,不定义类型,想使用其中某个方法或属性时,除非你特别熟悉,否则就准备翻帮助文件吧。——最大的问题是,有些帮助文件可能没那么容易找,例如,DOM。{:soso_e113:}——这也是我不推荐大家使用后期绑定(即前期不引用库,定义变量时使用这种语句:set xx=createObject("xxx")类型)来写程序的原因之一。
       扯远了,我们继续回到前面的话题。在js里createDocumentFragment只需要创建一个就够了,然后用forEach迭代完成,例如:
  1. var div=document.querySelector("div");
  2. var docFrg=document.createDocumentFragment();
  3. var t=["红","橙","黄","绿","蓝","靛","紫"];
  4. function test(){
  5. t.forEach(function test(e){
  6.         var p=document.createElement('p');
  7.                 p.textContent=e;
  8.                 docFrg.appendChild(p);
  9.         });
  10.         div.appendChild(docFrg);
  11. }
复制代码
      但是VBA……对不起,好像只能用数组吧?因此,即便JavaScript里的文档片段有这个优势,在VBA里也荡然无存了。——不用数组也行,不过也不见得有太大优势。我的例子里是不用数组的,每次创建一个文档片段,再把HTML附加上来。最后修改HTML。
       ——如果你有更好的办法,不妨回帖一起探讨。
  1. Private Sub cmdCreateDocFragment_Click()
  2. Dim wb As WebBrowser
  3. Dim doc As HTMLDocument
  4. '定义一个元素数组
  5. Dim p(1 To 10000)  As IHTMLElement
  6. Dim docFrg As IHTMLElement
  7. Dim strHTML As String
  8. '定义文本节点
  9. Dim nodeText As IHTMLDOMNode
  10. Dim i As Long

  11. Set wb = Me.WebBrowser0.Object
  12. Set doc = wb.Document
  13. Dim t
  14. t = Timer
  15. For i = 1 To 10000

  16. '创建P元素
  17.     Set p(i) = doc.createElement("p")
  18. '创建文本节点
  19.     Set nodeText = doc.createTextNode("我是新来的" & i)
  20. '将文本节点附到P元素上
  21.     p(i).appendChild nodeText
  22. '再将已经包含文本的P节点添加到BODY上
  23.      Set docFrg = doc.createDocumentFragment.appendChild(p(i))
  24.       strHTML = strHTML & docFrg.outerHTML
  25. Next
  26. doc.querySelector("div").innerHTML = docFrg
  27. MsgBox "耗时" & Timer - t
  28. End Sub
复制代码

       当创建上万个文档片段,再读取它的OuterHTML,不见得比直接创建,然后渲染快。事实上,我测试了创建10000个元素时,使用文档片段大约1.99秒,而直接创建则是1.14秒多。十万的时候,直接创建是130多秒【虽然有段时间假死】,文档片段呢?——直接挂了,然后报错。
   所谓“实践出真知”,说的大概就是这个吧。{:soso_e113:}
上一节


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2015-7-12 07:53:43 | 只看该作者
谢谢分享
回复

使用道具 举报

点击这里给我发消息

3#
发表于 2015-7-14 12:54:38 | 只看该作者
谢谢分享,后面让同事来整理成一个 小集锦!
4#
 楼主| 发表于 2015-7-14 13:31:25 | 只看该作者
admin 发表于 2015-7-14 12:54
谢谢分享,后面让同事来整理成一个 小集锦!

还有一部分没写好。后面准备做个好点的实例看看。

点击这里给我发消息

5#
发表于 2015-7-17 06:51:53 来自手机 | 只看该作者
Java全是对象,vba是用对象,基本上是脚本。可以 collection,代替数组,也可以用类模块,实现面向对象。
另外,vba借助Dom与Java内对象本质上差别不大。

点击这里给我发消息

6#
发表于 2015-7-17 06:55:25 来自手机 | 只看该作者
docFrg.outerHTML 每次读会慢,直接放到字符串变量可能好点。

点击这里给我发消息

7#
发表于 2015-7-17 06:57:55 来自手机 | 只看该作者
docFrg.appendChild(p); vba能用也不错

点击这里给我发消息

8#
发表于 2015-7-17 06:59:18 来自手机 | 只看该作者
字串连多了会慢,.net string有个Append 不错。

点击这里给我发消息

9#
发表于 2015-7-17 07:05:15 来自手机 | 只看该作者
div.appendChild(docFrg);
vba用这句行吗?貌似比连字符串好些。
前面8篇大作在哪儿,呵呵,想学习学习!
10#
 楼主| 发表于 2015-7-18 11:48:16 | 只看该作者
zpy2 发表于 2015-7-17 07:05
div.appendChild(docFrg);
vba用这句行吗?貌似比连字符串好些。
前面8篇大作在哪儿,呵呵,想学习学习 ...

点击上一节,可以一直溯源而上
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-11 05:32 , Processed in 0.080567 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表