【问题标题】:Avoid that script in MasterPage and in Iframe child page is executed twice避免在 MasterPage 和 Iframe 子页面中执行该脚本两次
【发布时间】:2011-08-23 08:39:24
【问题描述】:

我使用 jQuery 开发了一个脚本,每次更改 <select> 选择时都会执行一些逻辑。

最初我将该脚本添加到MasterPage,以确保每个页面都会被考虑 - 但是,我有一些不使用MasterPage的外部页面(aspx),因此,没有剧本。

为了解决这个问题,我将相同的脚本添加到自定义控件中,该控件呈现为<select>,并且也出现在这些外部页面中。不幸的是,这样脚本被执行了两次,而不是一次。

我如何更改我的代码以确保脚本将在每个页面中执行,但只执行一次?

【问题讨论】:

    标签: javascript jquery asp.net master-pages


    【解决方案1】:

    用户.net的ClientScriptManager.RegisterClientScriptInclude,它有一个key参数,所以每个key只会注册一次。在您的母版页和用户控件中,只需确保使用相同的密钥注册它们即可。

    你也可以使用jquery查看是否已经注册并添加id:

    function requireOnce(url) {    
        if (!$("script[scr='" + url + "']").length) {
            $('head').append("<script type='text/javascript' src='" + url + "'></script>"); 
        }
    }
    

    以上取自here

    【讨论】:

    • 问题是 MasterPage 来自旧版工具,因此我无法编辑其代码隐藏,只能编辑 MasterPage.master 文件。因此我在母版页中插入: $(document).ready(function() { //这里是脚本 } 在自定义控件中也是如此,脚本键使用相同的 ID。我不使用 ClientScriptManager,因为我不使用 UpdatePanel。但即使使用此解决方案它也不起作用,脚本会执行两次。跨度>
    • 如果我想包含 jQuery 怎么办?
    • 如果 jquery 是有问题的包含文件,您可能需要检查用户控件后面代码中的 以查看它是否已包含。
    • 感谢您的提示。我试着听从你的建议,但我的情况有点棘手,因为我在 MasterPage 的占位符中有 iframe。因此,如果我在一个自定义控件(在一个子页面中)中检查“Page.ClientScript.IsClientScriptIncludeRegistered”,则该脚本仅在 Iframe 中正确插入一次,但无论如何插入,即使 MasterPage 中已经存在。
    • 我在 MasterPage (MP) 和 customControl(ascx 文件)中都插入了上面的代码。在 MP 中,我检查内部 iFrame 的存在并等待加载以检查页面中是否注册了相同的脚本。顺便说一句,条件 "(!$("script[scr='" + url + "']").length" 似乎不匹配,因为脚本仍然插入两次或更多,考虑到它们每次插入一次自定义控件。
    【解决方案2】:

    我不想让asp.net 处理我的JavaScript,所以我创建了一个全局变量isPostBack 并将其默认设置为false。当页面进行他的回发时,我在页面中添加了window.isPostBack = true;。现在您的 javascript 只需检查全局变量 (if(window.isPostBack){...})。

    【讨论】:

      【解决方案3】:

      如果您使用包含脚本的封装控件,则从Master 中删除原始脚本并在两个页面中使用所述控件。除非我错过了什么,否则就是说:

      • 从MasterPage删除原始脚本
      • 在MasterPage 中使用带有脚本的自定义控件
      • 在非母版页面中使用带有脚本的自定义控件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-09
        • 2011-04-12
        • 1970-01-01
        • 2014-12-19
        • 2011-03-31
        • 1970-01-01
        • 1970-01-01
        • 2011-12-05
        相关资源
        最近更新 更多