【问题标题】:How do I put javascript programmatically into <head> block?如何以编程方式将 javascript 放入 <head> 块?
【发布时间】:2013-11-19 22:55:05
【问题描述】:

我需要在页面的

块中绝对放置一些 javascript -- 它必须在页面的其余部分之前执行,因为脚本的可能结果是重定向到不同的页面。

但是,当我对使用 jQuery 的代码使用 RegisterClientScriptInclude(在其中放置一些 jQuery)和 RegisterClientScriptBlock 时,它会将其放在

块的顶部附近,并且不会执行。我看不到以编程方式将此 javascript 放入 块的方法——它必须以编程方式进行,因为有时我不希望它在那里,有时我会。

我试过可以直接引用Content1,

块对应的asp:Content元素的ID,但是不行。

以防万一有人认为 RegisterStartupScript 可能有效:它没有。它在

块中的位置比其他所有内容都低。很奇怪。

想要一些代码?这里:

Type csType = this.GetType();
ClientScriptManager clientScript = Page.ClientScript;

if (!clientScript.IsClientScriptIncludeRegistered(jqueryScriptName))
{
    clientScript.RegisterClientScriptInclude(jqueryScriptName, "~/Scripts/jquery-1.7.1.min.js");
}

if (!clientScript.IsClientScriptBlockRegistered(citrixDetectorScriptName))
{
    clientScript.RegisterClientScriptBlock(csType, citrixDetectorScriptName, citrixDetectorScriptText, true);
}

根据大众需求,我如何检测 ActiveX 组件。这是 JScript。

try {
    var icaObj = new ActiveXObject("Citrix.ICAClient");

    var CitrixVersion = icaObj.ClientVersion.split(".");
    var MajorMinorVersion = CitrixVersion[0] + "." + CitrixVersion[1];
    if (MajorMinorVersion == "11.0") {
        // Citrix is OK
    }
    else {
        window.navigate("WrongCitrix.aspx?Citrix=" + MajorMinorVersion);
    }
}
catch (e) {

    window.navigate("NoCitrix.aspx");
}

如果 ActiveX 组件不存在,则重定向是一个告诉用户他们需要安装它的页面。如果 ActiveX 组件是 11.0 以外的任何其他版本,则重定向到一个页面,该页面解释了这一点以及如何处理这种情况(例如 backrevving)。

在页面加载检查期间进行事先检查,以确保它们具有 Internet Explorer v4 到 v9,因为任何其他版本都无法与该产品一起使用(如果 IE10+ 甚至尝试加载 ActiveX 组件的 v11.0,它也会崩溃) .

【问题讨论】:

  • 为什么要等到页面渲染完毕再使用JavaScript重定向?保存自己的回复并在后端使用Server.Transfer
  • 如果用户禁用了脚本???没有意义
  • 我不想等待页面呈现,@codemonkeh,这就是问题所在!进入头部的 javascript 尝试检测客户端工作站上是否存在某个 ActiveX 组件。如果没有,用户将被重定向(通过 window.navigate)到另一个页面,该页面解释了问题并提供了有关如何安装 ActiveX 组件的信息。如果 javascript 不在 head 块中,即使在页面呈现后它也不会执行。
  • @charlietfl,如果用户禁用了脚本,那么他们将无法使用该页面作为门户的产品。就是这么简单。这是一个公司内部网,而不是公共网络。我们的方式或高速公路。抱歉,如果这对您没有意义,但没必要。
  • @Cyber​​herbalist 我的观点是,通过等待在回发中修改 JavaScript,您无论如何都会呈现页面(即使只是标题)。但我确实明白你的意思。

标签: javascript asp.net registerclientscriptblock


【解决方案1】:

如果我理解您的问题,您可以在页面内任意位置插入 PlaceHolder 控件。

<%@ Page Language="C#" AutoEventWireup="True" 
   CodeBehind="Default.aspx.cs" Inherits="WebApplicationTelerik.Default" %>
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <script type="text/javascript" 
    src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <asp:PlaceHolder runat="server" ID="PlaceHolder1"></asp:PlaceHolder>
</head>
<body>
    <form id="form1" runat="server">
    </form>
</body>
</html>

protected void Page_Load(object sender, EventArgs e)
{
    PlaceHolder1.Controls.Add(new LiteralControl(
       "<script type=\"text/javascript\"> alert('here'); </script>"));
}

【讨论】:

  • 这非常有效。谢谢,我不知道 PlaceHolder 控件可以用于此!
【解决方案2】:
document.GetElementsByTagName("head")[0].appendChild( newScriptNode );

或 jQuery

$("head")[0].append( newScriptNode );

【讨论】:

  • 这些很整洁,但我遇到了和以前一样的问题,因为我在设计时不知道是否可以添加脚本——并在运行时有条件地添加脚本使用RegisterClientScriptBlock 方法将脚本放在正文中,而不是页面的头部。
【解决方案3】:

如果您确实必须将 JavaScript 插入到 head 标记中,您可以将其设为 ASP.NET 控件并将控件插入到它的子集合中。

例如在 ASPX 文件中:

<head runat="server" id="header">...</head>

在后面的代码中:

header.Controls.Add(new Literal("<script type='text/javascript'>...</script>"));

虽然我确实认为您需要考虑您的流程,但在呈现页面之前在后端重定向用户会更有效。

哦,RegisterStartupScript 正确地将 JavaScript 放置在 html 之后以提高加载性能。

【讨论】:

  • 在呈现页面之前,我不知道他们是否安装了 ActiveX 组件。直到我在上面显示的 javascript sn-p 实际在客户端上运行,我才知道这一点。除非您知道 IIS 在向客户端发送任何数据之前有一种方法可以读心客户端?
猜你喜欢
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多