3

我遇到了一些问题,我做了一些挖掘,但努力想出一个确凿的答案/修复。

基本上,我有一些 javascript(由第 3 方创建)对页面元素做了一些非常棒的东西,使它们看起来很漂亮。该代码在单页(即没有母版)上效果很好,但是,当我尝试将效果应用于母版中的内容页面时,它不起作用。

简而言之,我有一个包含主要脚本参考的母版页。所有页面都将使用该脚本,但传递给它的参数对于内容页面会有所不同。

母版页脚本参考

<script src="scripts.js" language="javascript" type="text/javascript" />

单页

<script>
    MakePretty("elementID");
</script>

如您所见,我需要每个页面中的引用(因此它在主页面中),但我想要“MakePretty”的实际元素将根据内容而改变。

内容页面

现在,由于内容页面没有<head>元素,我一直在使用以下代码将其添加到母版页<head>元素:

HtmlGenericControl ctl = new HtmlGenericControl("script");
ctl.Attributes.Add("language", "javascript");
ctl.InnerHtml = @"MakePretty(""elementID"")";
Master.Page.Header.Controls.Add(ctl);

现在,这行不通。但是,如果我用简单的东西替换alert("HI!"),一切正常。所以代码被添加好了,它似乎并不总是根据它在做什么来执行..

现在,经过一些挖掘,我了解到内容页面的Load事件是在母版页之前引发的,这可能会产生影响,但是,我认为页面上的 javascript 是一次全部加载/运行的?

如果这是一个愚蠢的问题,请原谅我,但我对使用 javascript 还是比较陌生,尤其是在母版页场景中。

如何让内容页面调用母版页中引用的 javascript 代码?

感谢您对这些人的任何/所有帮助,您将真正帮助我解决这个工作问题。

笔记:

  • RegisterStartupScript之类的东西似乎在任何层面都不起作用..
  • 即使在 MasterPage 环境中,控件 ID 的设置也很好,并且按预期呈现。

抱歉,如果其中任何一个不清楚,我真的很累,所以如果需要的话,如果需要重新措辞/澄清,请发表评论。

4

5 回答 5

5

将 ContentPlaceHolder 放在母版页的 head 部分,然后在引用占位符的内容页上添加 asp:Content 控件,并将脚本放在该控件中。您可以通过这种方式为每个页面自定义它。

此外,ID 引用可能不起作用,因为当您使用母版页时,页面上的控件 ID 是根据容器结构自动创建的。因此,它可能不是预期的“elementID”,而是输出“ctl00_MainContentPlaceHolder_elementID”查看您的源代码或使用萤火虫检查您的表单元素以查看输出的 ID 是什么。

于 2008-10-06T21:10:34.470 回答
2

难道不能用干净的javascript做吗?-)

-- 只需在 body-tag 中添加与此类似的内容:

<script type="text/javascript">
  window.onload = function(){
    MakePretty("elementID");
  }
</script>

顺便说一句,脚本标签必须有一个结束标签:

<script type="text/javascript" src="myScript.js"></script>
于 2008-10-06T21:09:55.300 回答
1

为什么不使用 jQuery 来查找所有控件?像这样的东西:

$(document).ready(function(){
  $("input[type='text'], input[type='radio'], input[type='checkbox'], select, textarea").each(function(){
    MakePretty(this);
  });
});

这样您将获得页面上的所有元素,您可以等到页面准备好(这样您就不会非法修改 DOM)。如果需要,jQuery 选择器可以获取更多特定格式的元素(即,添加根元素,如主体 div 的 ID)。

最好也修改 MakePretty 方法,使其将元素而不是 ID 作为参数,以减少处理开销。

于 2008-10-06T22:02:28.000 回答
0

一旦您使用母版页,客户端上的控件 ID 就不是您认为的那样。生成脚本时应使用 Control.ClientID。

于 2008-10-06T21:12:26.230 回答
0

使用母版页时,您需要注意 html 属性 ID,因为 .NET 会修改此值,因为它需要保持 id 的唯一性。

我会假设您的 javascript 正在通过 ID 应用 css 样式,并且当您使用母版页时,ID 与您的 aspx 中的不同。如果您验证始终添加您的 javascript,则您的答案需要考虑以下几点:

  • 始终在页面加载中设置您的母版页 ID (this.ID = "myPrefix";)
  • 母版页中的任何 HTML 元素都将以母版页 ID 为前缀(即:在呈现的页面上将是“myPrefix_myDiv”)
  • 您的内容占位符 ID 中的任何 HTML 元素都将以附加前缀作为前缀(即 myPrefix_ContentPlaceHolderId1_myDiv)

如果我能澄清任何事情,请告诉我。希望这可以帮助!

于 2008-10-06T22:26:40.323 回答