#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» в функцию обработчика кликов, чтобы браузер не переходил по ссылке.