2

根据我所在的页面,我希望更改 javascript 函数的内容。

例子 :

母版页

<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>

结果是一样的。我只发现第二个输出更干净。

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 组合到页面上的一个脚本块中。

编辑:我也不知道这是否适用于 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>

在您的页面中 A 不要放置脚本标签

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

理想情况下,您需要累积这些部分脚本并将它们呈现为页面末尾的一个块

不是 100% 确定如何在 MVC 中执行此操作,但这是一个简单的 ASP.NET 示例,您应该能够将其插入 MVC

于 2010-02-12T19:18:30.997 回答