other1.htm
16.4 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
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
<HTML>
<head>
<meta http-equiv="content-type" content="text/html; charset=gb2312">
<link rel="stylesheet" href="../temp1.css" type="text/css">
</head>
<body bgcolor=#ffffff vlink=#0000ff>
<div id="Tag903"/>
<br>
<Table cols=2 border=0 width=100%>
<col width=60%>
<col width=40%>
<tr height=91><td/><td><img src='devsh.jpg'></td></tr>
</table>
<font style='font-size:15pt'>1.关于硕正套件</font><hr color=#2266ee size=1>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问1.为什么demo包采用静态页面?在 JSP 或 ASP.Net中能使用吗?</b></td></tr></table>
<font color=#666666>答复: </font>因为是纯客户端产品的关系,和后端(服务器端)技术的关系不那么密切,所以我们选择最通用的静态页面作demo。不管是ASP还是JSP,HTML+CSS+JS是二者间最大的交集,换句话说,我们的产品在静态页面上都能跑,更何况是动态页面。<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问2.demo页和文档从未提到数据库,硕正套件支持什么样的数据库?</b></td></tr></table>
<font color=#666666>答复: </font> 硕正套件不直接连接数据库,所以也不关心数据库。我们认为,访问数据库应该是应用服务器的事,硕正套件只关心数据:基于Http request/response的数据。<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问3.demo中的数据基本上都是XML文件,实际开发时也必须是XML文件吗?</b></td></tr></table>
<font color=#666666>答复: </font> 不是的,应该是基于Http Response的数据包。实际开发中,应用服务器从数据库中获取数据并将其封装成XML(或JSON、TSV-TXT),然后将这个XML返回给客户端,这个过程有点类似于XML Web Service的对象封送,无论是JSP还是ASP.Net,都有简单的数据序列化的实现方法。<br>
在Java EE开发中,通常采用Servlet作为顶层来处理Http Request / Response.<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问4.在IE下,硕正套件是一个ActiveX控件。我自己以前也开发过ActiveX控件,发现维护量很大,有些客户根本就安装不了,硕正套件也会有这个问题吗?</b></td></tr></table>
<font color=#666666>答复: </font> 你自己开发的ActiveX控件通常未经签名,微软操作系统对未经签名控件的限制越来越严厉。<br>
硕正套件ActiveX是经过签名的,并且在运行过程中不写注册表、不读写其它目录的文件,所以在用户正常的IE安全等级下能够下载、运行,极少发现被操作系统拦截、无法安装的情况.<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问5.我的应用程序采用常规的服务器端Session来维护会话的安全性,Supcan套件的Http请求安全吗?</b></td></tr></table>
<font color=#666666>答复: </font> Supcan套件继承了页面的上下文环境,其Http请求自然也共享了页面已有的Cookie、和服务端的会话,所以是安全的.<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问6.Supcan套件能用在C/S产品中吗?</b></td></tr></table>
<font color=#666666>答复: </font> 不能,只能作为插件用在浏览器中。<br>
硕正套件的C/S专版需要另外付费购买。<br>
<br>
<div id="Tag901"/><br><br>
<font style='font-size:15pt'>2.开发</font><hr color=#2266ee size=1>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问1.如何学习用硕正套件开发?</b></td></tr></table>
<font color=#666666>答复: </font><br> 首先,您必须明白硕正套件相当于是客户端的中间件,它的容器是浏览器,要操控它,您必须具备页面开发的基本知识,比如html、javaScript、Ajax、CSS等。<br>
由于是浏览器插件的关系,硕正套件与后端数据库是没有连接的,它只与应用服务器通讯:标准的 http 协议交互。为此,您必须精通一种后端开发的技能:JavaEE 或 ASP.Net.<br>
单就硕正套件而言,如下是可参考的学习步骤:<br>
1.学习左侧的《使用指南》,这是原理性的入门知识,对今后的开发和部署很有帮助;<br>
2.从套件中选一种具体的组件入手,比如硕正树列表 或 硕正报表;<br>
3.您可以结合这几种手段,逐步深入:<br>
A.学习《开发者指南》中的具体组件的相关章节;<br>
B.观看在线演示,按提示操作。请注意:我们绝大多数的演示页,在下方都有“技术分析区”,值得深入分析;<br>
C.进一步解剖演示页的HTML源文件,源文件都在 demo 包中的根目录下,文件的命名是和演示顺序号严格对应的。文件名前缀规则是:<br>
<b>t</b>*.htm - 树列表的演示页,如t1.htm、t2.thm...;<br>
<b>f</b>*.htm - 自由表头的演示页,如f1.htm、f2.thm...;<br>
<b>report</b>*.htm - 报表的演示页,如report1.htm、report2.thm...;<br>
<b>other</b>*.htm - 小型页面控件的演示页.<br>
D.如果是研究树列表,需要同时参考顶部Tab中的《Treelist XML 文档规范》;<br>
E.逐步尝试开发,把html转变成您自己的jsp或aspx, html部分可以对照我们的demo页照猫画虎就行;<br>
F.重视本《常见问题解答》,这是我们整理的最常见的咨询问题; <br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问2.书写Treelist、Freeform的XML描述文件时,需要注意元素名、属性名的大小写吗?</b></td></tr></table>
<font color=#666666>答复: </font> 不需要,硕正套件内置的XML解析器对大小写是不敏感的.<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问3.我用asp.net开发了一个非常简单的页面,但是其中的硕正控件始终显示不出来,怎么回事?</b></td></tr></table>
<font color=#666666>答复: </font>解决方法一:<br>
把头上的这句没啥用的话去掉就行:<br>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ... sitional.dtd"><br>
解决方法二:用div包绕控件(需显式指定高宽):<br>
<pre class='cpp'>
<div style="width100%;height:400px">
<script type="text/javascript">insertReport('AF','')</script>
</div></pre>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问4.OnReady() 是在页面事件onLoad( )前还是后触发?</b></td></tr></table>
<font color=#666666>答复: </font>不确定的。因为浏览器通常采用多线程渲染<div>、<td>中的内容,所以很难说哪个先完成。<br>
如果你希望在OnReady( )和onLoad( )全部完成后做某项事情,最安全的做法是用一个计数变量。<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问5.为什么我的页面经常会发生Supcan控件OnReady( )事件未触发的现象?</b></td></tr></table>
<font color=#666666>答复: </font> 将该段 js 写到靠前一点(例如在Html的Head中),这样就保证能触发。<br>
在IE浏览器中,OnReady( )的触发时机是:在硕正组件首次显示时。假如你的页面很长(指高度),需要用垂直滚动条往下拖时才显示硕正组件,那么在硕正组件初次浮现的一刹那,
OnReady( )事件才被触发的!<br>
还有一种情形,页面中控件的Table、div容器的高度(height),如果你将其定义成百分比(例如 <b>height="100%"</b>),有可能也会导致该现象,因为我们发现,浏览器对百分比的高度的解析,在渲染过程中会有些不确定因素,建议您用js算出容器的高度,然后将高度修改成像素数.<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问6.我将硕正套件集成在ExtJS中,比如安置在TabPanel中,但是发现OnReady( )事件报错: "AF为空或不是对象",怎么解决?</b></td></tr></table>
<font color=#666666>答复: </font>最终插件肯定是安置在某个<form name="?" ...>中,请参考“使用指南”中的“9.Firefox和IE的一些差别”,你需要取得这个form的name。或者也可以用 document.getElementsByTags('form') 返回form的数组,如果只有1个form元素,也可以用 document.getElementsByTags('form')[0] 代替。<br>
此外,如果遵照ExtJS的建议,采用iframe作为容器的话,是不存在这个问题的。<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问7.InsertTreeList( )是在<div>中,再将其嵌到Table的<TD>中,为什么就看不见硕正组件了?</b></td></tr></table>
<font color=#666666>答复: </font>把<div>这一层去掉应该就可以。<br>
对硕正组件来说,<div>、<td>相当于都是“容器”,有一个容器就已经够了。<br>
如果选用<td>容器,通常还须确定<tr>的高度的像素数,否则组件仍有可能未显示。在Chrome浏览器中,甚至<td>中也必须明确高度的像素。<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问8.我在页面中安置了多个控件,经常有些莫名其妙的问题,例如录入数据丢失、会自动刷新、甚至浏览器崩溃,但是单个控件的页面又是没问题的,什么原因?</b></td></tr></table>
<font color=#666666>答复: </font><b>可能性一</b>: 你的OnReady( id )书写有问题,例如如下脚本就有严重问题:<br>
<pre class='cpp'>
function OnReady( id )
{
AF1.func( ... );
AF2.func( ... );
}</pre>
从中可以看出页面中有2个控件实例,而2个实例各自会触发OnReady事件,也就是说这段js会执行2遍,在执行第一遍时,另外一个实例可能还没有被浏览器创建,这样就会发生难以预料的错误,这也是初学者容易忽视的地方。<br>
正确的书写应该是:<br>
<pre class='cpp'>
function OnReady( id )
{
if(id == 'AF1')
AF1.func( ... );
else if(id == 'AF2')
AF2.func( ... );
}</pre>
<b>可能性二</b>:假设你的页面一打开,控件之间就需要交互,如果你写成如下这样,也有大问题:<br>
<pre class='cpp'>
function OnReady( id )
{
if(id == 'AF1') {
AF1.func( ... );
}
else if(id == 'AF2') {
var s = AF1.func( ... ); //在 OnReady('AF2')中访问其它对象:大忌
AF2.func( ... );
}
}</pre>
问题出在第7行,因为这个时候AF1可能尚未创建,浏览器<font color=red>未必</font>是按页面脚本的前后次序创建控件实例的。正确的写法可以参考如下的例子:<br>
<pre class='cpp'>
var count = 0; //计数器
function OnReady( id )
{
count++;
if(count==2) { //OnReady( )2遍了,此时2个对象均已创建,下面的代码就很安全了
AF1.func( ... );
var s = AF1.func( ... );
AF2.func( ... );
}
}</pre>
如下是一个更复杂的例子,请您分析一下问题的所在:<br>
<pre class='cpp'>
var bReadyAF1 = false;
var bReadyAF2 = false;
var bReadyAF3 = false;
function OnReady(id) {
if (id == 'AFList') {
AFList.func("Build", "build/base/OrgsList.xml");
bReadyAF1 = true;
}
else if (id == 'AFPager') {
AFPager.func("Build", "build/comm/Pager.xml");
bReadyAF2 = true;
}
else if (id == 'AFEditForm') {
AFEditForm.func("Build", "build/base/OrgsEdit.xml");
bReadyAF3 = true;
}
if (bReadyAF1 && bReadyAF2) {
var h = AFList.func("GetHandle", "");
AFPager.func("BindPager", h + "\r\n pageID"); //绑定
var url = "build/base/Org.ashx?Method=Orgs&StartRow=@startRow&Rows=@rows";
AFPager.func("SetObjProp", "PageID \r\n dataUrl \r\n" + url + "\r\n mode=asynch ");
}
if (bReadyAF3) {
WinEdit.hide();
}
}
</pre>
<br>
<b>可能性三</b>:如果你的页面很长(指高度),比如需要垂直滚动条, 如果插件一开始是隐藏在底部的,需要拖动滚动条才能显现,那么在IE中,插件是在初次显现时才会触发OnReady( )事件的!<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问9.我在<script>insertFreeForm('AF', '')</script>下加了一句<br><asp:Button ID="Button2" runat="server" Text="提交"/>后, 发现回车键不起作用了,怎么办?</b></td></tr></table>
<font color=#666666>答复: </font><asp:Button >对应到Html是<input type="submit" >,浏览器将拦截submit的回车事件。<br>
解决方法也很简单:将<script>insertFreeForm('AF', '')</script>安置在<Form>中、或将<asp:Button >安置在<Form>中就行。<br>
如果这二者都在<Form>中,只要将其中一个移出<Form>就行。<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问10.我的页面提交后,怎么组件中的数据全部丢失了?</b></td></tr></table>
<font color=#666666>答复: </font>原因就是:你的页面刷新了。 对于硕正套件而言,刷新相当于就是重新创建一遍控件实例、重新触发OnReady( )。所以为了保持状态,建议不要轻易使用刷新, 一般象<input type="submit" ...>、页面上传文件均会导致刷新, 原生的ASP.Net页面开发也经常会导致刷新。<br>
页面和后端的交互应尽可能使用AJAX, 而不是提交页面。<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问11.硕正演示页中有多种模式对话框方案,我该如何选择使用?</b></td></tr></table>
<font color=#666666>答复: </font>有3种方案,以下是方案的分析:<br>
方案1:直接使用html的window.showModalDialog( )。这是浏览器本身就支持的对话框,对话框中是一个独立页面,易于开发,但很多程序员不喜欢它的界面风格;<br>
方案2:使用能遮罩页面内容的js对话框。界面比较美观,并且对话框中也是一个独立页面,目前有很多开源项目,但并不是所有项目都能和硕正套件相配,在Treelist演示页中有一个改进后的lhgdialog的实例可参考;<br>
方案3:使用硕正套件内置的自定义对话框,对话框中是一个Freeform,并且该Freeform可以是URL,也可以是XML大串,比较适合于服务器端的动态生成,常用于诸如查询条件、单据查询等简单场合。自定义对话框分模式、非模式对话框二种,二者的差别在于:<br>
A.非模式对话框, 是线程不阻塞的对话框,所以支持js的OnEvent事件交互,但开发稍复杂,并且其窗口被包容在组件内部;<br>
B.模式对话框, 是Windows标准对话框,主线程是阻塞的,所以开发稍简单,但不支持js的事件交互、对话框打开期间不能切换浏览器的选项卡(Tab)、并且对Firefox浏览器支持不好(易僵死);<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问12.FireFox访问页面元素都需要采用 getElementById() 或 getElementByName() 函数,访问插件也需要这样写吗?</b></td></tr></table>
<font color=#666666>答复: </font> 不需要,因为插件是一种特殊的页面元素,可以直接访问,本demo页中均是这样写的。在这一点上,FireFox和IE是没区别的.<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问13.在Firefox浏览器下,我修改了XML模板文件,但Treelist或Report经常无法刷新,加载的仍然是老文件,清理了浏览器的缓存也不顶用,这是怎么回事?</b></td></tr></table>
<font color=#666666>答复: </font> 硕正套件的底层Http通讯直接使用了 Windows 的 WinInet 基础组件,所以它实际上是共享了 IE 的 Cache,你应该清理 IE 的 Cache.<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问14.在Firefox 4.0下,发现在OnEvent( )事件中调用js函数 alert( ) 后浏览器有时会死机,如何解决?</b></td></tr></table>
<font color=#666666>答复: </font> 请用全局函数MessageBoxFloat代替alert( )吧.<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问15.我的网站在IE下完全正常,但在FireFox、Chrome下有很多问题,怎么办?</b></td></tr></table>
<font color=#666666>答复: </font> HTML、CSS、JavaScript、正则表达式本身在IE和FireFox、Chrome下就有不少的差别,你需要先搞定和硕正套件无关的那些内容.<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问16.我的网站在IE下完全正常,但为什么在FireFox下却发现同一个插件会多次触发OnReady( )事件?</b></td></tr></table>
<font color=#666666>答复: </font> 可以肯定地说,一个插件只会触发一次OnReady( )。但是页面中样式发生变化时,FireFox可能会重新渲染一次的,导致插件被多次销毁、创建,每次创建肯定都会触发OnReady( )事件.<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问17.当Session过期时,执行Load加载不到数据,能否让客户端有个提示?</b></td></tr></table>
<font color=#666666>答复: </font> 请参考开发者指南的《公共内容》下的“4.XML/JSON异常包”,相信您会满意!<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问18.可以结合Ext-JS开发吗?</b></td></tr></table>
<font color=#666666>答复: </font> 可以。事实上,我们很多成熟的用户都是以Ext-JS作为框架,包容了Supcan插件的。<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问19.从安全考虑,我后端的程序需要甄别哪些请求来自页面、哪些来自硕正套件。怎么才能知道 request 请求是来自硕正套件的?</b></td></tr></table>
<font color=#666666>答复: </font> 从硕正插件发起的http请求,它的http头大多是这样的格式:<br>
<pre class='cpp'>
GET /supcan/treelistdata/data.txt HTTP/1.1
Accept-Encoding: gzip, deflate
Content-Type: text/html; charset=UTF-8
User-Agent: BC
Host: localhost:8081
Cache-Control: no-cache</pre>
里面的 "User-Agent" 固定是 "BC",你只要判断这个属性就行。<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问20.我看到几乎所有demo页源码的底部都执行了 nstd.js,我们自己的页面有必要使用这个js吗?</b></td></tr></table>
<font color=#666666>答复: </font> 没有必要,执行该js反而会影响性能。该js是硕正demo页格式化示例源码显示用的。<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问21.有时候敲“BackSpace”键会导致页面回退,即回到上一个页面,如何避免这种现象?</b></td></tr></table>
<font color=#666666>答复: </font> 如果当前焦点是硕正控件,应该是不会发生这种情况的,否则是有可能的,因为这个时候键盘的控制权不在控件。但是我们可以给您一个建议:请在页面按钮的js脚本的末尾处添加一句诸如:focusIE(AF),该语句的作用是把焦点切换给控件 (此函数在 dynaload.js 中)。<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问22.发现某些页面的 Treelist 或 Report的回车键都不起作用,怎么回事呢?</b></td></tr></table>
<font color=#666666>答复: </font> 请检查一下您的页面源码,是否包含了这种页面元素: <button type="submit" ... >,因为 submit 将独占回车事件,硕正控件无法获得。<br>
此外,submit是提交整个页面,将导致页面的刷新,过多的刷新不符合用户的习惯,建议将 type="submit" 换成 type="button"。<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问23.我隐藏了含硕正控件的Div图层, jquery是这样写的: $("#divMain").hide(); ,再显示图层时,发现里面数据清空了,似乎控件被销毁后又重建了。在Chrome、Firefox下有这个问题,IE下没问题,这是怎么回事啊?</b></td></tr></table>
<font color=#666666>答复: </font> hide 是设置图层的 display 为 none,这样会导致里面的控件被自动销毁。请您重新写个隐藏的方法:设置 visibility 为 hidden 就可以了。<br>
<br>
<table cols=2 border=0><tr><td><img src='why.bmp'></td><td><b>问24.我后端一进入调试(Debug),发现浏览器就僵死,这正常吗?</b></td></tr></table>
<font color=#666666>答复: </font>正常,因为控件一直等着服务器返回 response 呢!<br>
<br>
<br>
<br><br><br>
<script type='text/javascript' src='nstd.js'></script>
</body></html>