有没想过在javascript中使用recordset?原来在客户端操作数据也可以这样简单,定义一个数据源,将数据绑定在各种tag上,实现应用程序般的效果,酷毙了!(首先申明一点,文章的内容全部来自msdn,不过用我自己的话总结而已。)
先看看这样两个例子:
http://msdn.microsoft.com/workshop/samples/author/databind/dbevts.htm
http://msdn.microsoft.com/workshop/samples/author/databind/dbupdate.htm
不得不又一次佩服微软。
这个是DataBinding的架构:
当然实现数据绑定有下面几步:
**第一步,定义数据源
** 从IE4.0起,就支持下面四种数据源:
Tabular Data Control (TDC)
TDC提供了一个简单的访问带有格式的文本数据的方法,一般是csv文件。
下面是一个简单的示例:
1<object classid="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83" height="0" id="dsoComposer" width="0">
2<param name="DataURL" value="composer.csv"/>
3</object>
Remote Data Service (RDS)
远程数据服务,直接访问远程服务器端的数据,Internet Explorer 4.0. RDS 通过OLE-DB 或 Open Database Connectivity (ODBC)来实现。
示例:
1<object classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" height="0" id="dsoComposer" width="0">
2<param name="Server" value="http://musicserver"/>
3<param name="Connect" value="dsn=music;uid=guest;pwd="/>
4<param name="SQL" value="select compsr_name from composer"/>
5</object>
不过感觉有点安全性的问题,因为客户端能看到这段代码。
XML Data Source
XML就不多说了,在IE4.0中这样使用:
1<applet code="com.ms.xml.dso.XMLDSO.class" height="0" id="xmldso" mayscript="true" width="0">
2<param name="URL" value="composer.xml"/>
3</applet>
Internet Explorer 5以上可以这样:
另外IE还提供了一个XML数据岛的概念: XML Data Islands .
MSHTML Data Source
html数据页示例:
1<h1 id="COMPSR_FIRST">Hector</h1>
1<marquee id="COMPSR_LAST">Berlioz</marquee>
1<div id="COMPSR_BIRTH">1803</div>
1<h2 id="COMPSR_FIRST">Modest</h2>
1<h3 id="COMPSR_LAST">Moussorgsky</h3>
1<button id="COMPSR_BIRTH">1839</button>
1<textarea id="COMPSR_FIRST">Franz</textarea>
1<xmp id="COMPSR_LAST">Liszt</xmp>
1<span id="COMPSR_BIRTH">1811</span>
一旦定义可以这样访问:
1<object data="compdata.htm" height="0" id="htmlComposer" width="0">
2</object>
**.第二步:绑定数据到HTML元素上
** 一般都是通过tag中的datasrc和datafld实现绑定的。例如:
1<input datafld="compsr_last" datasrc="#dsoComposers" type="TEXTBOX"/>
和
1<table datasrc="#dsoComposer">
2<tr>
3<td><div datafld="compsr_first"></div></td>
4</tr>
5</table>
这个是绑定表格的示例:
http://msdn.microsoft.com/workshop/samples/author/databind/dbtable.htm
其中数据来源:
1<object classid="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83" id="tdcComposers">
2<param name="DataURL" value=" http://msdn.microsoft.com/workshop/samples/author/databind/composer.csv "/>
3<param name="UseHeader" value="True"/>
4<param name="TextQualifier" value="'"/>
5</object>
绑定的table
1<table datasrc="#tdcComposers">
2<thead><tr style="font-weight:bold">
3<td>First</td><td>Last</td><td>Birth</td><td>Death</td><td>Origin</td>
4</tr></thead>
5<tbody>
6<tr>
7<td><div datafld="compsr_first"></div></td>
8<td><div datafld="compsr_last"></div></td>
9<td><div datafld="compsr_birth"></div></td>
10<td><div datafld="compsr_death"></div></td>
11<td><div datafld="origin"></div></td>
12</tr>
13</tbody>
14</table>
这就是效果了:
First | Last | Birth | Death | Origin |
---|
Hector
|
Berlioz
|
1803
|
1869
|
France
Modest
|
Moussorgsky
|
1839
|
1881
|
Russia
Franz
|
Liszt
|
1811
|
1886
|
France
Antonio
|
Vivaldi
|
1678
|
1741
|
Italy
Johann Sebastian
|
Bach
|
1685
|
1750
|
Germany
Ludwig van
|
Beethoven
|
1770
|
1827
|
Germany
Wolfgang Amadeus
|
Mozart
|
1756
|
1791
|
Austria
Joseph
|
Haydn
|
1732
|
1809
|
Germany
Claude
|
Debussy
|
1862
|
1918
|
France
** 第三步:数据的动态添加,删除等等(对象模型) **
当然绑定可以是动态的:
在script中:
span1.dataSrc = "#dsoComposer";
span1.dataFld = "compsr_first";
html是这样的:
1<span datafld="compsr_first" datasrc="#dsoComposer"></span>
而且可以访问数据源的ado:
var oRecordSet = dsoComposer.recordset;
自然就有 oRecordSet .MoveNext 等等。
如:
1<input id="cmdNavFirst" onclick="tdcComposers.recordset.MoveFirst()" type="BUTTON" value="<<"/>
1<input id="cmdNavPrev" onclick="tdcComposers.recordset.MovePrevious();
2if (tdcComposers.recordset.BOF)
3tdcComposers.recordset.MoveFirst();" type="BUTTON" value=" < "/>
1<input id="cmdNavNext" onclick="tdcComposers.recordset.MoveNext();
2if (tdcComposers.recordset.EOF)
3tdcComposers.recordset.MoveLast();" type="BUTTON" value=" > "/>
1<input id="cmdNavLast" onclick="tdcComposers.recordset.MoveLast()" type="BUTTON" value=">>"/>
还可以这样用:
1<script language="VBScript">
2For Each objFld in rsAttendees.Fields
3document.write("The field name is " & objFld.Name & "<BR>")
4document.write("The field value is " & objFld.Value & "<BR>")
5Next
6</script>
添加删除记录就是:oRecordSet.AddNew()以及oRecordSet.Delete()。
**第三步:响应各种数据事件(事件模型)
** 如何在数据更改后做出相应的处理?
msdn中提供的方法是这样的:
1<script event="onchange(事件名)" for="cboSort(数据源名)">
2……
3</script>
这些是事件名列表:
Event | Bubbles | Cancelable | Applies to | Introduced In Internet Explorer Version |
---|
onbeforeupdate
|
True
|
True
|
bound elements
|
4.0
onafterupdate
|
True
|
False
|
bound elements
|
4.0
onrowenter
|
True
|
False
|
DSO
|
4.0
onrowexit
|
True
|
True
|
DSO
|
4.0
onbeforeunload
|
False
|
False
|
window
|
4.0
ondataavailable
|
True
|
False
|
DSO
|
4.0
ondatasetcomplete
|
True
|
False
|
DSO
|
4.0
ondatasetchanged
|
True
|
False
|
DSO
|
4.0
onerrorupdate
|
True
|
True
|
bound elements
|
4.0
onreadystatechange
|
True
|
False
|
DSO
|
4.0
oncellchange
|
True
|
False
|
DSO
|
5.0
onrowsinserted
|
True
|
False
|
DSO
|
5.0
onrowsdelete
|
True
|
False
|
DSO
|
5.0
怎么样?
我觉得 http://msdn.microsoft.com/workshop/samples/author/databind/dbevts.htm 算是一个应用比较综合的例子了,好好研究一下,必有收获。
网上有不少利用数据绑定实现分页的示例,其实数据绑定还可以做更多的事情吧?应该在rich client里面有非常大的应用,例如制作非常复杂的datagrid。
现在想进一步搞清楚的是如何简便实现与服务器端的同步,因为客户端的数据绑定是对服务器端没有影响的(你可以从服务器端生成数据源,但是在客户端的操作不会自动返回服务器),msdn上说RDS可以,但是这种方法太笨拙了吧,又不安全。