Office中国论坛/Access中国论坛

标题: 浅谈DOM之五:处理节点(1) [打印本页]

作者: roych    时间: 2015-7-6 17:28
标题: 浅谈DOM之五:处理节点(1)
本帖最后由 roych 于 2015-7-7 12:01 编辑

       先说点题外话吧。事实上写这个系列,应该是一件吃力不讨好的事情。大部分版友可能会觉得:一是没必要在Access里弄DOM,二是觉得要么在服务器端弄DOM。针对这两种意见,我想说说我的初衷吧。       其实,在开篇里我已经提到过了,这个系列的主要目的在于:一是照顾有网抓需要的版友,二是照顾需要使用Web UI的版友。事实上,我没打算非要给前端工程师看,而且这个系列也不适合,毕竟前端工程师应该学JavaScript,而不是VBA。好了,现在我们继续:

       前面说过了,我们可以通过修改InnerHTML来增删改节点,也可以通过appendChild、removeChild,replaceChild等方法来完成同样的操作。我们先来一个简单点的循环:
  1. Private Sub cmdCreateElement_Click()
  2. Dim wb As WebBrowser
  3. Dim doc As HTMLDocument
  4. '定义一个元素数组
  5. Dim p(1 To 10)  As IHTMLElement
  6. '定义文本节点
  7. Dim nodeText As IHTMLDOMNode
  8. Dim i As Long

  9. Set wb = Me.WebBrowser0.Object
  10. Set doc = wb.Document
  11. For i = 1 To 10
  12. '创建P元素
  13.     Set p(i) = doc.createElement("p")
  14. '创建文本节点
  15.     Set nodeText = doc.createTextNode("我是新来的" & i)
  16. '将文本节点附到P元素上
  17.     p(i).appendChild nodeText
  18. '再将已经包含文本的P节点添加到BODY上
  19.     doc.querySelector("body").appendChild p(i)
  20. Next

  21. End Sub
复制代码
      关于上述的语句,有专家说,由于处理节点时,浏览器需要一次次去渲染,会耗费大量资源。不过也有人认为,用DocumentFragment与这相比并没有太大差异。这个问题我们后面再讨论。
       接下来,我们再来一个复杂点的。将数据显示在表格中:
  1. Private Sub cmdCreateElement_Click()
  2. Dim wb As WebBrowser
  3. Dim doc As HTMLDocument
  4. '定义表格的行(tr)跟列(td)
  5. Dim td  As IHTMLElement
  6. Dim tr() As IHTMLElement
  7. Dim nodeText As IHTMLDOMNode
  8. '定义记录集
  9. Dim rst As New ADODB.Recordset
  10. '定循环变量i和outerHTML文本
  11. Dim i As Long
  12. Dim s As String

  13. rst.Open "select 商品ID,商品名称,结算金额 from 订单数据", CurrentProject.Connection, adOpenKeyset, adLockOptimistic

  14. Set wb = Me.WebBrowser0.Object
  15. Set doc = wb.Document
  16. '重定义数组
  17. ReDim tr(1 To rst.RecordCount)
  18. i = 1

  19. Do Until rst.EOF
  20.     Set tr(i) = doc.createElement("tr")
  21.     For j = 0 To rst.Fields.Count - 1
  22.     '创建单元格
  23.         Set td = doc.createElement("td")
  24.     '创建文本节点
  25.         Set nodeText = doc.createTextNode(rst(j))
  26.     '将文本节点依次附加到单元格之上,得到:<td>rst(0)</td><td>rst(1)</td><td>rst(2)</td>
  27.         td.appendChild nodeText
  28.     '将td附加到tr上。
  29.         tr(i).appendChild td
  30.     Next
  31. '读取外部HTML代码
  32. s = s & tr(i).outerHTML
  33. '循环
  34. i = i + 1
  35. rst.MoveNext
  36. Loop
  37. doc.querySelector("body").innerHTML = "<table border=""1"">" & s & "</table>"
  38. End Sub
复制代码
[attach]56752[/attach] 上一节 下一节


作者: admin    时间: 2015-7-6 17:31
系列文章。赞一个
作者: roych    时间: 2015-7-6 17:36
admin 发表于 2015-7-6 17:31
系列文章。赞一个

既然讲了,就尽量讲透一些。不过JavaScript的DOM跟VBA里的DOM还是有些差异。例如部分appendChild就是IHTMLElement里的隐藏方法(即无提示,只能手动输入这个方法)。
作者: tmtony    时间: 2015-7-6 17:40
赞一个!
作者: qjiangxi    时间: 2015-7-6 18:29
大师都已经拼合ACCESS和HTML了,我还一直晕HTML,研究有一段时间了,还停留在改别人现成的。
留个记号跟帖……

作者: leonshi    时间: 2015-7-6 20:17
赞一个




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3