簡體   English   中英

$未定義[jQuery,MasterPage,UserControl,共享/靜態事件處理程序,外部javascript]

[英]$ is not defined [jQuery,MasterPage,UserControl,Shared/static Event handler,external javascript]

不幸的是,我無法在應用程序外部重現此問題。 我有一個VS2012項目,可以將任何願意看的人發送給我。 它對我來說是孤立的,但不適用於更大的應用程序。

我的目標是在母版頁中有一個通用的覆蓋控件,該控件可使頁面在部分回發期間冒泡顯示事件。

這是我所擁有的:

  • 一個用戶控件,該控件在疊加層中顯示一個消息框
  • 一個獲取PageRequestManager對象並添加pageLoaded事件的javascript文件
    • 事件處理程序檢查隱藏控件的值,並使用jquery顯示/隱藏消息
  • 包含腳本管理器和包含在updatepanel中的用戶控件的母版頁
  • 包含共享事件的類,用於警告母版頁面需要顯示消息
  • 帶有帶有div,按鈕和文本框的updatepanel的頁面
  • 一個css文件

測試應用程序中會發生什么:

  • 在框中輸入文本,然后單擊按鈕
  • 按鈕單擊事件
    • 將文本復制到updatepanel中的div
    • 調用自定義類中的DisplayMessage方法以警告母版頁
  • DisplayMessage實例化並填充自定義事件args並引發事件
  • 母版頁中的處理程序設置用戶控件的屬性,並在其UpdatePanel上調用Update
  • 該頁面顯示疊加層和觸發頁面Loaded [1]
  • javascript函數評估隱藏控件的Value屬性並顯示消息。
  • 用戶單擊確定按鈕
  • 單擊處理程序(服務器端)設置隱藏值並觸發用戶控件的updatepanel上的更新
  • 消息消失

在“現實生活中”會發生什么:

  • 在[1]點,未定義$的javascript失敗

chrome控制台允許我輸入jQuery並顯示確定。

沒有涉及jq插件,腳本管理器位於主控窗體的頂部。 jQuery參考位於指向Google的主站點中,沒有“ 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>

這是UserControl標記:

<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);

但是它又回到“ $未定義”。

對此有何評論?

chrome控制台允許我輸入jQuery並顯示確定。

因為在您輸入該代碼時,jQuery已加載。 但是這個錯誤:

$未定義

表示在運行其他代碼時, 尚未加載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>

其他JavaScript出現錯誤。 不是語法錯誤,而是因為ASP.NET將它們插入頁面的方式,所以它們領先於Sys定義。 因此,我用關聯的javascript更改了所有用戶控件,以遵循以下模式:

-1-使用Java語言幫助器類將腳本引用添加到頁面。 (我在這里使用項目符號,但是代碼格式化程序在項目符號列表中不起作用-headsup stackoverflow開發人員)

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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM