利用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);
      }
      
    }
  }
 
        
