關於JavaScript指令碼中的alert思考的延展

來源:互聯網
上載者:User

       關於JavaScript指令碼中的alert的問題我在[關於JavaScript指令碼中的alert思考 ]中曾經提過,也得到了大夥的回答。其實從某種觀點上看這是個不值得一提的問題。但是我又把這個問題重新提出,我提出的目的不在於得到這個問題的結果:JavaScript指令碼中的alert是一定會給伺服器造成壓力,還是不會造成壓力。
     我希望通過對問題的分析來讓更多的人明白該如何去猜想,分析,解決,問題。從實際的資料中得到結果。有部分朋友在[關於JavaScript指令碼中的alert思考 ]給出了回答,但是這些回答多少欠缺一點東西,比如說部分人回答說提出這個問題時對Http些細不瞭解。但是對於這種答案並沒有解釋問題的關鍵:為什麼不會給瀏覽器造成壓力。在此我重新對這個問題進行分析,我希望給大家提供一個分析問題的辦法。
     對於[JavaScript指令碼中的alert的問題]我通過推想的辦法來進行分析,首先我假設在alert會給造成壓力,那麼我就該對alert在不同的場合結合會造成壓力的理由進行結果推測,比如說有說法由於alert可能使伺服器和IE的通訊一直被保持,直到alert被關閉。那麼對於這種理由的推測想象就是監視伺服器端的串連,其串連會一直保持著。如果結果不是如此,則說明原先的假設不成立。
    [JavaScript指令碼中的alert的問題]的幾個有爭議的地方有:
    1:html是否在完全被傳送到客戶段之後才顯示?
    2:JavaScript是否在html完全顯示後執行?
    3:如果JavaScript在html沒有被完全顯示就可以執行,那麼此時的alert會不會是瀏覽器本身與伺服器端的通訊處於等待狀態?( [JavaScript指令碼中的alert的問題]alert狀態下,瀏覽器會處於等待狀態是指瀏覽器自身當前的線程處於等待狀體)
    首先我們先假設html是在完全被傳送到客戶段之後才顯示。那麼我們在開啟網頁的時候也就會有這種現象出現:如果開啟很大的網頁(指資料比較多,圖片很大)時候,剛剛開啟的時候會是一片空白,過了一段時間之後畫面會突然出現。空白的時候是瀏覽器在與伺服器請求資料,由於資料很大,請求的時間就會相應長。那麼在這段時間內由於html資料沒有傳送完成,瀏覽器不會顯示html的資訊,所以會一片空白。
    對此我做了一個測試試樣:

private void Page_Load(object sender, System.EventArgs e)
{
    for(int i=0;i<50;i++)
    {
        this.Page.Response.Write("<table> <tr><td>");
            using (FileStream fs = File.OpenRead(@"D:\Inetpub\wwwroot\Test\123.bmp")) 
            {
                byte[] b = new byte[1024];                
                while (fs.Read(b,0,b.Length) > 0) 
                {
                    this.Page.Response.Write(b);
                }
            }
        this.Page.Response.Write("</table> </tr></td>");
    }
}

我通過直接將一大檔案往網頁內寫。檔案是一張比較大的圖片:有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自下向上服務,對於上層調用不去過多的理會下層的操作狀態。
    好了這個問題也就解釋清楚了,希望能夠對大夥有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.