如何在VS.NET/C# Builder開發的網頁中也能實現DOS下錄入數據回車換行的功能 北京煤炭科學研究總院經濟與信息研究所 丁報圣
在DOS年代,錄入數據時我們習慣了在錄入完一行數據后敲一個回車轉入下一行的數據錄入。昔日DOS的輝煌已經成為過去,如今更加友好易用的GUI圖形操作界面Windows已經進入了我們的日常生活。 1996年Windows95的出現是軟件史上的一次偉大革命。Windows 是美國微軟公司開發的一種圖形方式的操作系統,它的出現克服了 DOS 中難記的一些命令,使計算機與人更親近,只要輕輕點擊鼠標,計算機就會完成一個動作。同時windows也改變了原先DOS下錄入數據敲回車的方式,現在我們若是在錄入數據時希望光標跳到下一行或下一個輸入框則只能按鍵盤上的TAB鍵或用鼠標點擊下一個輸入框。這個改變對于沒有接觸過DOS操作系統的計算機用戶也許沒有什么大的影響,但是對于從DOS下轉過來的的計算機用戶卻是一個雞肋;特別是我們的數據錄入人員,在DOS年代已經習慣在錄入一行數據時敲一下回車繼續下一行數據的錄入。能不能眷顧一下這些老用戶的習慣也是我們開發人員應該考慮的事情。 筆者在前不久的一個項目中就遇到了這樣的問題:用戶要求我們的前臺錄入頁面提供支持回車換行的功能。做過開發的人都知道在傳統windows應用程序中實現回車換行其實并不太難,我們可以通過截獲鍵盤的回車按鍵值,然后通過發送消息使錄入界面中的下一控件(如:文本框輸入框等)獲得輸入焦點來達到這個目的。在WEB頁面中我們也可以通過腳本(JAVASCRIPT或VBSCRIPT)語言設置WEB控件的焦點來實現。 在傳統的ASP或JSP/PHP中編寫的WEB應用程序中實現回車換行的功能時,我們通常的做法就是在控件的OnkeyPress事件、OnClick事件或頁面中的OnSubmit等事件中寫上一段JAVASCRIPT或VBSCRIPT代碼捕捉到鍵盤回車的鍵值,然后人為指定跳轉順序實現回車換行,這種做法缺點只能適用于頁面控件元素很少項目不大的場合,一旦頁面控件元素或該類文件很多時,這種人工方式必然要消耗很大的工作量。能不能有一個行之有效的辦法使我們一勞永逸?這就是本文筆者要討論的內容。諸位看官莫急,容我慢慢道來: 我們的項目是用VB.NET開發的,前臺錄入界面是VB.NET程序編譯后生成的HTML頁面,在瀏覽器中運行。VB.NET開發的程序最大的好處是程序代碼可以和界面相隔離,也就是相互獨立;但是用VB.NET開發的程序編譯后生成的HTML錄入界面中的控件元素名稱是很難確定的,雖然也會具有一定的命名規則。在編譯前我們是無法得知編譯生成頁面上的可錄入控件元素名稱的。 這樣一來我們就碰到了一個問題,難道說我們要實現DOS下的回車換行功能就只有打開一個個的ASPX文件查看其中的元素名稱,然后按ASP或JSP/PHP中的做法寫相應的JAVASCRIPT或VBSCRIPT代碼了嗎?這顯然是一個讓人暈倒的事實;我們的這個項目有上百個ASPX文件,要打開上百個文件一一按ASP或JSP/PHP中的做法寫下JAVASCRIPT或VBSCRIPT回車實現代碼簡直就是奇聞。筆者通過查MSDN和反復實踐找到了解決方法。 下面我將用JavaScript腳本語言為例來解決這個問題,在寫代碼前我得向大家介紹一些相關知識;瀏覽器中瀏覽的頁面文件在JavaScript中稱之為一個文檔對象(DOM)。在 JavaScript 能夠涉及的范圍內有如下幾個“大”對象:Window, Document, Location, Navigator, Screen, History 等。Window對象是Document、Location和History對象的父對象。 圍繞我們要解決的問題,這里我們重點提一下Document、Form、Elements三個對象及Onkeypress事件,Document 文檔對象:是指描述當前窗口或指定窗口對象的文檔。它包含了文檔從<head>到</body>的內容。用法:document (當前窗口)或 <窗口對象>.document (指定窗口) ; Form 對象:document.forms[] 是一個數組,包含了文檔中所有的表單Form ;Elements對象:為表單元素對象,<表單對象>.elements 是一個數組,包含了該表單所有的對象;Onkeypress事件是一個鍵盤事件,是在用戶按下鍵盤上的鍵時引發的事件。通過這三大對象再配合Onkeypress事件就可以完成現我們的要求; 下面是最終的實現代碼清單: var JumpTypeArray =new Array("text","password","textarea","checkbox","radio", "select","select-one","select-multiple","file")//引用頁面上可獲得焦點元素類型 var DebarTypeArray =new Array("submit","reset","button","checkbox","radio", "select","select-one","select-multiple","hidden")//引用頁面上需排除元素類型 function inStrArray(src,dec) {//檢查給定串是否在指定字符串數組中,如在返回索引號,否返回-1; for (var i=0 ; i<dec.length; i++) { if (src==dec[i]) { return i;//定位成功,返回索引號 break; } } return -1; //定位失敗,返回-1 } function checkCR(evt) {//回車響應函數 var evt = (evt) ? evt : ((event) ? event : null); var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null); var frm=document.forms[0]; //指定FORM名稱為頁面中的第一個 if ((evt.keyCode == 13) && (inStrArray(node.type,JumpTypeArray)!=-1)) {//判斷當前對象是否為可輸入對象,對象類型數組:JumpTypeArray for (var i = 0 ; i < frm.elements.length; i++) {//for begin if (frm.elements[i].name==node.name) {//定位當前對象 if ((i+1)< frm.elements.length) {//對象數組索引越位判斷 if (inStrArray(frm.elements[i+1].type,JumpTypeArray)!=-1) { //判斷當前對象下一個對象是否為可輸入組件,對象類型數組:JumpTypeArray frm.elements[i+1].focus();//設置焦點 if (inStrArray(frm.elements[i+1].type,DebarTypeArray)==-1) { //過濾不可選中文本對象,對象類型數組:DebarTypeArray frm.elements[i+1].select();//選中組件文本內容 } } return false;//禁止提交表單內容 break; } else {//提交表單內容 return true; break; } } }//end for } } document.onkeypress = checkCR;
引用說明:將上面的代碼存成文件,如:WebEnter.js,然后在要實現回車換行的頁面中寫上: <script language="JavaScript" src="path+WebEnter.js"></script> 即可。 Path:是WebEnter.js文件所在路徑。
適用環境:Windows9x/NT/2000/XP+ASP/JSP/PHP/ASP.NET+IE4.x(及以上版本)
注意事項: 1、引用頁面中不能有多個表單(Form)。 2、引用頁面中不允許有重名對象(object)。
調用例子:http://dbs.myrice.com/dbs/Demo.html
最后需要說明的是:當引用頁面在NS系列瀏覽器中瀏覽時,以上代碼需修改,因為在NS中的瀏覽器對象和IE中的對象是有一點區別的,這個就留給讀
|