使用内置DOM
Foxtable专门为WebViewer开发了一个轻量级的DOM。
这个DOM使用起来非常方便,例如取一个元素的值:
'''Async
Dim
wv
As
WebViewer = e.Form.Controls("WebViewer1").WebViewer
Dim
ele = wv.getElementById("txtName")
Dim
oldName
As
String
=
Await
ele.value
'取值
oldName =
oldName.Trim("""")
ele.Value =
"李四"
'写值
MessageBoxA.Show(oldName)
这比原来方便了好多倍。
作为Foxtable用户,使用内置DOM时需特别注意:所有成员(方法 / 属性)名称严格区分大小写,即必须与JavaScript中对应的成员名称大小写完全一致。
例如上面的value属性,如果你写成Value,将无法正常取值,得到的结果为 "null"(对应 Foxtable 中的 Nothing)
Dim oldName As String = Await ele.Value '结果为"null"
其次内置DOM返回的数据是JSON格式,其中字符串类型会自带双引号,使用前要去掉双引号才行:
oldName = oldName.Trim("""")
如果不去掉,显示的将是:"张三",而不是:张三
取值和去双引号,可以写在一行,例如:
Dim
oldName
As
String
= (Await
ele.value).Trim("""")
'取值并去掉双引号
你喜欢的话,全部写在一起也行:
Dim oldName As String = (Await wv.getElementById("txtName").value).Trim("""")
此外,所有从DOM获取值的操作都必须添加Await关键词,而给DOM属性赋值的操作则无需添加。
例如:
'''Async
Dim
wv
As
WebViewer = e.Form.Controls("WebViewer1").WebViewer
Dim
agree
As
Boolean
=
Await
wv.getElementById("chkAgree").checked
'取值要加Await
wv.getElementById("chkAgree").checked =
Not
agree
'赋值不要加Await
关于Await需注意的地方还有很多,下面会有专门的一节介绍。
查询元素的方法
WebViewer提供了以下方法用于查询元素:
getElementById、querySelector、querySelectorAll、getElementsByName、getElementsByTagName、getElementsByClassName
此外提供了documentElement、body、head属性,分别用于获取html、body和head元素,以及一个activeElement属性,用于获取焦点元素。
WebViewer还提供了顶层的document和window对象。
元素本身也提供了以下方法用于查询子元素:
querySelector、querySelectorAll、getElementsByTagName、getElementsByClassName
禁止访问的元素属性
内置DOM支持访问绝大多数元素属性,但禁止访问以下属性:
attributes, childNodes, firstChild, lastChild, nextSibling, ownerDocument,
parentNode, previousSibling, __proto__, constructor, prototype
一些是出于安全考虑;一些是因为内置DOM专注于处理元素,而不是节点,例如上面禁止了访问节点导航属性,但以下元素导航的属性是全部保留了的:
parentElement,children,firstElementChild,lastElementChild,previousElementSibling,nextElementSibling
至于attributes被禁止,是因为通过getAttribute、hasAttribute、setAttribute三个方法操作更为方便。
关于页面修改
内置DOM没有提供createElement方法,但是保留了insertAdjacentHTML,当然需要的话,你也可以通过innerHTML和outerHTML属性来修改页面。