$ не определено [jQuery, MasterPage, UserControl, Shared / статический обработчик событий, внешний javascript]

0

К сожалению, я не могу воспроизвести эту проблему вне моего приложения. У меня есть проект VS2012, я могу отправить любого, кто хочет взглянуть. Он работает для меня изолированно, но не в более крупном приложении.

Моя цель состоит в том, чтобы на основной странице было установлено общее оверлейное управление, чтобы страницы могли вызывать события отображения во время частичной обратной передачи.

Вот что у меня есть:

  • Пользовательский элемент управления, который отображает окно сообщения в оверлее
  • Файл javascript, который получает объект PageRequestManager и добавляет событие pageLoaded
    • Обработчик события проверяет значение скрытого элемента управления и использует jquery для отображения/скрытия сообщения
  • Мастер-страница со сценарием и пользовательским элементом управления, завернутым в панель обновления
  • Класс, содержащий общее событие, чтобы предупредить главную страницу о том, что сообщение должно отображаться
  • Страница с областью обновления, содержащей div, кнопку и текстовое поле
  • Файл css

Что происходит в тестовом приложении:

  • текст вводится в поле, и кнопка нажата
  • событие нажатия кнопки
    • копирует текст в div в панели обновления
    • вызывает метод DisplayMessage в пользовательском классе для уведомления главной страницы
  • DisplayMessage создает и заполняет настраиваемые аргументы событий и вызывает событие
  • обработчик на главной странице задает свойства usercontrol и вызывает обновление на UpdatePanel
  • на странице отображается оверлей и триггер pageLoaded [1]
  • функция javascript оценивает свойство Value скрытого элемента управления и отображает сообщение.
  • пользователь нажимает кнопку OK
  • обработчик кликов (серверная сторона) устанавливает скрытое значение и запускает обновление в панели обновления usercontrol
  • сообщение исчезает

Что происходит "в реальной жизни":

  • в точке [1] ошибка javascript с $ не определена

Консоль 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>&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 вызывает мою функцию 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".

Есть ли комментарии по этому поводу?

  • 2
    Эта ошибка означает, что jQuery не включается на страницу правильно. На самом деле не видя никакого кода, это примерно столько же, сколько может помочь любой.
  • 0
    stackoverflow.com/questions/2194992/jquery-is-not-defined эта ссылка может помочь вам ..
Теги:
user-controls
scriptmanager

2 ответа

0
Лучший ответ

Были допущены ошибки в других 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>
0

Консоль 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>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню