Проблема с jquery #find при частичной обратной передаче

У меня есть сторонний компонент. Это элемент управления календарем. У меня есть событие на стороне клиента, которое запускает javascript для отображения всплывающего меню. Я делаю все на стороне клиента, поэтому могу использовать MVC.

dd

   function MouseDown(oDayView, oEvent, element) {

    try {

        e = oEvent.event;

        var rightClick = (e.button == 2);
        if (rightClick) 
        {
            var menu = $find("2_menuSharedCalPopUp");
            menu.showAt(200, 200, e);
        }


    }
    catch (err) {
        alert("MouseDown() err: " + err.description);
    }


}

Изначально javascript отлично работает с $find.

У меня есть другой клиентский метод, который обновляет календарь с помощью частичной обратной передачи. После того, как я сделал это, все последующие MouseDowns (щелчки правой кнопкой мыши), которые используют ошибку состояния $find с «нулевым».

Все подобные проблемы, с которыми сталкиваются люди, похоже, связаны с вызовом javascript после обратной передачи — с решениями перерегистрации события с помощью PageRequestManager или регистрации клиентской функции на сервере — и так далее.

Тем не менее, событие срабатывает, и javascript работает - это ссылка в DOM, которая кажется проблемой.

Любые идеи?


person anonymous    schedule 11.06.2010    source источник


Ответы (4)


Постараюсь пролить свет на эту проблему:

  1. $find не является методом jQuery, хотя может выглядеть так. Он исходит из ASP.NET Ajax и используется для поиска компонентов ASP.NET Ajax на стороне клиента. Правильное использование без "#" - для этого требуется идентификатор компонента, который в большинстве случаев является свойством сервера ClientID.
  2. Я думаю, что вы, возможно, используете стороннюю библиотеку компонентов, основанную на ASP.NET Ajax. Вполне возможно, что эта библиотека не поддерживает способ MVC для работы с Ajax. MVC Ajax не работает как ASP.NET Ajax — он не действует как UpdatePanel и не выполняет теги сценариев в частичном представлении. В результате компонент календаря никогда не инициализируется, а $find корректно возвращает null.

Что дает? Я предлагаю вам попробовать использовать jQuery ajax для загрузки частичных представлений. Он правильно выполняет любой встроенный код JavaScript и может привести к лучшим результатам.

person Atanas Korchev    schedule 11.06.2010
comment
Спасибо. Вы правы - элементы управления явно не поддерживают MVC, но до сих пор я добился успеха с гораздо более сложными элементами управления. Я должен отключить состояние просмотра и использовать только их (богатую) клиентскую модель в соответствии с их направлением. Они даже предоставляют менеджер сценариев в качестве дополнения к своей базовой библиотеке. - person anonymous; 11.06.2010
comment
Спасибо за пояснения относительно синтаксиса $. Я предполагал, что это jquery ;-) Сейчас я пробую все предложения. - person anonymous; 11.06.2010
comment
У нас есть победитель... спасибо, ребята... просто чтобы досадить вам - я заставил его работать с var menu = $find(‹%= menuSharedCalPopUp.ClientID %›); Я понимаю, что смешиваю свои частичные обратные передачи MVC (работают сладко) с синтаксисом ASP NET Ajax... сбит с толку - я... - person anonymous; 11.06.2010

Вы имеете в виду меню = $('#2_menuSharedCalPopUp'); ?

$find вообще не объявлен в вашей функции.

использование .find() в jQuery

<div id="parent">
   <div class="child" />
</div>

$('#parent').find('.child'); // useful for cached jQuery objects
person Dan Heberden    schedule 11.06.2010
comment
если бы это было так, то это не сработало бы с первого раза? Я имею в виду, что он должен быть там, но это загадка, почему он работает в первый раз. :) - person griegs; 11.06.2010
comment
Спасибо, Дэн, но это сработало, и использование #find — это упрощенный фрагмент кода, который я нашел в другом месте. - person anonymous; 11.06.2010

Вы проверили имя и идентификатор, когда возвращаетесь с вызова с частичным просмотром? может быть, идентификатор изменился.

если это так, дайте элементу управления имя класса, скажем, «MyCalendar», а затем используйте $find(".MyCalendar");

person griegs    schedule 11.06.2010