1. 程式人生 > >深入淺出JavaScript (五) 詳解Document.write()方法

深入淺出JavaScript (五) 詳解Document.write()方法

        一直用document.write()方法向瀏覽器中顯示資料用,把它當做Alert()使用, 看來這樣用有些大材小用了,下面說說它的主要用處。

        document.write()方法可以用在兩個方面:

         1.頁面載入過程中,用指令碼加入新的頁面內容。

         2.用延時指令碼建立本視窗或新視窗的內容。

         該方法需要一個字串引數,它是寫到視窗或框架中的HTML內容。這些字串引數可以是變數或值為字串的表示式,寫入的內容常常包括HTML標記語言。如下面程式碼,教務系統框架載入子頁

                    <!--將框架放入單元格中-->
                    <td class="index-table-middle-center" valign="top" id="content-container">
                        <div id="loading">
                            //載入效果圖示
                            <img src="images/loading.gif" alt="loading" border="0" />
                        </div>
                        <script type="text/javascript">
                            //呼叫JS的OutputIFrame函式,形成框架
                            Index.OutputIframe();
                        </script>
                    </td>


         JS程式碼

//輸出框架
Index.OutputIframe = function () {
    var scrolling = $.isIE6 == true ? 'yes' : 'auto';
    document.write('<iframe id="content" width="100%" height="100%" class="hide" marginwidth="0" marginheight="0" frameborder="0" scrolling="' + scrolling + '" onload="$(\'#loading\').hide();$(this).show();" src=""></iframe>');
};


  在載入頁面後,瀏覽器輸出流自動關閉。在此之後,任何一個對當前頁面進行操作的document.write()方法將開啟—個新的輸出流,它將清除當前頁面內容(包括源文件的任何變數或值)。因此,假如希望用指令碼生成的HTML替換當前頁面,就必須把HTML內容連線起來賦給一個變數,使用一個document.write()方法完成寫操作。


  關於document.write()方法還有一點要說明的是它的相關方法document.close()。指令碼向視窗(不管是本視窗或其他視窗)寫完內容後,必須關閉輸出流。在延時指令碼的最後一個document.write()方法後面,必須確保含有document.close()方法,不這樣做就不能顯示影象和表單。並且,任何後面呼叫的document.write()方法只會把內容追加到頁面後,而不會清除現有內容來寫入新值。

        為了演示document.write()方法,我們提供了同一個應用程式的兩個版本。一個向包含指令碼的文件中寫內容,另—個向—個單獨的視窗寫內容。

  示例1建立一個按鈕,它為文件組合新的HTML內容,包括新文件標題的HTML標記和標記的顏色屬性。

       示例中有一個讀者所不熟悉的操作符+=,它把其右側的字串加到其左側的變數中,這個變數用來存放字串,這個操作符能很方便地把幾個單獨的語句組合成—個長字串。使用組合在newContent變數中的內容document.write()語句可以把所有新內容寫到文件中,完全清除示例1中的內容。

       然後需要呼叫document.close()語句關閉輸出流。當載入該文件並單擊按鈕時,可以注意到瀏覽器標題欄中的文件標題因此而改變。當回到原始文件並再次單擊該按鈕時,可以看到動態寫入的第二個頁面的載入速度甚至比過載原始文件還要快。

        示例1 在當前視窗使用document.write()。

<html xmlns="http://www.w3.org/1999/xhtml"><title>Writing to Same Doc</title>

<script language="JavaScript">
  //重新寫入函式
  function RepeatWrite(){
    // 儲存寫入的內容
    var newContent = "<html><head><title>A New Doc</title></head>"
    newContent += "<body bgcolor='aqua'><h1>This document is brand new.</h1>"
    newContent += "Click the Back button to see original document."
    newContent += "</body></html>"
    // 寫入新的內容
    document.write(newContent);
    document.close();
  }
  
</script>
</head>
<body>
  <form>
  	<!--單擊按鈕呼叫寫入函式-->
    <input type="button" value="Replace Content" onClick="RepeatWrite()">
  </form>
</body>
</html>


          示例2中,情況有點複雜,因為指令碼建立了一個子視窗,整個指令碼生成的文件都將寫入該視窗中。為了使新視窗的引用在兩個函式中保持啟用狀態,我們將newWindow變數宣告為全域性變數。

         頁面載入時,onLoad事件處理呼叫makeNewWindow()函式,該函式生成一個空的子視窗。另外,我們在window.open()方法的第三個引數中加入一個屬性,使子視窗的狀態列可見。

         頁面上的按鈕呼叫subWrite()方法,它執行的第一個任務是檢查子視窗的closed屬性。假如關閉了引用視窗,該屬性(只在較新的瀏覽器版本中存在)返回true。如果是這種情況(假如使用者手動關閉視窗),該函式再次呼叫makeNewWindow()函式來重新開啟那個視窗。

         視窗開啟後,新的內容作為字串變數組合在一起。與示例1一樣,一次性寫入內容(雖然對單獨的視窗沒有必要),接下來呼叫close()方法。但是注意一個重要的區別:write() 和 close()方法都明顯地指定了子視窗。

<html xmlns="http://www.w3.org/1999/xhtml"><title>Writing to Subwindow</title>
<script language="JavaScript">
  //生命一個全域性變數
  var newWindow;
  //開啟一個新的視窗
  function makeNewWindow(){
    newWindow = window.open("","","status,height=200,width=300")
  }
  //判斷新視窗是否關閉,如果關閉重新開啟
  function subWrite(){
    // make new window if someone has closed it
    if(newWindow.closed){
      makeNewWindow()
    }
    // 是新視窗獲得焦點
    newWindow.focus()
    //儲存寫入內容
    var newContent = "<html><head><title>A New Doc</title></head>"
    newContent += "<body bgcolor='coral'><h1>This document is brand new.</h1>"
    newContent += "</body></html>"
    // 將HTML程式碼寫入新視窗中
    newWindow.document.write(newContent)
    newWindow.document.close()    // close layout stream
  }
</script>
</head>

<body onLoad="makeNewWindow()">
  <form>
    <input type="button" value="Write to Subwindow" onClick="subWrite()">
  </form>
</body>
</html>