同一个ASP.NET用户控件的多个实例Javascript名称冲突

3
问题:我有一个带有大量JavaScript代码的用户控件(.ascx),在同一页上我有两个用户控件的实例。当该代码运行时,这两个用户控件的行为表现不稳定,因为所有具有相同名称的js对象只能有一个值(包括函数)。JavaScript位于代码后面,并通过"ScriptManager.RegisterStartupScript(.....)"注册。

我已经进行了彻底的搜索,虽然有一些建议的主题,但我没有找到任何有效解决方案,除了逐个查看整个用户控件并将ID附加到引发冲突问题的函数名称。(这需要仔细检查所有代码并确定是否有问题)

示例:

Dim asdf As String = ""
asdf &= "function foo" & UNIQUE_ID & "() {" & vbCrLf
asdf &= .....u get the idea......
asdf &= "}"

有没有比这更优雅的解决方案?因为这个原因,将JavaScript放在用户控件中是否只是不良做法?
1个回答

1
也许尝试将单个控件的所有JS代码放在一个命名空间中?这样,生成的代码可能如下所示:

var controlNamespace = {
   ...here goes the code that you have now for a control
};

您可以通过添加“controlNamespace.”前缀来调用函数。 然后,您需要注意每个控件的脚本都包含在不同的命名空间中。这应该很容易,假设您像粘贴的示例一样在服务器端动态创建所有JS代码。 这样,每个控件都将其对应的代码封装在单独的命名空间中,无论您在页面上创建多少此类控件,它们都不会相互干扰。

我想补充一点,即原帖作者应该好好阅读一下https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures。 - Adrian Wragg
这个解决方案的挑战在于,由于有许多ScriptManager.RegisterStartupScript调用,我需要动态添加命名空间。或者可能只是为每个调用使用不同的命名空间,但这意味着我必须更新不在同一命名空间中的每个函数引用。我的计划现在是重构用户控件,以便我只需要实例化它一次。 - Jacob Moisan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接