天天看點

關于JavaScript腳本中的alert思考的延展

     對于[JavaScript腳本中的alert的問題]我通過推想的辦法來進行分析,首先我假設在alert會給造成壓力,那麼我就該對alert在不同的場合結合會造成壓力的理由進行結果推測,比如說有說法由于alert可能使伺服器和IE的通信一直被保持,直到alert被關閉。那麼對于這種理由的推測想象就是監視伺服器端的連接配接,其連接配接會一直保持着。如果結果不是如此,則說明原先的假設不成立。

    [JavaScript腳本中的alert的問題]的幾個有争議的地方有:

    1:html是否在完全被傳送到客戶段之後才顯示?

    2:JavaScript是否在html完全顯示後執行?

    3:如果JavaScript在html沒有被完全顯示就可以執行,那麼此時的alert會不會是浏覽器本身與伺服器端的通信處于等待狀态?( [JavaScript腳本中的alert的問題]alert狀态下,浏覽器會處于等待狀态是指浏覽器自身目前的線程處于等待狀體)

    首先我們先假設html是在完全被傳送到客戶段之後才顯示。那麼我們在打開網頁的時候也就會有這種現象出現:如果打開很大的網頁(指資料比較多,圖檔很大)時候,剛剛打開的時候會是一片空白,過了一段時間之後畫面會突然出現。空白的時候是浏覽器在與伺服器請求資料,由于資料很大,請求的時間就會相應長。那麼在這段時間内由于html資料沒有傳送完成,浏覽器不會顯示html的資訊,是以會一片空白。

    對此我做了一個測試試樣:

關于JavaScript腳本中的alert思考的延展

private void Page_Load(object sender, System.EventArgs e)

關于JavaScript腳本中的alert思考的延展

{

關于JavaScript腳本中的alert思考的延展

    for(int i=0;i<50;i++)

關于JavaScript腳本中的alert思考的延展

    {

關于JavaScript腳本中的alert思考的延展

        this.Page.Response.Write("<table> <tr><td>");

關于JavaScript腳本中的alert思考的延展

            using (FileStream fs = File.OpenRead(@"D:\Inetpub\wwwroot\Test\123.bmp")) 

關于JavaScript腳本中的alert思考的延展

            {

關于JavaScript腳本中的alert思考的延展

                byte[] b = new byte[1024];                

關于JavaScript腳本中的alert思考的延展

                while (fs.Read(b,0,b.Length) > 0) 

關于JavaScript腳本中的alert思考的延展

                {

關于JavaScript腳本中的alert思考的延展

                    this.Page.Response.Write(b);

關于JavaScript腳本中的alert思考的延展

                }

關于JavaScript腳本中的alert思考的延展

            }

關于JavaScript腳本中的alert思考的延展

        this.Page.Response.Write("</table> </tr></td>");

關于JavaScript腳本中的alert思考的延展

    }

關于JavaScript腳本中的alert思考的延展

}

我通過直接将一大檔案往網頁内寫。檔案是一張比較大的圖檔:有2M多,通過50次的循環讀寫,那麼發送到客戶段的資料超過100M,這樣浏覽器的處理起來的時候就會比較慢。從測試的結果是浏覽器逐漸的顯示出接收到的内容。與期望的一次性顯示并不相同。

對于這個顯現的原因是:浏覽器在接收到的資料中,每當接受到一個完整的Table内容後就會顯示,并不是将所有的資料都接收完成後一次性的顯示出來。這種顯現可能大夥在通路圖檔比較多的網站的時候可能會常常遇到,打開一個網頁等了半天還是隻顯示了一部分。

這就說明了1:html是不是在完全被傳送到客戶段之後顯示。

    對于第二個問題我假設JavaScript腳本是在Html顯示完全後才能被執行,對于設計的測試方法我隻是簡單的在循環操作開始前添加如下面依據話:

    this.Page.Response.Write("<SCRIPT >alert(\"ee\");</SCRIPT>");

    假如JavaScript腳本是在Html顯示完全後才能被執行,那麼在所有的資訊顯示完全之前不會彈出alert對話框。但是測試的結果是在頁面内容顯示之前就執行了腳本。

接下來網頁會繼續往下顯示。

   對于這個現象的原應是:浏覽器在接受到部分相對完整的資料(比如說一個Table)就顯示。在顯示過程中如果遇到腳本就會執行。

這就說明了2:JavaScript腳本在是在Html顯示過程中可以被執行。

由于有了1和2的不成立,才可以推斷3。如果1和2都成立的話,那麼由于腳本是在Html被發送完成之後再執行,那麼此時浏覽器已經與伺服器斷開的通信(由于HTTP協定的特點,在伺服器将浏覽器請求的資料發送完成之後,即斷開與客戶機的連接配接操作)那麼此時執行alert即時使浏覽器目前線程處于等待狀态,也不會對伺服器造成任何影響)

       由于1和2的測試結果使3的答案無法定論。是以假設會給伺服器造成壓力,而造成壓力的理由是:由于alert使浏覽器處于等待狀态,這個時候可能與伺服器的通信還沒有終止,是以會使用戶端與伺服器長時間連接配接在一起,進而造成壓力。如果上叙理由成立,那麼此時監視伺服器就會發現IIS目前會一直處于激活狀态。

       通過軟體測試,首先把IIS中的站點屬性設定中将[啟用HTTP激活]去掉。然後通過軟體簡單的監視IIS的連接配接數。

     測試的結果是在alert沒有被關閉之前,IIS并沒有保持激活狀态,這也就說明IIS并沒有與用戶端一直保持通信協定。

       對于這個現象的原應是:由于通信協定的特點決定的,由于網絡通信協定中是自底向上服務的特點,HTTP協定也是通過網絡中的TCP/IP協定進行通信。由于通信協定的服務特點,是以即使是浏覽器處于正待狀态,這并不影響底層的TCP通信。因為TCP自下向上服務,對于上層調用不去過多的理會下層的操作狀态。

    好了這個問題也就解釋清楚了,希望能夠對大夥有所幫助。

本文轉自小餘(Yice)部落格園部落格,原文連結:  http://www.cnblogs.com/yice/archive/2008/04/17/228951.html  ,如需轉載請自行聯系原作者

繼續閱讀