[英]$ is not defined [jQuery,MasterPage,UserControl,Shared/static Event handler,external javascript]
不幸的是,我無法在應用程序外部重現此問題。 我有一個VS2012項目,可以將任何願意看的人發送給我。 它對我來說是孤立的,但不適用於更大的應用程序。
我的目標是在母版頁中有一個通用的覆蓋控件,該控件可使頁面在部分回發期間冒泡顯示事件。
這是我所擁有的:
測試應用程序中會發生什么:
在“現實生活中”會發生什么:
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> </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.