从页面中删除重复的脚本

时间:2009-07-21 05:41:54

标签: asp.net javascript code-behind

我正在尝试使用雅虎卓越的性能规则:avoiding duplicate script

为此,我希望能够知道在将页面注入页面之前是否已将脚本添加到页面中。看起来我无法弄清楚asp.net代码中添加了什么,除非我有一个脚本管理器添加到页面。但我想避免使用asp.net AJAX。从规则的描述来看,它看起来像是在php中可能的东西。

假设我无法对我的代码进行检查,我正在考虑使用jQuery $ .getString函数,但在获取脚本之前不会检查。如果我要选择javascript文件,我是否必须解析整个http响应才能找出页面上加载的脚本?

4 个答案:

答案 0 :(得分:2)

如果页面使用ASP.NET Page.ClientScript Register API注册脚本,则可以使用Page.ClientScript.IsClientScriptIncludeRegistered。另一方面,如果您使用这些API,则实际上不需要调用它,因为它已经确保只注册了其中一个。

http://msdn.microsoft.com/en/us/library/system.web.ui.clientscriptmanager.isclientscriptincluderegistered.aspx

如果页面在标记中只有静态的常规ole脚本元素,并且您需要检测是否在客户端加载了脚本,则必须获取页面上的所有脚本元素并查看其.src值。这样做的是,某些浏览器会自动将该URL解析为完整路径,而不仅仅是您声明的路径。因此,您可以通过各种方式对此进行说明 - 您可以只搜索字符串的结尾作为您想要的脚本,或者您可以将要比较的网址也通过将其设置为动态创建来解析脚本元素(您从未添加到DOM但仍然为您解决)。

这只是我的头脑,对不起,如果我出错了:

var s = document.createElement("script");
s.src = "foo.js";

var loaded, scripts = document.getElementsByTagName("script");
for (var i = 0; i < scripts.length; i++) {
    if (scripts[i].src === s.src) {
        loaded = true;
        break;
    }
}
if (loaded) {
   // this script is already loaded
   // assuming you dont have multiple copies in different locations
}

答案 1 :(得分:1)

您不需要使用任何客户端脚本来执行此操作...您可以使用ClientScriptManager在您的代码中执行此操作,而无需使用ASP.NET AJAX(我认为您很困惑{在控件/页面中使用ClientScriptManager *){3}}只需使用:

ClientScript.RegisterClientScriptInclude("some-script", "myScript.js");

或来自您的用户控件:

Page.ClientScript.RegisterClientScriptInclude("some-script", "myScript.js");

这将使用键“some-script”&amp;只在页面上注册一个脚本副本。

*要明确我认为混淆是由于它们之间的区别而引起的:

  • ScriptManager如果服务器端帮助程序类用于管理客户端脚本(换句话说,它的全部目的是完成您要执行的操作)。可以通过Page的ClientScriptManager属性访问它。
  • ClientScript是用于帮助ASP.NET AJAX中的客户端Ajax脚本的 Control

(我甚至混淆了自己并且最初给出了错误的示例代码)

答案 2 :(得分:0)

在具有多个Web用户控件的主详细信息场景中实际上不起作用。

如果Web用户控件是动态的,那么您无法控制谁必须执行脚本初始化。

链接更容易一次,但开发人员必须在ClientManager和使用脚本加载之间权衡他的选项。

答案 3 :(得分:-1)

是的,你必须解析整个回复...

为什么不创建一个javascript文件并将所有的javascript放在那里然后在你的代码中导入该javascript文件???通过这种方式,您可以摆脱重复的脚本插入。