【问题标题】:Multiple instances of the same ASP.NET user control Javascript name collisions同一个 ASP.NET 用户控件的多个实例 Javascript 名称冲突
【发布时间】:2013-09-19 21:33:48
【问题描述】:

问题:我有一个用户控件 (.ascx),里面有大量的 javascript 代码。我在同一页面上有两个用户控件实例。当代码运行时,两个用户控件的行为异常,因为所有同名的 js 对象只能有一个值(包括函数)。 javascript 在后面的代码中,它是通过“ScriptManager.RegisterStartupScript(.....)”注册的。

我已经进行了彻底的搜索,尽管有一些线程提出了建议,但除了逐字逐句地遍历整个用户控件并将 ID 附加到会引发冲突问题的函数名称之外,我没有发现任何其他方法。 (这需要仔细检查所有代码并确定是否有问题)。

示例:

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

还有比这更优雅的解决方案吗?出于这个原因将 javascript 放在用户控件中只是不好的做法吗?

【问题讨论】:

    标签: javascript asp.net user-controls


    【解决方案1】:

    也许尝试关闭命名空间中单个控件的所有 JS 代码?因此生成的代码可能如下所示:

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

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

    【讨论】:

    • 我要补充一点,OP 应该很好地阅读 developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures
    • 这个解决方案的挑战是我需要动态添加到命名空间,因为有很多 ScriptManager.RegisterStartupScript 调用。或者可能只是为每个调用使用不同的命名空间,但这意味着我必须更新不在同一命名空间中的每个函数引用。我现在的计划是重构用户控件,这样我只需要实例化一次
    猜你喜欢
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多