Вывод сообщений онлайн чатом на экран

305
29 июня 2017, 04:59

Есть страница chat.html на которой есть поле ввода сообщения, кнопка отправки и поле вывода(таблица).До перехода на эту страницу пользователь авторизуется на другой(имя сохраняется сессией) и на chat.html после введения пользователем сообщения и нажатия кнопки отправки в этой таблице должно выводиться время, имя и само сообщение.

Вот AJAX на отправку самого сообщения в php и если все прошло успешно то идет вывод на экран.

$(document).ready(function() { 
  $('#easyForm').submit(function() { 
    var text = $('#text').val(); 
    $.ajax({ 
      type: 'POST', 
      url: 'php/chat_script.php', 
      data: { 
        message: text 
      }, 
      success: function(arr) { 
        $('#time').html(arr.time); 
        $('#name').html(arr.user); 
        $('#message').html(arr.message); 
      } 
    }); 
    return false; 
  }); 
});
table#messages { 
  width: 490px; 
  height: 260px; 
  background: #fffecd; 
  border: none; 
} 
 
td#time, 
td#name { 
  width: 100px; 
} 
 
td#name { 
  font-weight: bold; 
} 
 
div#inputs { 
  width: 495px; 
} 
 
form#text_submit { 
  display: inline-flex; 
  align-items: flex-start; 
} 
 
input#text { 
  width: 370px; 
  height: 30px; 
  margin-top: 20px; 
  background: #fffecd; 
  font-family: 'Montserrat'; 
  font-size: 16px; 
  border: none; 
  align-self: flex-start; 
} 
 
input#submit { 
  padding: 0; 
  margin-left: 21px; 
  margin-top: 21px; 
  height: 30px; 
  width: 100px; 
  background: #635960; 
  border: none; 
  color: white; 
  font-family: 'Montserrat'; 
  font-size: 16px; 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<div id="inputs"> 
  <table id="messages"> 
    <tr> 
      <td id="time"></td> 
      <td id="name"></td> 
      <td id="message"></td> 
    </tr> 
  </table> 
  <form method="POST" id="easyForm"> 
    <input type="text" name="text" id="text"> 
    <input type="submit" value="Send" id="submit"> 
  </form> 
</div>

Вот php, в AJAX данные возвращаются в виде json строки. Подскажите, что я не так делаю?

<?php
session_start();
$user = $_SESSION['user'];
$message = $_POST['message'];
$time = date('H:i:s');
$file = "../data/messages.json";
$json_content = json_decode(file_get_contents($file), true);
$content = array();
if(is_array($json_content)) {
    $content = $json_content;
}
if (!empty($message)) {
    $content[] = array("time" => $time, "user" => $user, "message"  => $message);
    file_put_contents($file, json_encode($content, JSON_PRETTY_PRINT),FILE_APPEND);
}
echo json_encode($content);
?>

Ошибка

VM45:1 Uncaught SyntaxError: Unexpected token u in JSON at position 18
at Function.parse [as parseJSON] (<anonymous>)
at Object.success (message.js:14)
at i (jquery.min.js:2)
at Object.fireWith [as resolveWith] (jquery.min.js:2)
at A (jquery.min.js:4)
at XMLHttpRequest.<anonymous> (jquery.min.js:4)

Ошибка при JSON.parse

Uncaught SyntaxError: Unexpected token o in JSON at position 1
at JSON.parse (<anonymous>)
at Object.success (message.js:18)
at i (jquery.min.js:2)
at Object.fireWith [as resolveWith] (jquery.min.js:2)
at A (jquery.min.js:4)
at XMLHttpRequest.<anonymous> (jquery.min.js:4)
success @ message.js:18
i @ jquery.min.js:2
fireWith @ jquery.min.js:2
A @ jquery.min.js:4
(anonymous) @ jquery.min.js:4

Cодержание $content - {"time":"13:23:09","user":"qwe","message":"qwe"}

Answer 1

У вас ответ строка json а вы пытаетесь обработать его как object. До обработки надо сделать парсинг:

Пример кода:

    var json = '{"result":true,"count":1}'; 
    obj = JSON.parse(json); 
 
    console.log(obj.count);

А это парсинг с помощью jQuery։

var json = '{"result":true,"count":8567}'; 
obj = $.parseJSON(json); 
 
console.log(obj.count);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Парсинг вашего полученного ответа:

var json = '{"time":"13:23:09","user":"qwe","message":"qwe"}'; 
obj = JSON.parse(json); 
 
console.log(obj.user);

С вашим кодом будет так:

$(document).ready(function() {
  $('#easyForm').submit(function() {
    var text = $('#text').val();
    $.ajax({
      type: 'POST',
      url: 'php/chat_script.php',
      data: {
        message: text
      },
      success: function(arr) {
        arr = JSON.parse(arr);
        $('#time').html(arr.time);
        $('#name').html(arr.user);
        $('#message').html(arr.message);
      }
    });
    return false;
  });
});

Измените кусок вашего html таким образом:

<div id="inputs">
  <table id="messages">
    <tr class="mess_hide">
      <td class="time"></td>
      <td class="name"></td>
      <td class="message"></td>
    </tr>
  </table>
  <form method="POST" id="easyForm">
    <input type="text" name="text" id="text">
    <input type="submit" value="Send" id="submit">
  </form>
</div>

Для класса mess_hide добавьте css ՝․mess_hide{display: none;}՝.

А success в ajax запросе измените вот так:

$('#messages').append($('.mess_hide').clone().addClass('mess_tmp').removeClass('mess_hide'));
$('.mess_tmp>.time').html(arr.time);
$('.mess_tmp>.name').html(arr.user);
$('.mess_tmp>.message').html(arr.message);
$('.mess_tmp').removeClass('mess_tmp');

Пример:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<script> 
    var json = '{"time":"13:23:09","user":"qwe","message":"qwe"}'; 
    arr = JSON.parse(json); 
 
     
    $(document).ready(function(){ 
      $('.test').click(function(){ 
        $('#messages').append($('.mess_hide').clone().addClass('mess_tmp').removeClass('mess_hide')); 
 
        $('.mess_tmp>.time').html(arr.time); 
        $('.mess_tmp>.name').html(arr.user); 
        $('.mess_tmp>.message').html(arr.message); 
        $('.mess_tmp').removeClass('mess_tmp'); 
      });   
    }); 
     
</script> 
 
<div id="inputs"> 
  <table id="messages"> 
    <tr class="mess_hide"> 
      <td class="time"></td> 
      <td class="name"></td> 
      <td class="message"></td> 
    </tr> 
  </table> 
  <button class="test">test</button> 
</div>

Answer 2

Ваш скрипт не знает что он будет получать если вы возвращаете json, то вам необходмо в ajax({}) добавить dataType: "json"

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script> 
$.ajax({ 
      type: 'POST', 
      url: 'php/chat_script.php', 
      data: { 
        message: text 
      }, 
      dataType:"json", 
      success: function(arr) { 
        $('#time').html(arr.time); 
        $('#name').html(arr.user); 
        $('#message').html(arr.message); 
      } 
    });

READ ALSO
Как отключить логирование в консоле в fetch?

Как отключить логирование в консоле в fetch?

Вывод каждого результата после запроса

179
Куда вставить default если не передаётся фото - JS, mongodb?

Куда вставить default если не передаётся фото - JS, mongodb?

Kуда вставить default, что бы если не передаётся фото по умолчанию, создавалось одно фото с kind: 'thumbnail' и определённым url ?

194
create-react-app + php

create-react-app + php

Как подключить react к серверу php ,сейчас при build(npm run build) и подключении к php indexhtml ,видна только html страница,а скрипт не запускается ,а запускается...

215
Метки разного цвета,в зависимости от района

Метки разного цвета,в зависимости от района

Добавляю из массива с адресами на карту метки

211