2

私がどのページにいるかに応じて、javascript関数の内容を変更したいと思います。

例 :

MasterPage

<script type="text/javascript">
    Cufon.now();
    Cufon.replace('p#characters', { fontFamily: 'Helvetica95-Black' });
</script>

ページA

<script type="text/javascript">
    Cufon.now();
    Cufon.replace('p#characters', { fontFamily: 'Helvetica95-Black' });
    Cufon.replace('p#others', { fontFamily: 'Helvetica95-Black' });
</script>

コードを繰り返したくないので、解決策を探しています。私は多分私はこのようなContentPlaceHolderのようなものを使うことができると思いました(しかしそれは機能しません):

<script type="text/javascript">
    Cufon.now();
    Cufon.replace('p#characters', { fontFamily: 'Helvetica95-Black' });

    <asp:ContentPlaceHolder id="cphJS" runat="server" />
</script>

この種の問題を解決する方法はありますか?

アップデート

私が避けたいのは、そのようなコードを持つことです:

// Add by MasterPage
<script type="text/javascript">
    Cufon.now();
    Cufon.replace('p#characters', { fontFamily: 'Helvetica95-Black' });
</script>

// Add by Page A
<script type="text/javascript">
    Cufon.now();
    Cufon.replace('p#others', { fontFamily: 'Helvetica95-Black' });
</script>

// Add by Page B
<script type="text/javascript">
    Cufon.now();
    Cufon.replace('p#main', { fontFamily: 'Helvetica95-Black' });
    Cufon.replace('p#menu', { fontFamily: 'Helvetica95-Black' });
</script>

その種のコードは機能しますが、それを行うためのクリーンな方法ではないためです。私はそのようなものが欲しいです:

<script type="text/javascript">
    Cufon.now();        
    Cufon.replace('p#characters', { fontFamily: 'Helvetica95-Black' });
    Cufon.replace('p#others', { fontFamily: 'Helvetica95-Black' });
    Cufon.replace('p#main', { fontFamily: 'Helvetica95-Black' });
    Cufon.replace('p#menu', { fontFamily: 'Helvetica95-Black' });
</script>

結果は同じです。2番目の出力がよりクリーンであることがわかりました。

4

5 に答える 5

5

スクリプトタグの外側のコンテンツプレースホルダーにコードを追加するだけではどうでしょうか。

したがって、次のようになります。

<head>
   <script type="text/javascript">
      // do some stuff
   </script>
   <asp:ContentPlaceHolder runat="server" id="someid" />
</head>
...

または、ページの早い段階で関数を配列に収集し、後で次のように実行することもできます。

<head>内:

var callbacks = [];
function addCallback(arg) {
   callbacks.push(arg);
}

他の場所:

addCallback(function() {
   ...
});

そして、ページの下部、</ body>の直前:

for (var i = 0; i < callbacks.length; i++) {
   var c = callbacks[i];
   if (c && c instanceof Function)
      c();
}

要件について詳しく教えてください。例:上記のコードが実行することになっていること、一度に実行する必要があるか、作成されるローカル変数に依存するか、特定の時間に実行する必要があるかなど。

編集:新しいMVCプロジェクトでコンテンツプレースホルダーを使用することは、私にとってはうまく機能しているように見えました。Intellisenseはそれを取得しませんでしたが、正しくレンダリングされました。コードは次のようになります。

マスターページ:

...
<script type="text/javascript">
    var inTheMasterPage;
    <asp:ContentPlaceHolder runat="server" id="js1">
    </asp:ContentPlaceHolder>
</script>

..。

ページ内:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content runat="server" ContentPlaceHolderID="js1">
    var inThePage;
</asp:Content>
...

そしてレンダリングされたHTML:

    <script type="text/javascript"> 
        var inTheMasterPage;

    var inThePage;

    </script> 
</head> 
于 2010-02-09T01:15:20.820 に答える
2

RegisterClientScriptBlockを使用できます。基本的に、これにより、サーバー側での制御を強化しながら、スクリプトタグとコードを作成できます。そうは言っても、マスターページと通信する必要があります。StringBuilderをマスターページのパブリックプロパティとして公開できます。

StringBuilder javascriptCode = new StringBuilder();
javascriptCode.Append("Cufon.now();" + System.Environment.NewLine);
javascriptCode.Append("Cufon.replace('p#characters', { fontFamily: 'Helvetica95-Black' });" + System.Environment.NewLine);
public StringBuilder JSCode
{
    get { return javascriptCode; }
}

コンテンツページで、MasterTypeディレクティブを追加して、Masterオブジェクトにアクセスします。

<%@ MasterType VirtualPath="~/virtualPath/nameOfMasterPage.page" %>

また、コンテンツページで、JavaScriptコードを追加して、RegisterClientScriptBlockを呼び出すことができます。

Master.JSCode.Append("Cufon.replace('p#others', { fontFamily: 'Helvetica95-Black' });" + System.Environment.NewLine);
ClientScriptManager clientScript = Page.ClientScript;
clientScript.RegisterClientScriptBlock(this.Page.GetType(), "MadeUpNameForJSScript", Master.JSCode.ToString(), true);

このコードはまだテストしていないので、問題があれば教えてください。少し不便な方法かもしれませんが、すべてのJavaScriptをページ上の1つのスクリプトブロックに結合する必要があります。

編集:これがMVCで機能するかどうかもわかりません

于 2010-02-13T08:43:00.997 に答える
2

ContentPlaceHolderは、単に置き忘れただけでなく、オーバーライドすることもできます。

マスターページ

<asp:contentplaceholder id="scripts" runat="server" >
   <script type="text/javascript">
       Cufon.now();
       Cufon.replace('p#characters', { fontFamily: 'Helvetica95-Black' });
   </script>
</asp:contentplaceholder>

ページA

<asp:Content ID="scriptContent" ContentPlaceHolderID="scripts" runat="server">
   <script type="text/javascript">
       Cufon.now();
       Cufon.replace('p#characters', { fontFamily: 'Helvetica95-Black' });
       Cufon.replace('p#others', { fontFamily: 'Helvetica95-Black' });
   </script>
</asp:contentplaceholder>

ページのコンテンツはマスターページのコンテンツを上書きします

スクリプトを追加する場合は、コンテンツプレースホルダーをマスターページに保持します

<script type="text/javascript">
    Cufon.now();
    Cufon.replace('p#characters', { fontFamily: 'Helvetica95-Black' });

    <asp:ContentPlaceHolder id="cphJS" runat="server" />
</script>

あなたのページにスクリプトタグを入れないでください

<asp:Content ID="scriptContent" ContentPlaceHolderID="cphJS" runat="server">
        Cufon.replace('p#others', { fontFamily: 'Helvetica95-Black' });
</asp:contentplaceholder>
于 2010-02-17T15:10:02.703 に答える
1

理想的には、これらの部分的なスクリプトを蓄積し、ページの最後に1つのブロックとしてレンダリングする必要があります

MVCでこれを行う方法は100%わかりませんが、MVCにホーンを入れることができるはずのプレーンなASP.NETの例を次に示します。

于 2010-02-12T19:18:30.997 に答える
1

セレクターの利点の1つは、オブジェクトがページ上に存在する必要がないことです。1回のヒットで複数のセレクターをCufonに提供することもできます...

したがって、これをマスターページに配置すると、正常に機能するはずです...

<script type="text/javascript">
    Cufon.now();        
    Cufon('p#characters, p#others, p#main, p#menu', { fontFamily: 'Helvetica95-Black' });
</script>
于 2010-02-16T15:11:55.160 に答える