HTML中的數(shù)據(jù)綁定
信息來源:Wayne_Deng的專欄
有沒想過在java script中使用recordset?原來在客戶端操作數(shù)據(jù)也可以這樣簡單,定義一個數(shù)據(jù)源,將數(shù)據(jù)綁定在各種tag上,實現(xiàn)應(yīng)用程序般的效果,酷斃了?。ㄊ紫壬昝饕稽c,文章的內(nèi)容全部來自msdn,不過用我自己的話總結(jié)而已。)
先看看這樣兩個例子:
http://msdn.microsoft.com/workshop/samples/author/databind/dbevts.htm
http://msdn.microsoft.com/workshop/samples/author/databind/dbupdate.htm
不得不又一次佩服微軟。
這個是DataBinding的架構(gòu):
當(dāng)然實現(xiàn)數(shù)據(jù)綁定有下面幾步:
第一步,定義數(shù)據(jù)源
從IE4.0起,就支持下面四種數(shù)據(jù)源:
Tabular Data Control (TDC)
TDC提供了一個簡單的訪問帶有格式的文本數(shù)據(jù)的方法,一般是csv文件。
下面是一個簡單的示例:
<OBJECT CLASSID="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83"
ID=dsoComposer WIDTH=0 HEIGHT=0>
<PARAM NAME="DataURL" VALUE="composer.csv">
</OBJECT>
Remote Data Service (RDS)
遠程數(shù)據(jù)服務(wù),直接訪問遠程服務(wù)器端的數(shù)據(jù),Internet Explorer 4.0. RDS 通過OLE-DB 或 Open Database Connectivity (ODBC)來實現(xiàn)。
示例:
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
ID=dsoComposer HEIGHT=0 WIDTH=0>
<PARAM NAME="Server" VALUE="http://musicserver">
<PARAM NAME="Connect" VALUE="dsn=music;uid=guest;pwd=">
<PARAM NAME="SQL" VALUE="select compsr_name from composer">
</OBJECT>
不過感覺有點安全性的問題,因為客戶端能看到這段代碼。
XML Data Source
XML就不多說了,在IE4.0中這樣使用:
<APPLET
CODE="com.ms.xml.dso.XMLDSO.class"
ID="xmldso"
WIDTH="0"
HEIGHT="0"
MAYSCRIPT="true">
<PARAM NAME="URL" VALUE="composer.xml">
</APPLET>
Internet Explorer 5以上可以這樣:
<!--[if gte IE 5]>
<XML ID="xml1">
<topic-info>
<page-type>reference</page-type>
<member-type>property</member-type>
<persistent-name>ACCESSKEY</persistent-name>
<runtime-name readable="1" writeable="1">accessKey</runtime-name>
<abstract>Sets or retrieves the accelerator key for the object.</abstract>
</topic-info>
</XML>
<![endif]-->
另外IE還提供了一個XML數(shù)據(jù)島的概念:XML Data Islands.
MSHTML Data Source
html數(shù)據(jù)頁示例:
<H1 ID=COMPSR_FIRST>Hector</H1>
<MARQUEE ID=COMPSR_LAST>Berlioz</MARQUEE>
<DIV ID=COMPSR_BIRTH>1803</DIV>
<H2 ID=COMPSR_FIRST>Modest</H2>
<H3 ID=COMPSR_LAST>Moussorgsky</H3>
<BUTTON ID=COMPSR_BIRTH>1839</BUTTON>
<TEXTAREA ID=COMPSR_FIRST>Franz</TEXTAREA>
<XMP ID=COMPSR_LAST>Liszt</XMP>
<SPAN ID=COMPSR_BIRTH>1811</SPAN>
一旦定義可以這樣訪問:
<OBJECT ID=htmlComposer DATA="compdata.htm" HEIGHT=0 WIDTH=0>
</OBJECT>
.第二步:綁定數(shù)據(jù)到HTML元素上
一般都是通過tag中的datasrc和datafld實現(xiàn)綁定的。例如:
<INPUT TYPE=TEXTBOX DATASRC="#dsoComposers" DATAFLD="compsr_last">
和
<TABLE DATASRC=#dsoComposer>
<TR>
<TD><DIV DATAFLD=compsr_first></DIV></TD>
</TR>
</TABLE>
這個是綁定表格的示例:
http://msdn.microsoft.com/workshop/samples/author/databind/dbtable.htm
其中數(shù)據(jù)來源:
<OBJECT id="tdcComposers" CLASSID="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83">
<PARAM NAME="DataURL" VALUE="http://msdn.microsoft.com/workshop/samples/author/databind/composer.csv">
<PARAM NAME="UseHeader" VALUE="True">
<PARAM NAME="TextQualifier" VALUE="'">
</OBJECT>
綁定的table
<TABLE datasrc=#tdcComposers>
<THEAD><TR STYLE="font-weight:bold">
<TD>First</TD><TD>Last</TD><TD>Birth</TD><TD>Death</TD><TD>Origin</TD>
</TR></THEAD>
<TBODY>
<TR>
<TD><DIV datafld="compsr_first"></DIV></TD>
<TD><DIV datafld="compsr_last"></DIV></TD>
<TD><DIV datafld="compsr_birth"></DIV></TD>
<TD><DIV datafld="compsr_death"></DIV></TD>
<TD><DIV datafld="origin"></DIV></TD>
</TR>
</TBODY>
</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
第三步:數(shù)據(jù)的動態(tài)添加,刪除等等(對象模型)
當(dāng)然綁定可以是動態(tài)的:
在script中:
span1.dataSrc = "#dsoComposer";
span1.dataFld = "compsr_first";
html是這樣的:
<SPAN DATASRC="#dsoComposer" DATAFLD="compsr_first"></SPAN>
而且可以訪問數(shù)據(jù)源的ado:
var oRecordSet = dsoComposer.recordset;
自然就有oRecordSet .MoveNext等等。
如:
<INPUT ID=cmdNavFirst TYPE=BUTTON VALUE="<<"
onclick="tdcComposers.recordset.MoveFirst()">
<INPUT ID=cmdNavPrev TYPE=BUTTON VALUE=" < "
onclick="tdcComposers.recordset.MovePrevious();
if (tdcComposers.recordset.BOF)
tdcComposers.recordset.MoveFirst();">
<INPUT ID=cmdNavNext TYPE=BUTTON VALUE=" > "
onclick="tdcComposers.recordset.MoveNext();
if (tdcComposers.recordset.EOF)
tdcComposers.recordset.MoveLast();">
<INPUT ID=cmdNavLast TYPE=BUTTON VALUE=">>"
onclick="tdcComposers.recordset.MoveLast()">
還可以這樣用:
<SCRIPT Language="VBScript">
For Each objFld in rsAttendees.Fields
document.write("The field name is " & objFld.Name & "<BR>")
document.write("The field value is " & objFld.Value & "<BR>")
Next
</SCRIPT>
添加刪除記錄就是:oRecordSet.AddNew()以及oRecordSet.Delete()。
第三步:響應(yīng)各種數(shù)據(jù)事件(事件模型)
如何在數(shù)據(jù)更改后做出相應(yīng)的處理?
msdn中提供的方法是這樣的:
<SCRIPT FOR=cboSort(數(shù)據(jù)源名) EVENT=onchange(事件名)>
……
</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算是一個應(yīng)用比較綜合的例子了,好好研究一下,必有收獲。
網(wǎng)上有不少利用數(shù)據(jù)綁定實現(xiàn)分頁的示例,其實數(shù)據(jù)綁定還可以做更多的事情吧?應(yīng)該在rich client里面有非常大的應(yīng)用,例如制作非常復(fù)雜的datagrid。
現(xiàn)在想進一步搞清楚的是如何簡便實現(xiàn)與服務(wù)器端的同步,因為客戶端的數(shù)據(jù)綁定是對服務(wù)器端沒有影響的(你可以從服務(wù)器端生成數(shù)據(jù)源,但是在客戶端的操作不會自動返回服務(wù)器),msdn上說RDS可以,但是這種方法太笨拙了吧,又不安全。