Опубликовать и дождаться возврата в событии onclick

#jquery #asp.net-mvc

#jquery #asp.net-mvc

Вопрос:

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

  • Пользователь нажимает на ссылку в результате поиска.
  • Сеанс обновляется на сервере с помощью jQuery post.
  • После обновления сеанса поиск сохраняется в localStorage.
  • Когда все будет сделано, перейдите по ссылке, на которую был нажат.

Вот код:

 // Manually save the lastest search result and update session at server
$('a.e').click(function (event) {
    event.preventDefault();
    if (('localStorage' in window) amp;amp; window['localStorage'] !== null) {
        $.post("Home/UpdateSession/", $("form").serialize());
        var form = $("#myTable").html();
        localStorage.setItem('myTable', form);
        form = null;
    }
    $.get($(this).attr('href'));
});  
  

Я получаю сообщение об ошибке, в котором говорится, что сеанс не был обновлен на сервере, когда я перехожу по ссылке. И если я поставлю точку останова в действии, которое вызывается в сообщении, оно там не прерывается. Возможно ли выполнить эти шаги в таком порядке или событие click вызывается перед публикацией?

Комментарии:

1. К какой странице вы пытаетесь получить доступ? Home/ UpdateSession/index.??? или Home / UpdateSession.???

2. Я пытаюсь получить доступ к ActionResult UpdateSession в сообщении, а затем получить href ссылки, на которую был нажат.

3. Так это .NET, с которым вы работаете? Кроме того, попробуйте Home / UpdateSession для URL-адреса вместо Home / UpdateSession/

4. Да, но я думаю, что проблема в jQuery.

Ответ №1:

в ответ на ваш комментарий к сообщению Мэтта Бриджеса, чтобы выполнить вызов ajax при выгрузке, вы должны выполнить вызов ajax с async: false опцией, подобной:

 $(window).bind('unload', function(){
   $.ajax({
        cache: false,
        async: false,
        url: "test.php"
    });
});
  

Комментарии:

1. Спасибо, я думаю, что проблема заключалась в async: false. Я опубликовал полное решение моей конкретной проблемы.

Ответ №2:

post() Функция jQuery выполняется асинхронно. Вам нужно будет дождаться завершения публикации, прежде чем сохранять значения в локальном хранилище и переходить к результату. Сейчас происходит то, что браузер покидает страницу до завершения публикации.

Третий (необязательный) аргумент post() — это обратный вызов; вы можете передать функцию, которая запускается после завершения публикации. Вам нужно поместить все действия, которые вы хотите выполнить после публикации, в эту функцию обратного вызова, например

 if (('localStorage' in window) amp;amp; window['localStorage'] !== null) {
    $.post("Home/UpdateSession/", $("form").serialize(), function() {
        var form = $("#myTable").html();
        localStorage.setItem('myTable', form);
        form = null;
        $.get($(this).attr('href'));
    });
    return false; // prevent normal link behavior
}
else
{
    return true;
}
  

Редактировать: добавлено return false для предотвращения нормального поведения ссылки

Комментарии:

1. Хм, это все еще не работает. Если я изменю $('a.e') на $(window) и .click функцию на .unload , тогда она отлично работает. Но я хочу применить это действие только к щелчку по ссылке.

2. Если я удалю $.get($(this).attr('href')); , он все равно выполнит перенаправление. Думал, что preventDefault предотвратит это?

3. Смотрите мое редактирование — добавьте «return false» в функцию обработчика кликов, чтобы браузер не переходил по ссылке.