多个用户控件和JavaScript

6 javascript asp.net

我在用户控件中包含一个JS文件.主机页面具有用户控件的多个实例.

JS文件有一个全局变量,用作JS函数的标志.我需要将此变量的范围限制为用户控件.不幸的是,当我有多个控件实例时,会覆盖变量值.

在这样的情况下,推荐的方法是什么?

Jos*_*rke 5

一些选项是基于用户控件的ClientId动态生成javascript.例如,您可以动态生成全局变量.

另一个选项,我建议将一个全局变量和函数封装在一个对象中,然后你的用户控件可以发出JS来创建该对象的一个​​实例(可以动态命名,从而让你根据自己的需要调整对象的范围).

编辑

我没有可以共享的工作代码示例,但是我已经以不同的方式完成了这个.最简单的方法是在用户控件的标记中执行此操作.

<script language='javascript'>
   var <%=this.ClientID%>myObject=new myObject();
</script>
Run Code Online (Sandbox Code Playgroud)

假设你的控件有一个myControl的clientId,这将创建一个变量myControlmyObject.

另一种方式做,这将是产生在后面的代码,你可以用它注册脚本:Page.ClientScript.RegisterStartupScript().


Rya*_*pat 2

我建议重构您的代码,以便将所有常见 JS 逻辑存储在一个位置,而不是存储在每个 UserControl 中。这将大大减少页面的大小。

您可以将 UserControl 的 id 传递给常见的 JS 方法来区分 UserControl。

对于限制“UserControl”变量范围的问题,您可以存储某种键/值结构来保留 UserControl 特定的值 - 键将是 UserControl clientID,值将是您设置的变量。有兴趣.

例如:

var UCFlags = new Object();
//set the flag for UserControl1:
UCFlags["UC1"] = true;
//set the flag for UserControl2:
UCFlags["UC2"] = false;
Run Code Online (Sandbox Code Playgroud)

要访问它们,只需将 UserControl 的 ClientID 传递到 UCFlags 数组即可:

myFlag = UCFlags["UC1"];
Run Code Online (Sandbox Code Playgroud)

在服务器端,您可以将常量字符串“UC1”或“UC2”替换为

<%= this.ClientID %>
Run Code Online (Sandbox Code Playgroud)

像这样:

myFlag = UCFlags["<%= this.ClientID %>"];
Run Code Online (Sandbox Code Playgroud)

即使大部分 JS 位于单独的文件中,您仍然可以在此处使用 <%= this.ClientID %> 语法;只需设置

UCFlags["<%= this.ClientID %>"] = value;
Run Code Online (Sandbox Code Playgroud)

在调用嵌入 JS 文件之前。