Увеличьте количество раз, когда статья была прочитана

0

У меня есть ситуация, когда мне нужно увеличить количество прочитанной статьи времени. Когда кто-то открывает статью, он должен быть отражен в базе данных, увеличивая количество чтений на единицу. Просто.

Отправка запроса 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 он вообще не обновлялся в базе данных, я предполагаю, что сообщение вообще не запускалось. Почему это так? Я хочу понять проблему, поэтому я больше не буду вдаваться в эту проблему. Благодарю.

  • 1
    Просто интересно, зачем вам нужно увеличивать счетчик чтения с помощью JavaScript. Если вы говорите, что оно обновляется при загрузке статьи, а ваша ссылка перенаправляет на ту же ссылку, которую вы вводите вручную, вы теперь увеличиваете ее в два раза (один раз с помощью JavaScript и один раз, когда вы действительно переходите к статье), это не так. ты?
  • 1
    вы делаете это неправильно, увеличивая при загрузке страницы, когда страница обрабатывается для отправки или после того, как страница была загружена для более точной статистики; или используйте piwik.
Показать ещё 1 комментарий
Теги:

2 ответа

1
Лучший ответ

Ваша проблема может быть связана с тем, что $.post является асинхронным, и вы слишком быстро проверяете это и пытаетесь отправить синхронно:

$.ajax({
    type: 'POST',
    url: "/articles/viewed/" + oid,
    async:false
});
  • 0
    Это работает. Приветствия. Не могли бы вы уточнить? Я хотел бы понять почему. Смотрите обновление вопроса.
  • 1
    Причина в том, что ваша ссылка фактически выгружает страницу. Затем ваш браузер прерывает Ajax-запрос. В некоторых случаях он будет проходить, потому что после отправки сервер его обработает. В других случаях он будет прерван до его отправки и никогда не будет доставлен на сервер. Правильнее всего сделать это, когда страница загрузится, и полностью избавиться от Ajax-вызова.
Показать ещё 3 комментария
0

Предотвращение дефолта. Подождите ответа от сервера, чтобы сказать, что приращение чтения статей по 1 было успешным, а затем перенаправить на статью.

Если он работает с предупреждением на месте, это звучит как состояние гонки.

  • 0
    Вот о чем я думал ... вроде как звучит как ответ Яира Невета выше. Но это не работает по какой-то причине. Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню