2014-01-29 22 views
0

我想了解一旦出現母版頁,部分和一些javascript代碼時發生的事情的順序。Master,Partials渲染和Javascript調用

比方說,我有一個腳本母版頁:

<%@ Master Language="C#" ... %> 

<head> 
    <asp:ContentPlaceHolder ID="HeadContent" runat="server" /> 
    // header stuff 
</head> 

<body> 
// Html stuff here 

</body> 

<script type="text/javascript"> 
    function foo() { 
}; 
</script> 

現在我有一個頁面,Index.aspx的,從這個母版頁繼承並有這它:

<script type="text/javascipt"> 
    foo(); 
</script> 

會發生什麼情況是我的Chrome控制檯中出現"foo() is not defined"錯誤消息,而如果從母版頁獲取腳本塊並將其移至其標題,則一切正常。

所以我的問題是 -

  1. 什麼是事物的秩序,什麼第一會怎麼樣? Index.aspx是否在Master頁面完全加載前出現,因此Index.aspx頁面還不知道Master頁面底部定義了什麼? (如果它在頂部,這很好?) 我相信這個答案是肯定的。

  2. 更令人費解的問題 - 如果母版頁的渲染還沒有完全在服務器端完成,那麼Index.aspx頁面上的javascript如何調用? 要等同地表達 - 如果我有一個呈現B呈現C呈現(等等)的A頁面,是第一個將要調用的JavaScript是C頁面上的那個(或最後一個被調用的)?

回答

1

這有些不同。首先,所有東西,即頁面本身和它使用的所有母版頁都會呈現在服務器上,以產生HTML標記。然後這個標記被髮送到客戶端,由瀏覽器顯示。在客戶端也執行所有的JavaScript。因此,javascript執行過程中定義的文件(頁面A,頁面B,頁面C,主頁面)並不重要。然而,重要的是JavaScript塊出現在最終頁面的順序。

考慮一下這個例子。母版頁:

<%@ Master Language="C#" ... %> 

<head> 
    <asp:ContentPlaceHolder ID="HeadContent" runat="server" /> 
    // header stuff 
</head> 

<body> 
    // Html stuff here 
    <asp:ContentPlaceHolder ID="BodyContent" runat="server" /> 
</body> 

<script type="text/javascript"> 
    function foo() { 
    }; 
</script> 

現在孩子頁面:

<%@ Page Master="... %> 

<asp:Content ContentPlaceHolderID="BodyContent" runat="server"> 
    <script type="text/javascipt"> 
     foo(); 
    </script> 
</asp:Content> 

在這個佈局中的最後一頁,你將有javascript的塊的順序如下:

<script type="text/javascipt"> 
    foo(); 
</script> 
... 
<script type="text/javascript"> 
    function foo() { 
    }; 
</script> 

所以對foo的調用在定義之前發生,這會導致出現錯誤。這是我相信你的情況發生的事情。

但是,如果你在主移動JS塊頭部,在生成的HTML塊得到扭轉:

<script type="text/javascript"> 
    function foo() { 
    }; 
</script> 
... 
<script type="text/javascipt"> 
    foo(); 
</script> 

foo首先被定義,並稱爲後,這是罰款。

希望澄清這個過程。

+0

是感謝你的澄清。 –

0

函數在被調用之前必須出現。所以:

<script type="text/javascript"> 
    function foo() { 
    }; 
</script> 

必須出現在

<script type="text/javascript"> 
    foo(); 
</script> 

此外,FOO()將永遠不會運行,因爲你必須在腳本類型的拼寫錯誤,遺漏JavaScript中的 'R'。

如果你有你的母版中定義的函數,並希望從繼承頁面調用它們,你可以添加腳本佔位符像這樣:

<%@ Master Language="C#" ... %> 
<html> 
    <head> 
     <asp:ContentPlaceHolder ID="HeadContent" runat="server" /> 
    </head> 
    <body> 
     <asp:ContentPlaceHolder ID="BodyContent" runat="server" /> 
     <script type="text/javascript"> 
      function foo() { 
      }; 
     </script> 
     <asp:ContentPlaceHolder ID="ScriptContent" runat="server" /> 
    </body> 
</html>