freeform2.htm
9.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
<HTML>
<head>
<meta http-equiv="content-type" content="text/html; charset=gb2312">
<link rel="stylesheet" href="../temp1.css" type="text/css">
<script type="text/javascript" src="functable.js"></script>
<script>
function gentable()
{
var xmlDoc = getXMLDoc("events.xml?81");
geneventtable('TagEvent', xmlDoc, 'Freeform');
}
</script>
</head>
<body onLoad="gentable()" bgcolor=#ffffff vlink=#0000ff>
<div id="Tag1206"/><br><br><br>
<font style='font-size:15pt'>5.按钮控件</font><hr color=#2266ee size=1>
<b>1.按钮简介</b><br>
<Input type="button" ...>即为按钮控件,Freeform支持的按钮种类比较多,可以有如下几种:<br>
<b>1</b>.平坦按钮,即无凸出边界的按钮,语法为<Input type="button" style="flat" ...>;<br>
<b>2</b>.平坦全透明按钮,和平坦按钮类似,但鼠标滑过时是透明的,语法为<Input type="button" style="flat,transparent" ...>;<br>
<b>3</b>.带图标的按钮,按钮中可以有一个小图标,语法为<Input type="button" icon="../res/btn.zip#33.bmp" ...>,只要该icon指向有效的url, 就是带图标按钮;<br>
<b>4</b>.下拉菜单按钮,和<Menus>下某Menu关联, 其外观如下图,语法为<Input type="button" menuID="menu1" ...>;<br>
<center><img src="as1.png"></center>
下拉菜单按钮可以是平坦按钮,也可以是非平坦按钮,只要定义了menuID,就是下拉菜单按钮。<br>
<b>5</b>.动态下拉菜单按钮,和下拉菜单按钮类似,但是其弹出的菜单是需要js动态生成或修改的,语法为<Input type="button" menuID="menu1" isDynamicMenu="true" ...>;<br>
<b>6</b>.普通按钮,无平坦效果、无背景色定义、无图标、无下拉菜单的按钮就是普通按钮,普通按钮的外观由操作系统决定;<br>
<br>
按钮按下时会触发ButtonClicked事件,对于下拉菜单按钮,当鼠标选中弹出菜单的某个菜单项,则触发MenuClicked事件。<br>
<br>
<b>2.动态下拉菜单按钮</b><br>
下拉菜单按钮的弹出菜单是和XML描述文件中内置的<Menus>资源相关联的,但是在很多情况下,弹出什么样的下拉菜单并非事先能预知,而是需要在菜单弹出前的瞬间,收集某些状态,然后再来动态修改、或生成具体的下拉菜单。在这种情况下,必须采用动态下拉菜单按钮。<br>
属性 isDynamicMenu 为 true 就表示是动态下拉菜单按钮, 动态下拉菜单按钮的原理分析如下:<br>
1.当用户点击该按钮时,并不弹出菜单,而是触发MenuBeforePopup页面事件;<br>
2.页面js须考虑修改或生成菜单,可以调用如下函数:<br>
SetMenu() - 动态生成菜单<br>
SetMenuItemProp() - 修改菜单项<br>
DeleteMenuItem() - 删除菜单项<br>
3.js最后必须调用PopupMenu( )函数,表示菜单可以弹出:<br>
在Demo页中有具体的实例可供参考.<br>
<div id="Tag1210"/><br><br><br>
<font style='font-size:15pt'>6.RadioButton控件</font><hr color=#2266ee size=1>
RadioButton即单选框按钮,单选框按钮必须是分组的,在每一组单选框中,各个按钮之间相互排斥,例如下面就有2组独立的单选框:<br>
<center><img src='radio.png'></center>
XML描述文件中假设为如下:<br>
<pre class='xml'>
//第一组
<input GroupID="by" id="by1" selectValue="air" type="radiobutton" text="空运" value="1"/>
<input GroupID="by" id="by2" selectValue="sea" type="radiobutton" text="水运" />
//第二组
<input GroupID="db" id="db1" selectValue="lon" type="radiobutton" text="银行贷款" />
<input GroupID="db" id="db2" selectValue="pay" type="radiobutton" text="货款付乞" /></pre>
可见这2组单选框的GroupID分别为"by"、"db". 此外,每个RadioButton通常还需要定义"SelectValue"属性,表示真实的值,这样调用 GetChangedXML( ) 函数取得XML串时,结果为:<br>
<pre class='xml'>
<form level="0">
<row>
<by>air</by> //"by" 是第一组的GroupID
<db>lon</db> //"db" 是第二组的GroupID
...
</row>
</form></pre>
如果调用Load( )加载XML数据,同样也应该采用类似格式。<br>
<div id="Tag1204"/><br><br><br>
<font style='font-size:15pt'>7.文件上传控件</font><hr color=#2266ee size=1>
<Input type="upload" ...>即为文件上传控件,该控件能让用户选择本地文件并上传到服务器。<br>
文件上传有Ftp、Http二种可选途经,以下将简述二者实现原理:<br>
<br>
<b>1.通过Ftp上传</b><br>
通过Ftp上传是最简单的实现方式,程序员不必开发服务端程序,只要部署Ftp服务器就行。在客户端的页面中,只要调用方法FtpUpload( )就能轻松完成。<br>
<br>
<b>2.通过Http上传</b><br>
通过Http上传有三种方法:<br>
<i><b>2.1.通过Http Put直接上传</b></i><br>
和Ftp类似,程序员也不必开发服务端程序,只要开放目标目录的写入权限即可,通过函数httpUpload()上传。<br>
备注: 应该指定有写入权限的帐号和密码,因为权限完全开放的虚拟目录是十分不安全的。<br>
<i><b>2.2.通过Http Post发送请求</b></i><br>
Upload控件将本地文件通过POST方式Request给服务器,服务器端需要程序员开发服务响应程序。<br>
备注: Http Header中的Content-Type是application/octet-stream,Http Body是文件的二进制内容。<br>
<i><b>2.3.间接上传</b></i><br>
所谓间接上传,即Upload控件只是取得文件的Base64大串,并返回给页面,由页面来处理如何发送。如果文件比较小,可以简单地以GET方式发送Base64串。<br>
<div id="Tag1207"/><br><br><br>
<font style='font-size:15pt'>8.内嵌Freeform树</font><hr color=#2266ee size=1>
<FreeformTree dataURL="?">是内嵌的Freeform树,组件是根据加载dataURL的数据创建树的,数据格式为XML/JSON,规范如下:<br>
1.数据本身为普通的平面、多记录结果集;<br>
2.每条记录须有唯一的id号;<br>
3.每条记录允许有pid(或parantID),指向父节点的id,以确定父子从属关系;<br>
4.如果pid为空、或pid所指的记录不存在,则作为顶级节点;<br>
5.每条记录必须有"freeform"属性,指向一个URL,表示以该Freeform 的XML文档创建嵌入的Freeform,该URL如果是相对URL,则是相对于本数据的URL的;<br>
6.记录中必须以和嵌入的Feeform的Object的id同名的属性,为嵌入的Freeform对象赋值;<br>
数据举例如下:<br>
<pre class='xml'>
<root>
<!-- landname、countryname、imgname是嵌入的freeform中的对象id,为其赋值 -->
<record pid="" id="01" freeform="treeland.xml" landname="欧洲"/>
<record pid="01" id="0101" freeform="reecountry.xml" countryname="英国" imgname="uk"/>
</root></pre>
上例中, id、pid(或parentID)、freeform这3个属性是必需的,是系统保留词;其余的是数据,用于嵌入的freeform.<br>
此外,FreeformTree对象支持鼠标单击、双击事件.<br>
<img src='glass.jpg'><font color="552222">嵌入的Freeform不支持Menus、Upload、Pager、ImageFlow类型的Object</font>;<br>
<img src='glass.jpg'><font color="552222">嵌入的Freeform不支持输入功能.</font>;<br>
<div id="Tag1205"/><br><br><br>
<font style='font-size:15pt'>9.事件</font><hr color=#2266ee size=1>
Supcan FreeForm的OnEvent( id, Event, p1, p2, p3, p4 )事件含义及参数分别如下:<br>
<div id="TagEvent"></div>
事件的js用法可参见“事件、按钮、菜单、工具条”Demo页。<br>
<b>备注1</b>:EditKeydown和EditChar均为在输入框中的键盘事件,EditKeydown能捕获几乎所有键盘动作,包括非字符的回车、Tab等;而EditChar则以输入的字符为主,包括中文.<br>您可以用全局函数 CancelEvent( ) 去阻止继续执行,就如事件没有发生过那样,但不同的ASCII码,您需要在这二个事件中挑选一个执行CancelEvent( ),具体请在树列表的演示页“12.事件”中去测试;<br>
<b>备注2</b>:1-Ctrl键也按下了; 2-Shift键也按下了; 3-二者一起按下了.<br>
<b>备注3</b>:如果是分块上传,是类似这样的串:"FileParts=33;CurrentFilePart=2;PassTime=00:02:33;RemainTime=00:01:30;Speed=50",其含义如下:<br>
FileParts - 总块数;<br>
CurrentFilePart - 刚上传的块序号;<br>
PassTime - 已耗用的时间(时:分:秒);<br>
RemainTime - 估计还需要时间(时:分:秒);<br>
Speed - 测算到的网速,单位为 千字节/秒;<br>
此外,如果是将一个目录压缩成zip包上传,那么第一个Upload消息肯定是“Compressed=true”.<br>
<b>备注4</b>:类似这样的串:"FileSize=1002034;CurrentSize=200030;PassTime=00:02:33;RemainTime=00:01:30;Speed=50",其含义如下:<br>
FileSize - 文件总长度(字节);<br>
CurrentSize - 已下载的长度(字节);<br>
PassTime - 已耗用的时间(时:分:秒);<br>
RemainTime - 估计还需要时间(时:分:秒);<br>
Speed - 测算到的网速,单位为 千字节/秒;<br>
<div id="Tag1208"/><br><br><br>
<font style='font-size:15pt'>10.XML提交格式规范</font><hr color=#2266ee size=1>
和Treelist类似,通过调用函数GetChangedXML( ),能取得输入内容的XML包,使得应用服务器能作相应处理,函数中参数level为提交级别,分如下3种:<br>
级别0:生成当前全部、最新内容(不包括修改前的原始内容);<br>
级别1:仅生成被修改过的Input的内容(包括原始内容);<br>
级别2:生成全部Input的内容(包括原始内容);<br>
<br>
级别0最常用,并且XML规范最简单,如下所示:<br>
<pre class='xml'>
<?xml version="1.0" encoding="UTF-8"?">
<!-- id在XML描述文件中定义 -->
<form level="0" id="?" key="?" 自定义属性="?" >
<row>
<!-- id处为input真实的id,Text为输入的内容 -->
<id>Text</id>
...
</row>
</form></pre>
<br>
级别1、2的内容规定如下:<br>
<pre class='xml'>
<?xml version="1.0" encoding="UTF-8"?">
<!-- id 在XML描述文件中定义 -->
<form level="?" id="?" key="?" 自定义属性="?" >
<!-- 通过Load( )加载的是<modifiedRow>、否则就是<newRow> -->
<modifiedRow、newRow>
<row key="?">
<!-- id处为input的id, origin为原始值(被修改前),isModified仅用于级别2, Text为修改后的值 -->
<id origin="?" isModified="false">Text</id>
...
</row>
</modifiedRow、newRow>
</form></pre>
<img src='glass.jpg'><font color="552222">警告:应用服务器端开发的程序不应过于依赖级别1/2中的origin的内容(被修改前),因为需要考虑并发.</font><br>
<br><br><br><br><br><br>
<script type='text/javascript' src='nstd.js'></script>
</body></html>