@pevxiw
Вэб

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

Всем привет, можете помочь или скинуть ссылку на нормальную инфу как сделать так чтобы когда пользователь мне писал у меня обновлялась страница я уже сделал всё с помощью ajax и сделал setInterval('show()',1000);
но из-за интервала у меня мигает кнопка удалить сообщение и обводка сообщения при на видении.
Как сделать так чтобы не мигало ничего и всё нормально работало как в вк, дискорд или fasebook
Мне нафиг не нужен setInterval и эти секунды мне нужно чтобы всё отображалось нормально без мигания.
Сообщение также добавляется с помощью ajax без обновления страницы
все сообщения хранятся в базе данных!
Мне просто нужно выводить сообщения как только пользователь написал его мне!
прошу помогите 3дня искал ничего толком не нашел нормального или-же плохо искал.
Также прошу прощения за грамматику !
Кто знаете не молчите буду благодарен =)
Вот сообщения https://vk.com/video273401159_456239134
  • Вопрос задан
  • 1389 просмотров
Пригласить эксперта
Ответы на вопрос 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
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Искра Екатеринбург
от 80 000 до 100 000 ₽
Art gorka Санкт-Петербург
от 60 000 ₽
01 мая 2024, в 02:11
5000 руб./за проект
01 мая 2024, в 00:29
2000 руб./за проект
01 мая 2024, в 00:20
15000 руб./за проект