2

我创建了一个派生自 LinkBut​​ton 的 asp.net 服务器控件,并向页面呈现一个小的 javascript 函数。

我想在页面上多次使用此控件,但只想在页面上呈现一次 javascript。另一方面,我宁愿不手动将其添加到 js 文件中,因为我不希望将来有机会忘记添加 js 文件。

这样做的最佳方法是什么?

4

3 回答 3

9

防止客户端脚本中的重复

使用注册方法,例如Page.ClientScript.RegisterClientScriptBlock(..)。有几个重载,但它们都以类似的方式工作。无论发出多少个控制实例,它只渲染一次脚本就足够聪明了。

微软在 MSDN 文档中的注释

客户端脚本由其密钥和类型唯一标识。具有相同键和类型的脚本被认为是重复的。页面中只能注册一个具有给定类型和密钥对的脚本。尝试注册已注册的脚本不会创建该脚本的副本。

MSDN 文档还包含示例代码,例如:

// Check to see if the client script is already registered.
if (!cs.IsClientScriptBlockRegistered(cstype, csname2))
{
  StringBuilder cstext2 = new StringBuilder();
  cstext2.Append("<script type=text/javascript> function DoClick() {");
  cstext2.Append("Form1.Message.value='Text from client script.'} </");
  cstext2.Append("script>");
  cs.RegisterClientScriptBlock(cstype, csname2, cstext2.ToString(), false);
}

其他类似的注册方式

可以使用不同的方法以不同的方式注册您的客户端脚本 - 有关每个方法的更多详细信息,请参阅MSDN中的每个ClientScriptManager.RegisterClientScript*(..)方法。它们都是为了防止渲染页面中的重复而构建的。

这使您可以自由地在控制级别输出脚本,而无需担心或不必跟踪或计算脚本。

编辑:

ClientScriptManager 实例通过Page.ClientScript属性访问。

于 2010-01-26T07:49:07.547 回答
0

有什么方法可以引用 CDN 上的脚本并且不会重复多次?或者我可以不用担心它,因为它只是一个指针而且浏览器(?)足够聪明,不会两次加载同一个库?

换句话说,假设我想从服务器控件插入以下代码:

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>

如果我使用 RegisterClientScriptBlock,我可以使用 IsClientScriptBlockRegistered 方法来避免服务器控件多次加载它。但是,前面的代码很可能已经被另一个(不同的)服务器控件或想要将 jQuery 用于服务器控件之外的东西的开发人员放在页面上。

如果开发人员已经加载了脚本,如何让服务器控件不加载脚本?

于 2011-03-25T23:50:04.413 回答
0

您可以使用Page.RegisterClientScriptBlock方法。

这是来自 MSDN 的示例:

if (!this.IsClientScriptBlockRegistered("clientScript"))
{
  // Form the script that is to be registered at client side.
  String scriptString = "<script language=\"JavaScript\"> function DoClick() {";
  scriptString += "myForm.show.value='Welcome to Microsoft .NET'}<";
  scriptString += "/";
  scriptString += "script>";
  this.RegisterClientScriptBlock("clientScript", scriptString);
}

高温高压

于 2010-01-26T07:53:36.507 回答