0

我正在尝试利用 yahoo 卓越的性能规则:避免重复脚本

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

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

4

4 回答 4

2

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

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

如果页面只是在标记中静态地包含常规的 ole 脚本元素,并且您需要检测是否在客户端加载了脚本,则您必须获取页面上的所有脚本元素并查看它们的 .src 值。问题是某些浏览器会自动将该 url 解析为完整路径,而不仅仅是您声明的路径。因此,您可以通过各种方式来解释这一点——您可以只搜索作为您想要的脚本的字符串的结尾,或者您可以通过将其设置为动态创建的来解析要与之比较的 url script 元素(您永远不会添加到 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
}
于 2009-07-21T06:21:30.790 回答
1

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

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

或从您的用户控件:

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

这将使用密钥“some-script”,并且只在页面上注册一份脚本副本。

*要清楚,我认为混淆是由于这些之间的差异引起的:

  • ClientScriptManager如果是用于管理客户端脚本的服务器端帮助器类(换句话说,它的全部目的是完全按照您的要求做)。它通过 Page 的ClientScript属性访问。
  • ScriptManager是一个控件,用于帮助 ASP.NET AJAX 中的客户端 Ajax 脚本编写

(见鬼,我什至把自己弄糊涂了,最初给出了错误的示例代码)

于 2009-07-21T06:32:03.733 回答
0

好吧,这实际上不适用于具有多个 Web 用户控件的主细节场景。

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

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

于 2009-09-17T13:07:55.977 回答
-1

是的,您必须解析整个响应...

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

于 2009-07-21T06:25:35.133 回答