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>