@pevxiw
Вэб

Как сделать переписку как в вк, discord, fasebook?

Всем привет, можете помочь или скинуть ссылку на нормальную инфу как сделать так чтобы когда пользователь мне писал у меня обновлялась страница я уже сделал всё с помощью ajax и сделал setInterval('show()',1000);
но из-за интервала у меня мигает кнопка удалить сообщение и обводка сообщения при на видении.
Как сделать так чтобы не мигало ничего и всё нормально работало как в вк, дискорд или fasebook
Мне нафиг не нужен setInterval и эти секунды мне нужно чтобы всё отображалось нормально без мигания.
Сообщение также добавляется с помощью ajax без обновления страницы
все сообщения хранятся в базе данных!
Мне просто нужно выводить сообщения как только пользователь написал его мне!
прошу помогите 3дня искал ничего толком не нашел нормального или-же плохо искал.
Также прошу прощения за грамматику !
Кто знаете не молчите буду благодарен =)
Вот сообщения https://vk.com/video273401159_456239134
  • Вопрос задан
  • 1566 просмотров
Пригласить эксперта
Ответы на вопрос 1
twobomb
@twobomb
В общем вот пример как сделать чтобы ничего не дергалось. Сюда залил все файлы + базу.
index.php
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Chat</title>
</head>
<style>
	.msgblock{
		width:300px;
		background: #CCC;
		border-radius: 20px;
		margin-top:20px;
		padding: 10px;
	}
	.msgblock>.date{
		font-style: italic;
	}
	.msgblock>.username{
		font-weight: bold;
	}
	.msgblock>.msg{
		display: block;
		width:100%;
	}
	button,textarea,label{
		display: block;
		margin:5px;	
	}


</style>
<script src="./jquery-3.3.1.min.js"></script>
<script>
	//Получаем timestamp последнего сообщения, если нету сообщений то 0 чтобы получить все
	function getTimeStamp(){
		if($(".msgblock").length == 0)
			return 0;
		var $msgs = $(".msgblock");
		return $($msgs[$msgs.length-1]).data("timestamp");
	}
	$(document).ready(function(){
		//Добавляем сообщение
		$("#send").on("click",function(){
			$.ajax({
				    method: "POST",
				    url: "./handler.php",
				    data: { userid: $("#userid").val(),msg:$("#msg").val()}
				  }).done(function(){getMsgAfterTime();});
		});
		//Таймер на запрос новых сообщений каждую секунду
			(function updateData(){
				getMsgAfterTime(function(){
					setTimeout(updateData,1000);
				});		
			})();	

	});
	//Получение новых сообщение и добавление
	function getMsgAfterTime(callback){
		 $.ajax({
		    method: "POST",
		    url: "./handler.php",
		    data: { timestamp: getTimeStamp()}
		  })
		    .done(function( newValue ) {
		      if(newValue != "")
					$("#msgs").append($(newValue));
				if(typeof(callback) == "function")
					callback();
		      
    });
	}
</script>
<body>
	<div id="msgs">
	</div>
	<label>UserID<input type="text" id="userid" value="1"></label><br>
	<textarea id="msg"  cols="30" rows="10"></textarea>
	<button id="send">Отправить</button>
</body>
</html>
handler.php
<?php
	define("DB_HOST","localhost");
	define("DB_LOGIN","root");
	define("DB_PASSWORD","123456");
	define("DB_PORT","3306");
	define("DB_NAME","testchat");
	
	function getConnection(){
		return  new mysqli(DB_HOST.":".DB_PORT, DB_LOGIN, DB_PASSWORD, DB_NAME);
	}

//Получаем сообщения которые пришли после времени $_POST["timestamp"]
if($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["timestamp"])){
	$con = getConnection();
	$sql = "SELECT msg,date,login,UNIX_TIMESTAMP(date) as timestamp FROM msg INNER JOIN users ON msg.user_id=users.id WHERE UNIX_TIMESTAMP(date) > $_POST[timestamp]";
	$res = $con->query($sql);
	while($msg = $res->fetch_assoc())
		echo <<<EOT
		<div class="msgblock" data-timestamp='$msg[timestamp]'>
			<span class="username">$msg[login]</span>
			<span class="date">$msg[date]</span>
			<span class="msg">$msg[msg]</span>
		</div>
EOT;
	$con->close();
}

//Добавляем сообщение
if($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["userid"]) && isset($_POST["msg"])){
	$con = getConnection();
	$sql = "INSERT INTO msg(user_id,msg) VALUES('$_POST[userid]','$_POST[msg]')";
	$con->query($sql);
	$con->close();
	}
?>
БД testchat
Таблица msg
5ad492251382e097380879.png
Таблица users
5ad4923f0ef29250616759.png
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы