У меня есть ситуация, когда мне нужно увеличить количество прочитанной статьи времени. Когда кто-то открывает статью, он должен быть отражен в базе данных, увеличивая количество чтений на единицу. Просто.
Отправка запроса POST на сервер увеличивает количество чтений на один. Эта статья предоставляется через параметр URL.
Выполнение этого вручную, набрав URL-адрес в браузере, работает так, как ожидалось. Поэтому серверная сторона не виновата.
Мои проблемы начинаются со стороны javascript или, скорее, с jquery. Я привязываю событие к ссылке статьи. Поэтому каждый раз, когда пользователь нажимает ссылку на статью, он увеличивает количество таких чтений:
$('#list-articles .article-link').click(function(e){
var oid = $(this).parent().parent().attr('data-oid').toString(); //Get the article id
$.post( "/articles/viewed/" + oid );
});
Теперь это не работает! Номер не увеличивается.
Я не предотвращаю действие по умолчанию, так как мне нужна ссылка для фактического открытия и отображения статьи.
Теперь, если я поставил предупреждение сразу после публикации:
$('#list-articles .article-link').click(function(e){
var oid = $(this).parent().parent().attr('data-oid').toString(); //Get the article id
$.post( "/articles/viewed/" + oid );
alert(oid);
});
Этот вариант работает. После отклонения окна предупреждения число увеличивается. Почему это так? Как я могу исправить это, чтобы на самом деле работать без присутствия предупреждения?
ОБНОВИТЬ
Спасибо, что помогли решить эту проблему. Все ответы велики и помогают так или иначе. Единственным вариантом, который работает до сих пор, является отключение async при вызове ajax. Было бы здорово, если бы кто-то мог уточнить, почему было отключено асинхронное действие в ajax. Итак, почтовый запрос в оригинале так и не был выполнен? Если я просто проверял слишком рано, и увеличение количества не было видно при загрузке страницы, оно должно быть все еще видимым на следующей перезагрузке страницы, правильно? SInce он вообще не обновлялся в базе данных, я предполагаю, что сообщение вообще не запускалось. Почему это так? Я хочу понять проблему, поэтому я больше не буду вдаваться в эту проблему. Благодарю.
Ваша проблема может быть связана с тем, что $.post
является асинхронным, и вы слишком быстро проверяете это и пытаетесь отправить синхронно:
$.ajax({
type: 'POST',
url: "/articles/viewed/" + oid,
async:false
});
Предотвращение дефолта. Подождите ответа от сервера, чтобы сказать, что приращение чтения статей по 1 было успешным, а затем перенаправить на статью.
Если он работает с предупреждением на месте, это звучит как состояние гонки.