利用web workers在后台線程中實現對數據庫的增刪改查操作,並在后台線程中生成頁面上某個列表的完整的HTML代碼,然后再前台腳本中直接將這段HTML代碼輸出到頁面上!
利用web workers可以實現無刷新的更新界面,而且還可以多線程處理其它功能,不必等到后台服務器代碼執行完后才能在頁面上執行下一步操作。有人會問AJAX也可以實現無刷新更新頁面,但是如果在后台服務器端執行代碼耗時較長,頁面就會停止在不能操作的狀態,如果拖過頁面,可能會造成頁面假死的狀態。
利用web workers API創建后台線程:
1.將后台執行的腳本文件的URL地址作為worker的參數,在后台線程中不能訪問頁面或窗口對象。如果在后台程序中包含window或是document對象,就會引發錯誤。
var worker=new worker("worker.js");
2.在后台線程中接收消息,利用worker對象的onmessage事件句柄獲取消息;
worker.onmessage=function(event) { //處理收到的消息 }
3.利用worker對象的postmessage方法想后台線程發送消息;發送消息是文本數據,也可以是任何的JavaScript對象(需要通過JSON對象的stringify方法將其轉換成文本數據)
worker.postMessage(message);
下面講述一個實例,更好的闡述web workers的實現過程:
1.前端頁面上的JavaScript腳本
function windowOnLoad() { var worker=new worker("bgwork.js");//其中bgwork.js為后台線程運行的腳本文件 worker.postMessage("load");//post為發送消息的文本數據 或是 data=new object(); worker.postMessage(JSON.stringify(data));//post為發送消息的文本數據 worker.onmessage=function(event) { if(event.data=="數據庫連接發生錯誤!"||event.data=="讀取數據失敗!") { alert(event.data); } else { //處理返回回來的數據 } } }
2.在后台線程中運行的JavaScript腳本
onmessage=function(event){ if(event.data=="load") { var xhr=new XMLHtttpRequest(); xhr.open("post","ceshi.aspx?type=load");//ceshi.aspx該頁面為新建頁面,專門處理前端數據傳過來后向數據庫的增刪改查功能; xhr.onreadystatechange= function(){ var result=xhr.responseText; if(xhr.readyState==4) { if(result=="數據庫連接發生錯誤!"||event.data=="讀取數據失敗!") postMessage(result); else { string str="";//處理經過服務端處理過的數據,然后返回前端 postMessage(str); } } } xhr.send(null); } }
3.在ceshi.aspx頁面處理數據
protected void Page_Load(object sender,EventArgs) { string type=Request.QueryString["type"].ToString(); if(type.Equals("load")) { string result=""; using(MemoryStream stream=new MemoryStream()) { //處理數據 ArrayList dataArray=new ArrayList=new ArrayList(); SerializeArray.WriteObject(stream,dataArray); result=Encoding.UTF8.GetString(stream.ToArray()); this.WirteReturnStr(result); } } }