该技巧特定于特殊的任务。有关 XForms 的背景信息,请参阅共分三部分的系列文章 XForms 简介。
本技巧中所描述的 XForms 示例已经过测试,可用于 Firefox 1.5(安装了 XForms 扩展)以及安装了 Formsplayer 控件的 Microsoft® Internet Explorer 6。下载 部分包含了用于 Firefox 的 XHTML 文件和用于 IE 的 HTML 文件。
通过使用触发器和操作,XForms 提供了一种轻松为表单添加互操作性的方法,但在大多数情况下,那些操作是与 XForms 相关的操作。该技巧中将构建包含按钮的表单,单击该按钮将执行 JavaScript。我们从基本表单开始讨论(清单 1)。
清单 1. 基本表单
<?xml version="1.0" encoding="ASCII"?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ev="http://www.w3.org/2001/xml-events"
xmlns:xforms="http://www.w3.org/2002/xforms">
<head>
<title>Instance Data-To-XHTML/XForms Example</title>
<xforms:model id="auctionItems">
<xforms:instance id="auctions" src="auctions.xml"/>
<xforms:submission id="submit_model_auctionItems"
action="http://xformstest.org/cgi-bin/showinstance.sh"
method="post" instance="auctions"/>
</xforms:model>
<link href="gen_default.css" rel="stylesheet"/>
</head>
<body>
<h1 align="center" id="myTest">Auction Item Inventory</h1>
<xforms:repeat nodeset="instance('auctions')/auctionItem"
id="repeatAuctionItems">
<h2 align="center">Auction Item</h2>
<xforms:input ref="@itemID">
<xforms:label>Item ID</xforms:label>
</xforms:input>
<xforms:input ref="purchaseDate">
<xforms:label>Purchase Date</xforms:label>
</xforms:input>
<xforms:input ref="auctionLength">
<xforms:label>Auction Length</xforms:label>
</xforms:input>
<xforms:input ref="purchasePrice">
<xforms:label>Purchase Price</xforms:label>
</xforms:input>
<xforms:input ref="description">
<xforms:label>Description</xforms:label>
</xforms:input>
<xforms:input ref="estimatedValue">
<xforms:label>Estimated Value</xforms:label>
</xforms:input>
</xforms:repeat>
<xforms:group>
<xforms:trigger>
<xforms:label>Show action</xforms:label>
</xforms:trigger>
<xforms:trigger>
<xforms:label>Insert Auction Item</xforms:label>
<xforms:insert nodeset="instance('auctions')/auctionItem"
at="index('repeatAuctionItems')"
position="after" ev:event="DOMActivate" />
</xforms:trigger>
<xforms:trigger>
<xforms:label>Delete Auction Item</xforms:label>
<xforms:delete nodeset="instance('auctions')/auctionItem"
at="index('repeatAuctionItems')"
ev:event="DOMActivate" />
</xforms:trigger>
</xforms:group>
<xforms:submit submission="submit_model_auctionItems">
<xforms:label>Submit</xforms:label>
</xforms:submit>
</body>
</html>
|
此表单包括一个用来展示操作的按钮,将把表单提交给该操作,如图 1 所示。
图 1. 带有 Show action 按钮的表单
为此,从创建实际脚本开始(清单 2)。
清单 2. JavaScript
...
<head>
<title>Instance Data-To-XHTML/XForms Example</title>
<xforms:model id="auctionItems">
<xforms:instance id="auctions" src="auctions.xml"/>
<xforms:submission id="submit_model_auctionItems"
action="http://xformstest.org/cgi-bin/showinstance.sh"
method="post" instance="auctions"/>
</xforms:model>
<link href="gen_default.css" rel="stylesheet"/>
<script type="text/javascript">
var testJS= function()
{
alert('This form submits to: '+
document.getElementById('submit_model_auctionItems')
.getAttribute('action'));
}
</script>
</head>
<body>
...
|
该脚本是 JavaScript,但是它通过标准 DOM 方法与 XForms 表单进行交互。
现在需要一种调用脚本的方法。
XForms load 元素与 HTML 链接非常相似,因为它告知浏览器在现有窗口或新窗口中载入资源。幸运的是,这意味着可以使用它来调用 URL。因为可以将 JavaScript 作为 URL 进行引用,因此说幸运。您可能会错误地认为可以采用下面的方式来设置它(清单 3)。
清单 3. 载入 JavaScript 的错误方式
...
<xforms:trigger>
<xforms:label>Show action</xforms:label>
<xforms:load ref="javascript:testJS()" ev:event="DOMActivate"/>
</xforms:trigger>
...
|
事实上,不能使用上面这种方式进行设置,因为 ref 属性只能接受 XPath 表达式。有一种相当简单的方法可摆脱该问题的困扰(清单 4)。
清单 4. 载入 JavaScript 的正确方式
<?xml version="1.0" encoding="ASCII"?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ev="http://www.w3.org/2001/xml-events"
xmlns:xforms="http://www.w3.org/2002/xforms">
<head>
<title>Instance Data-To-XHTML/XForms Example</title>
<xforms:model id="auctionItems">
<xforms:instance id="auctions" src="auctions.xml"/>
<xforms:instance id="data">
<data url="javascript:testJS()"/>
</xforms:instance>
<xforms:submission id="submit_model_auctionItems"
action="http://xformstest.org/cgi-bin/showinstance.sh"
method="post" instance="auctions"/>
</xforms:model>
...
</xforms:repeat>
<xforms:group>
<xforms:trigger>
<xforms:label>Show action</xforms:label>
<xforms:load ref="instance('data')/@url"
ev:event="DOMActivate"/>
</xforms:trigger>
<xforms:trigger>
<xforms:label>Insert Auction Item</xforms:label>
<xforms:insert nodeset="instance('auctions')/auctionItem"
at="index('repeatAuctionItems')"
position="after" ev:event="DOMActivate" />
</xforms:trigger>
...
|
现在 ref 属性包含了 XPath 表达式。该 XPath 表达式指向引用脚本的 URL,因此单击按钮将给出所需结果,如图 2 所示。
图 2. 单击按钮给出所需结果
使用 load 元素,可以执行任何 URL。但为了实现此目的,URL 必须包含在数据实例中,这样 load 元素的 ref 属性将包含 XPath 表达式。在那里,URL 指向实际的 JavaScript。还要注意,这意味着您可以执行任何有意义的 JavaScript 脚本,甚至可使之与页面上的 XForms 元素和属性进行交互。
| 描述 | 名字 | 大小 | 下载方法 |
|---|---|---|---|
| 调用 JavaScript XForms 示例 | calljs_source.zip | 4KB | HTTP |
学习
- 您可以参阅本文在 developerWorks 全球网站上的 英文原文。
-
Skimstone 将解释 XForms 的概念。
- 查看
Skimstone 关于 XForms 的介绍。
-
若要了解其他类型的 XForms 输入模式,请查看 w3cschools。
-
“XForms 简介”系列文章 是开始学习 XForms 的优秀指南。
-
从 “使用 Visual XForms Designer 开发表单” 开始学习 alphaWorks 的 Visual XForms Designer。
-
从
developerWorks 中国网站 XML 专区 获得提高 XForms 和其他 XML 技术技能所需的资源。
-
浏览
技术书店 中关于本文所述技术以及其他技术的图书。。
获得产品和技术
-
获取 MozzIE,它是一个可以在 IE 中呈现 XForms 的开源控件。
讨论