0

不幸的是,我无法在我的应用程序之外重现此问题。我有一个VS2012项目,我可以发送任何愿意看一看的人。它对我来说是孤立的,但不适用于更大的应用程序。

我的目标是在母版页中有一个共同的叠加控制,页面可以在部分回发期间使显示事件显示。

这是我有:

  • ,在覆盖
  • 一个JavaScript文件获取PageRequestManager对象,并添加了pageLoaded事件
    • 事件处理程序检查显示一个消息框,用户控件一个隐藏的控制的值,并使用jQuery来显示/隐藏消息
  • 与一个ScriptManager和用户控制瓦特的主页振打在一个UpdatePanel
  • 一类含有共享事件以提醒需要显示
  • 与含有一个div,按钮和文本框中一个UpdatePanel的页一个消息中的主页
  • CSS文件

在测试应用程序,会发生什么:

  • 文本输入框中和按钮点击
  • 按钮点击事件
    • 复制文本到div中的UpdatePanel
    • 调用自定义类的DisplayMessage方法来提醒母版页
  • DisplayMessage实例化和填充自定义事件参数,并引发事件
  • 主页中的处理程序设置usercontrol的属性,并在其UpdatePanel上调用Update UpdatePanel
  • 页面显示叠加和触发页面加载[1]
  • th e javascript函数评估隐藏控件的Value属性并显示消息。
  • 用户点击OK按钮
  • 单击处理程序(服务器端)设置了隐藏的价值和对用户控件的UpdatePanel的触发更新
  • 消息消失

会发生什么事“在现实生活中” :

  • 在点[1]时,JavaScript将失败,$没有定义

铬控制台允许我输入jQuery并显示元素确定。

没有涉及jq插件,scriptmanager在主窗体的顶部。 jquery的参考是在主指向谷歌没有“HTTP/HTTPS”。

我曾尝试在ScriptManagerProxy中添加外部脚本,但无济于事。实际上,测试应用程序可以在用户控件标记的底部与

<script src="blahblah.js"></script> 

正常工作。

任何帮助你可以提供将非常感激。

干杯, .pd。

编辑:

脚本引用的要求:

这是母版页:

<head runat="server"> 
<title>Untitled Page</title> 
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> 
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script> 
<script type="text/javascript" src="/scripts/tabindex.js"></script> 

<asp:ContentPlaceHolder ID="head" runat="server"> 
</asp:ContentPlaceHolder> 
</head> 
<body style="background-color: #cccccc;"> 
<form id="form1" runat="server"> 
    <asp:ToolkitScriptManager runat="Server" EnablePartialRendering="true" ID="ScriptMan1" EnablePageMethods="true"> 
    </asp:ToolkitScriptManager> 

    <asp:UpdatePanel ID="updPopupMsg" runat="server" UpdateMode="Conditional"> 
     <ContentTemplate> 
      <amis:PopupMsg ID="popMaster" runat="server" Hidden="true" /> 
     </ContentTemplate> 
    </asp:UpdatePanel> 
</form> 

这是用户控件的标记:

<div id="divOverlay" runat="server" class="helpbox-overlay"></div> 
<div id="divMessage" runat="server" class="helpbox"> 
<asp:HiddenField ID="hdnHidden" runat="server" Value="True" /> 
<asp:Panel ID="pnlHelpBox" CssClass="helpbox-popup" runat="server"> 
    <h1> 
     <asp:Label ID="lblTitle" runat="server"></asp:Label></h1> 
    <p> 
     <asp:Label ID="lblMsg" runat="server"></asp:Label> 
    </p> 
    <p>&nbsp;</p> 
    <p align="center"> 
     <asp:Button ID="btnClose" CausesValidation="false" Text="Close" runat="server"/> 
    </p> 
</asp:Panel> 
</div> 

<script type="text/javascript" src="/scripts/popup-msg.js"></script> 

,该代码javascript文件看起来像这样:

var prm = Sys.WebForms.PageRequestManager.getInstance(); 
prm.add_pageLoaded(popup_msg_init); 

function popup_msg_init() { 
    if ($('input[id*="hdnHidden"]').attr('value') == 'True') 
     popup_msg_hide(); 
    else 
     popup_msg_show(); 
} 

function popup_msg_show() { 
    $('div[id*="divOverlay"]').show(); 
    $('div[id*="divMessage"]').show(); 
} 

function popup_msg_hide() { 
    $('div[id*="divOverlay"]').hide(); 
    $('div[id*="divMessage"]').hide(); 
} 

编辑:

嘿 - 这可能脚本被异步加载?有什么工具可以用来验证什么时候发生?我问,因为我改变了以下javascript:

var prm = Sys.WebForms.PageRequestManager.getInstance(); 
prm.add_pageLoaded(popup_msg_init); 

function popup_msg_init() { 
    var inputs = document.getElementsByTagName('input'); 
    for (var i = 0; i < inputs.length; i++) { 
     var input = inputs[i]; 
     if (input.id.indexOf('hdnHidden') > 0) { 
      if (input.value == 'True') 
       popup_msg_hide(); 
      else 
       popup_msg_show(); 
     } 
    } 
} 

function popup_msg_show() { 
    $('div[id*="divOverlay"]').show(); 
    $('div[id*="divMessage"]').show(); 
}  

function popup_msg_hide() { 
    $('div[id*="divOverlay"]').hide(); 
    $('div[id*="divMessage"]').hide(); 
} 

现在,它的一切工作。所以我的理论是,pageLoaded在另一个不能看到jquery的线程上调用popup_msg_init函数,并且在搜索dom时导致的延迟手动给它足够的时间以在调用show/hide函数时加载cuz,所有的常规。

所以我想我会检查,通过在那里坚持超时:

setTimeout(function() { 
    if ($('input[id*="hdnHidden"]').attr('value') == 'True') 
     popup_msg_hide(); 
    else 
     popup_msg_show(); 
}, 5000); 

但它可以追溯到“$是不确定的。”

对此有何评论?

+2

该错误意味着jQuery没有被正确包含在页面中。在没有真正看到任何代码的情况下,这与任何人都可以获得的帮助一样多。 –

+0

http://stackoverflow.com/questions/2194992/jquery-is-not-defined这个链接可能会帮助你.. – Karthikeyan

回答

0

有被包括在其他的JavaScript错误。没有语法错误,但由于ASP.NET将它们插入页面的方式,他们超越了Sys定义。所以我改变了所有的用户控件和关联的javascript,以遵循以下模式:

-1-使用一个Javascript助手类将脚本引用添加到页面。 (我在这里使用的子弹,但代码格式化不会在项目列表工作 - 平视计算器的开发者)

Imports System.Web.UI 
Imports System.Web.UI.WebControls 
Imports System.Web.UI.HtmlControls 

Public Class JSHelper 
    Public Shared Sub Add(path As String, page As Page) 
     Dim jsFile As New HtmlGenericControl("script") 
     jsFile.Attributes.Add("type", "text/javascript") 
     jsFile.Attributes.Add("language", "javascript") 
     jsFile.Attributes.Add("src", page.ResolveUrl(path)) 
     page.Header.Controls.Add(jsFile) 
    End Sub 
End Class 

-2-添加脚本

JSHelper.Add("/scripts/myscript.js", Me.Page) 

-3-运行安装程序的功能在控制标记取决于有什么

<script type="text/javascript" lang="javascript"> 
    if (typeof (Sys) === 'undefined') 
     $(function() { 
      init(); }); 
    else { 
     if (typeof (Sys.WebForms) === 'undefined') 
      alert('Sys.WebForms not defined!'); 
     else { 
      Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(init); 
     } 
    } 
</script> 
0

The chrome console allows me to input jQuery and displays elements ok.

因为当你输入代码时,jQuery被加载。但这个错误:

$ is not defined

表明,在一些其他的代码运行的时间,jQuery是加载。

请注意,JavaScript代码按其加载到页面的顺序进行处理。所以jQuery库需要在任何使用它的代码之前加载。 (也就是说,引擎不够聪明,无法加载所有代码,然后像引用编译语言那样将引用链接到彼此。)

虽然您在问题中提供了大量信息,但您没有提供的是HTML中的脚本引用。作为一个例子,不过,考虑这是不正确的情况如下:

<script type="text/javascript" src="someScriptThatUsesjQuery.js"></script> 
<script type="text/javascript" src="jQuery.js"></script> 

与这是正确如下:

<script type="text/javascript" src="jQuery.js"></script> 
<script type="text/javascript" src="someScriptThatUsesjQuery.js"></script>