使用内置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属性来修改页面。


本页地址:http://www.foxtable.com/webhelp/topics/6376.htm