Javascript 避免母版页和Iframe子页中的脚本执行两次

Javascript 避免母版页和Iframe子页中的脚本执行两次,javascript,jquery,asp.net,master-pages,Javascript,Jquery,Asp.net,Master Pages,我已经用jQuery开发了一个脚本,每当选择被更改时,就会执行一些逻辑 最初,我将该脚本添加到母版页,以确保每个页面都会被考虑-但是,我有一些外部页面(aspx)不使用母版页,因此没有脚本 为了解决这个问题,我将相同的脚本添加到一个自定义控件中,该控件呈现为,并且也存在于这些外部页面中。不幸的是,以这种方式,脚本将执行两次,而不是一次 如何更改代码以确保脚本在每个页面中执行,但只执行一次?用户.net的ClientScriptManager.RegisterClientScriptInclude

我已经用jQuery开发了一个脚本,每当
选择被更改时,就会执行一些逻辑

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

为了解决这个问题,我将相同的脚本添加到一个自定义控件中,该控件呈现为
,并且也存在于这些外部页面中。不幸的是,以这种方式,脚本将执行两次,而不是一次


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

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

您还可以使用jquery查看它是否已注册并添加id:

function requireOnce(url) {    
    if (!$("script[scr='" + url + "']").length) {
        $('head').append("<script type='text/javascript' src='" + url + "'></script>"); 
    }
}
函数要求(url){
if(!$(“脚本[scr=”+url+“]”).length){
$('head')。追加(“”);
}
}

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

  • 从母版页中删除原始脚本
  • 将自定义控件与母版页中的脚本一起使用
  • 在非主控页面中对脚本使用自定义控件

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

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