К сожалению, я не могу воспроизвести эту проблему вне моего приложения. У меня есть проект VS2012, я могу отправить любого, кто хочет взглянуть. Он работает для меня изолированно, но не в более крупном приложении.
Моя цель состоит в том, чтобы на основной странице было установлено общее оверлейное управление, чтобы страницы могли вызывать события отображения во время частичной обратной передачи.
Вот что у меня есть:
Что происходит в тестовом приложении:
Что происходит "в реальной жизни":
Консоль chrome позволяет мне вводить jQuery и отображать элементы в порядке.
Не задействованы плагины jq, скриптовый менеджер находится в верхней части формы в главном. Ссылка на jquery находится в папке мастера, указывающей на google без "http/https".
Я попытался добавить внешний скрипт в ScriptManagerProxy, но безрезультатно. Как это, тестовое приложение отлично работает с
<script src="blahblah.js"></script>
в нижней части пользовательской разметки.
Любая помощь, которую вы можете предложить, будет очень оценена.
Cheers,.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 вызывает мою функцию popup_msg_init в другом потоке, который не может видеть jquery, и задержка, вызванная поиском dom вручную, дает ему достаточно времени для загрузки, потому что к моменту вызова функций show/hide все,
Поэтому я думал, что проверю это, оставив там тайм-аут:
setTimeout(function () {
if ($('input[id*="hdnHidden"]').attr('value') == 'True')
popup_msg_hide();
else
popup_msg_show();
}, 5000);
Но он возвращается к "$ undefined".
Есть ли комментарии по этому поводу?
Были допущены ошибки в других javascripts. Не синтаксическая ошибка, а из-за того, как ASP.NET вставлял их в страницу, они опережали определение Sys. Поэтому я изменил все свои пользовательские элементы управления с помощью связанного javascript, чтобы следовать этому шаблону:
-1- Используйте вспомогательный класс Javascript, чтобы добавить ссылку на страницу скрипта. (Я бы использовал здесь пули, но форматирование кода не работает в маркированных списках - headup stackoverflow devs)
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>
Консоль 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>