Обратный вызов Javascript не запускается после завершения операции AJAX - PullRequest
0 голосов
/ 23 марта 2010

Учитывая следующий код на ASP.NET MVC View:

<% using (Ajax.BeginForm("AddCommunity", 
    new AjaxOptions { UpdateTargetId = "community-list", 
    OnSuccess = "BindCommunityHover" }))
   { %>
    Add Community: <input type="text" id="communityName" name="communityName" /> 
    <input type="submit" value="Add" />
<% } %>

И следующий метод JavaScript в файле:

function BindCommunityHover() {
    $(".community-item-li").hover(
            function () { $(this).addClass("communityHover"); },
            function () { $(this).removeClass("communityHover"); }
        );
};

Есть ли причина, по которой BindCommunityHover не вызывается, когда возвращается результат AJAX?

Div-список сообщества правильно обновлен (действие возвращает частичное представление). Я также попытался установить OnComplete (вместо OnSuccess) безрезультатно.

Метод BindCommunityHover вызывается в $ (function () {...}); блокировать при первой загрузке страницы, и для всех существующих элементов .community-item-li это работает.

Частичный результат от моего контроллера заменяет все элементы в этом div на более одного класса. Предполагается, что метод OnSuccess сработает после обновления документа.

Обновление : к ... это странно. Я добавил следующее в метод BindCommunityHover:

alert($(".community-item-li").size());

Я получаю 240 в предупреждении, когда страница загружается и когда срабатывает обратный вызов. Итак, обратный вызов запущен, jQuery сопоставляет элементы, но не применяет стили ...

Ответы [ 2 ]

2 голосов
/ 24 марта 2010

Это потому, что ваша функция в основном говорит добавить событие hover для всех этих элементов, поскольку они существуют в момент времени, когда вызывается функция.

Если вы добавите новые элементы, они не будут автоматически связаны. В JQuery появилась новая функция под названием Live Events. Я не копался в них, но я думаю, что они могут помочь здесь. В противном случае при добавлении новых элементов обязательно связывайте функции наведения.

0 голосов
/ 24 марта 2010

Хорошо, в этом решении было две части.

Первым виновником было какое-то неприятное кеширование, которое я не могу понять в Cassini / IE. Я попытался перезагрузиться, остановить Cassini, перезапустить VS2010 ... ничего не получалось.

Код по-прежнему не будет работать в IE на моей учетной записи на этом компьютере. Развернутая в IIS версия работает во всех браузерах. Это также работает в IE, если я изменю имя файла. Однако там что-то скрыто. Если я запускаю проект с помощью Cassini / IE, затем открываю FireFox и захожу на сайт, он работает. Я попытался воспроизвести ошибку, чтобы сообщить об ошибке, но не могу ее устранить. Я отвлекся. Чтобы обойти это, я изменил имя файла .js и переместил ссылку в другое место на главной странице.

Другое дело, что мне пришлось использовать OnSuccess. Я переключился на использование OnComplete, когда пытался выяснить, в чем дело. После того, как я выяснил проблему с файлом / браузером / сервером, я понял, что OnComplete (согласно документам) запускает до , документ обновляется; элементы обновлялись, но затем выбрасывались.

OnSuccess / OnComplete может помочь кому-то разобраться, не уверенный в проблеме файла / браузера / сервера ... которая может быть экологической.

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