- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个供用户聊天的 Jquery/Php 进程,如果我向在线用户发送消息,然后最小化聊天窗口或关闭它,或者刷新页面,我会遇到一些问题,聊天窗口每次都会弹出时间,我希望关闭窗口永远关闭,并且当我最小化栏上的思维时,即使我刷新页面以在栏上保持最小化,也能保持在那里。
下一个问题是有时当我发送消息并按回车键时,消息不会显示,但当我刷新页面时,消息会显示出来。
Ps:该脚本不是我的,我在 youtube 上找到的。
Jquery 聊天脚本:
jQuery(function(){
var userOnline = Number(jQuery('span.user_online').attr('id'));
var clicou = [];
function in_array(valor, array){
for(var i =0; i<array.length;i++){
if(array[i] == valor){
return true;
}
}
return false;
}
function add_janela(id, nome, status){
var janelas = Number(jQuery('#chats .window').length);
var pixels = (270+5)*janelas;
var style = 'float:none; position:absolute; bottom:0; right:'+pixels+'px';
var splitDados = id.split(':');
var id_user = Number(splitDados[1]);
var janela = '<div class="window" id="janela_'+id_user+'" style="'+style+'">';
janela += '<div class="header_window"><a href="#" class="close">X</a> <span class="name">'+nome+'</span> <span id="'+id_user+'" class="status-lista'+'"></span></div>';
janela += '<div class="body"><div class="mensagens"><div id="typing_on"></div><ul></ul></div>';
janela += '<div class="send_message" id="'+id+'"><input type="text" name="mensagem" class="msg" id="'+id+'"/></div></div>';
jQuery('#chats').append(janela);
}
function retorna_historico(id_conversa){
jQuery.ajax({
type: 'POST',
url: 'sys/historico.php',
data: {conversacom: id_conversa, online: userOnline},
dataType: 'json',
success: function(retorno){
jQuery.each(retorno, function(i, msg){
if(jQuery('#janela_'+msg.janela_de).length > 0){
if(userOnline == msg.id_de){
jQuery('#janela_'+msg.janela_de+' .mensagens ul').append('<li id="'+msg.id+'" class="eu"><p>'+msg.mensagem+'</p></li>');
}else{
jQuery('#janela_'+msg.janela_de+' .mensagens ul').append('<li id="'+msg.id+'"><div class="imgSmall"><img src="'+msg.fotoUser+'" /></div><p>'+msg.mensagem+'</p></li>');
}
}
});
[].reverse.call(jQuery('#janela_'+id_conversa+' .mensagens li')).appendTo(jQuery('#janela_'+id_conversa+' .mensagens ul'));
jQuery('#janela_'+id_conversa+' .mensagens').animate({scrollTop: 230}, '500');
}
});
}
jQuery('body').on('click', '#users_online a', function(){
var id = jQuery(this).attr('id');
jQuery(this).removeClass('comecar');
var status = jQuery(this).next().attr('class');
var splitids = id.split(':');
var idJanela = Number(splitids[1]);
if(jQuery('#janela_'+idJanela).length === 0){
var nome = jQuery(this).text();
add_janela(id, nome, status);
retorna_historico(idJanela);
}else{
jQuery(this).removeClass('comecar');
}
});
jQuery('body').on('click', '.header_window', function(){
var next = jQuery(this).next();
next.toggle(100);
});
jQuery('body').on('click', '.close', function(){
var parent = jQuery(this).parent().parent();
var idParent = parent.attr('id');
var splitParent = idParent.split('_');
var idJanelaFechada = Number(splitParent[1]);
var contagem = Number(jQuery('.window').length)-1;
var indice = Number(jQuery('.close').index(this));
var restamAfrente = contagem-indice;
for(var i = 1; i <= restamAfrente; i++){
jQuery('.window:eq('+(indice+i)+')').animate({left:"-=275"}, 200);
}
parent.remove();
jQuery('#users_online li#'+idJanelaFechada+' a').addClass('comecar');
});
jQuery('body').on('keyup', '.msg', function(e){
if(e.which == 13){
var texto = jQuery(this).val();
var id = jQuery(this).attr('id');
var split = id.split(':');
var para = Number(split[1]);
jQuery.ajax({
type: 'POST',
url: 'sys/submit.php',
data: {mensagem: texto, de: userOnline, para: para},
success: function(retorno){
if(retorno == 'ok'){
jQuery('.msg').val('');
}else{
alert("Ocorreu um erro ao enviar a mensagem");
}
}
});
}
});
jQuery('body').on('click', '.mensagens', function(){
var janela = jQuery(this).parent().parent();
var janelaid = janela.attr('id');
var idConversa = janelaid.split('_');
idConversa = Number(idConversa[1]);
jQuery.ajax({
url: 'sys/ler.php',
type: 'POST',
data: {ler: 'sim', online: userOnline, user: idConversa},
success: function(retorno){}
});
});
function verifica(timestamp, lastid, user){
var t;
jQuery.ajax({
url: 'sys/stream.php',
type: 'GET',
data: 'timestamp='+timestamp+'&lastid='+lastid+'&user='+user,
dataType: 'json',
success: function(retorno){
clearInterval(t);
if(retorno.status == 'resultados' || retorno.status == 'vazio'){
t =setTimeout(function(){
verifica(retorno.timestamp, retorno.lastid, userOnline);
},1000);
if(retorno.status == 'resultados'){
jQuery.each(retorno.dados, function(i, msg){
if(msg.id_para == userOnline){
jQuery.playSound('sys/effect');
}
if(jQuery('#janela_'+msg.janela_de).length === 0){
jQuery('#users_online #'+msg.janela_de+' .comecar').click();
clicou.push(msg.janela_de);
}
if(!in_array(msg.janela_de, clicou)){
if(jQuery('.mensagens ul li#'+msg.id).length === 0 && msg.janela_de > 0){
if(userOnline == msg.id_de){
jQuery('#janela_'+msg.janela_de+' .mensagens ul').append('<li class="eu" id="'+msg.id+'"><p>'+msg.mensagem+'</p></li>');
}else{
jQuery('#janela_'+msg.janela_de+' .mensagens ul').append('<li id="'+msg.id+'"><div class="imgSmall"><img src="'+msg.fotouser+'" border="0"/></div><p>'+msg.mensagem+'</p></li>');
}
}
}
});
jQuery('.mensagens').animate({scrollTop: 230}, '500');
console.log(clicou);
}
clicou = [];
jQuery('#users_online ul').html('');
jQuery.each(retorno.users, function(i, user){
var incluir = '<li id="'+user.id+'"><div class="imgSmall"><img src="'+user.foto+'" border="0"/></div>';
incluir += '<a href="#" id="'+userOnline+':'+user.id+'" class="comecar">'+user.nome+'</a>';
incluir += '<span id="'+user.id+'" class="status '+user.status+'"></span></li>';
jQuery('span#'+user.id).attr('class', 'status-lista '+user.status);
jQuery('#users_online ul').append(incluir);
});
}else if(retorno.status == 'erro'){
alert('Ficamos confusos, atualize a pagina');
}
},
});
}
verifica(0,0,userOnline);
});
历史 PHP 文件:
<?php
if(isset($_POST['conversacom'])){
include_once "../defines.php";
require_once('../classes/BD.class.php');
BD::conn();
$mensagens = array();
$id_conversa = (int)$_POST['conversacom'];
$online = (int)$_POST['online'];
$pegaConversas = BD::conn()->prepare("SELECT * FROM `mensagens` WHERE (`id_de` = ? AND `id_para` = ?) OR (`id_de` = ? AND `id_para` = ?) ORDER BY `id` DESC LIMIT 10");
$pegaConversas->execute(array($online, $id_conversa, $id_conversa, $online));
while($row = $pegaConversas->fetch()){
$fotouser = '';
if($online == $row['id_de']){
$janela_de = $row['id_para'];
}elseif($online == $row['id_para']){
$janela_de = $row['id_de'];
$pegaFoto = BD::conn()->prepare("SELECT `photo` FROM `mls_users` WHERE `id` = '$row[id_de]'");
$pegaFoto->execute();
while($usr = $pegaFoto->fetch()){
$fotouser = ($usr['photo'] == '') ? 'default.jpg' : $usr['photo'];
}
}
$emotions = array(':)', ':@', '8)', ':D', ':3', ':(', ';)');
$imgs = array(
'<img src="emotions/nice.png" width="14"/>',
'<img src="emotions/angry.png" width="14"/>',
'<img src="emotions/cool.png" width="14"/>',
'<img src="emotions/happy.png" width="14"/>',
'<img src="emotions/ooh.png" width="14"/>',
'<img src="emotions/sad.png" width="14"/>',
'<img src="emotions/right.png" width="14"/>'
);
$msg = str_replace($emotions, $imgs, $row['mensagem']);
$mensagens[] = array(
'id' => $row['id'],
'mensagem' => utf8_encode($msg),
'fotoUser' => $fotouser,
'id_de' => $row['id_de'],
'id_para' => $row['id_para'],
'janela_de' => $janela_de
);
}
die( json_encode($mensagens) );
}
?>
提交 PHP 文件:
<?php
if(isset($_POST['mensagem'])){
include_once "../defines.php";
require_once('../classes/BD.class.php');
BD::conn();
$mensagem = utf8_decode( strip_tags(trim(filter_input(INPUT_POST, 'mensagem', FILTER_SANITIZE_STRING))) );
$de = (int)$_POST['de'];
$para = (int)$_POST['para'];
if($mensagem != ''){
$insert = BD::conn()->prepare("INSERT INTO `mensagens` (id_de, id_para, mensagem, time, lido) VALUES (?,?,?,?,?)");
$arrayInsert = array($de, $para, $mensagem, time(), 0);
if($insert->execute($arrayInsert)){
echo 'ok';
}else{
echo 'no';
}
}
}
?>
流式 PHP 文件:
<?php
if(isset($_GET)){
include_once "../defines.php";
require_once('../classes/BD.class.php');
BD::conn();
$userOnline = (int)$_GET['user'];
$timestamp = ($_GET['timestamp'] == 0) ? time() : strip_tags(trim($_GET['timestamp']));
$lastid = (isset($_GET['lastid']) && !empty($_GET['lastid'])) ? $_GET['lastid'] : 0;
$usersOn = array();
$agora = date('Y-m-d H:i:s');
$expira = date('Y-m-d H:i:s', strtotime('+1 min'));
$upOnline = BD::conn()->prepare("UPDATE `mls_users` SET `limite` = ? WHERE `id` = ?");
$upOnline->execute(array($expira, $userOnline));
$pegaOnline = BD::conn()->prepare("SELECT * FROM `mls_users` WHERE `id` != '$userOnline' ORDER BY `id` DESC");
$pegaOnline->execute();
while($onlines = $pegaOnline->fetch()){
$photo = ($onlines['photo'] == '') ? 'default.jpg' : $onlines['photo'];
$blocks = explode(',', $onlines['blocks']);
if(!in_array($userOnline, $blocks)){
if($agora >= $onlines['limite']){
$usersOn[] = array('id' => $onlines['id'], 'nome' => utf8_encode($onlines['username']), 'foto' => $photo, 'status' => 'off');
}else{
$usersOn[] = array('id' => $onlines['id'], 'nome' => utf8_encode($onlines['username']), 'foto' => $photo, 'status' => 'on');
}
}
}
if(empty($timestamp)){
die(json_encode(array('status' => 'erro')));
}
$tempoGasto = 0;
$lastidQuery = '';
if(!empty($lastid)){
$lastidQuery = ' AND `id` > '.$lastid;
}
if($_GET['timestamp'] == 0){
$verifica = BD::conn()->prepare("SELECT * FROM `mensagens` WHERE `lido` = 0 ORDER BY `id` DESC");
}else{
$verifica = BD::conn()->prepare("SELECT * FROM `mensagens` WHERE `time` >= $timestamp".$lastidQuery." AND `lido` = 0 ORDER BY `id`DESC");
}
$verifica->execute();
$resultados = $verifica->rowCount();
if($resultados <= 0){
while($resultados <= 0){
if($resultados <= 0){
//durar 30 segundos verificando
if($tempoGasto >= 30){
die(json_encode(array('status' => 'vazio', 'lastid' => 0, 'timestamp' => time(), 'users' => $usersOn)));
exit;
}
//descansar o script por um segundo
sleep(1);
$verifica = BD::conn()->prepare("SELECT * FROM `mensagens` WHERE `time` >= $timestamp".$lastidQuery." AND `lido` = 0 ORDER BY `id`DESC");
$verifica->execute();
$resultados = $verifica->rowCount();
$tempoGasto += 1;
}
}
}
$novasMensagens = array();
if($resultados >= 1){
$emotions = array(':)', ':@', '8)', ':D', ':3', ':(', ';)');
$imgs = array(
'<img src="emotions/nice.png" width="14"/>',
'<img src="emotions/angry.png" width="14"/>',
'<img src="emotions/cool.png" width="14"/>',
'<img src="emotions/happy.png" width="14"/>',
'<img src="emotions/ooh.png" width="14"/>',
'<img src="emotions/sad.png" width="14"/>',
'<img src="emotions/right.png" width="14"/>'
);
while($row = $verifica->fetch()){
$fotouser = '';
$janela_de = 0;
if($userOnline == $row['id_de']){
$janela_de = $row['id_para'];
}elseif($userOnline == $row['id_para']){
$janela_de = $row['id_de'];
$pegaUsr = BD::conn()->prepare("SELECT `photo` FROM `mls_users` WHERE `id` = '$row[id_de]'");
$pegaUsr->execute();
while($usr = $pegaUsr->fetch()){
$fotouser = ($usr['photo'] == '') ? 'default.jpg' : $usr['photo'];
}
}
$msg = str_replace($emotions, $imgs, $row['mensagem']);
$novasMensagens[] = array(
'id' => $row['id'],
'mensagem' => utf8_encode($msg),
'fotouser' => $fotouser,
'id_de' => $row['id_de'],
'id_para' => $row['id_para'],
'janela_de' => $janela_de
);
}
}
$ultimaMsg = end($novasMensagens);
$ultimoId = $ultimaMsg['id'];
die(json_encode(array('status' => 'resultados', 'timestamp' => time(), 'lastid' => $ultimoId, 'dados' => $novasMensagens, 'users' => $usersOn)));
}
?>
最佳答案
jQuery.ajax({
type: 'POST',
url: 'sys/submit.php',
data: {mensagem: texto, de: userOnline, para: para},
success: function(retorno){
if(retorno = 'ok'){
jQuery('.msg').val('');
}else{
alert("Ocorreu um erro ao enviar a mensagem");
}
}
});
}
});
关于javascript - Jquery/Php 聊天脚本和我有一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37407017/
我想知道 gmail 聊天如何允许用户连接到 AIM,然后像登录到 AIM 一样聊天。 做起来容易吗?怎么做到的? 有人知道任何类似的开源工具吗? 谢谢! 最佳答案 如果你在谈论编程,这里是源代码示例
大家好,我正在尝试制作一个游戏,两个主持人联系起来,他们将“掷硬币”,并确定谁先出局。我决定从基本代码开始。但是我真的没有主意。 Thread server2 = new Thread(new Ser
我已经创建了一个只有 1 个房间的聊天室、私有(private)消息、审核以及一切,现在一切都很好!当我测试聊天时,我意识到在聊天中输入的所有消息都会被保存,如果有很多人使用聊天,它很快就会占用 Fi
当用户键入内容并出现软键盘时,我必须保持聊天回收器 View 的当前项目可见。目前,它覆盖了聊天,我需要回收器 View 项目与键盘一起显示。 我在 list 中尝试了这些: -android:win
我有一个服务器客户端应用程序集。 (家庭作业) 到目前为止,我已经弄清楚如何让多个客户端连接到服务器并让服务器聚合客户端发送的消息,以及如何让服务器将客户端的消息发送回客户端并将其显示在聊天 Pane
如何从我的应用程序发送/接收 Facebook 聊天消息?它是用 .Net、C# 编写的。 最佳答案 如果你可以使用 C,你就可以使用 libpurple (GPL) 和 pidgin-faceboo
我正在使用启用的 Ajax-Wcf 服务开发 Asp.Net 聊天。这是一个非常简单的聊天引擎,其中消息对话框意味着一对一(单个用户),但是我不知道如何管理(以最佳方式)通知新消息可用性。例如,假设有
我的任务是通过服务器构建一个客户端到客户端的聊天程序。客户端 A 将向服务器发送一条消息,然后服务器将消息转发给客户端 B,反之亦然。所有这一切都将同时发生,直到其中一个将其关闭。我有以下程序。 服务
我创建了一个聊天,用户可以在其中输入文本的输入字段。当他输入文本并按下发送(或输入)时,文本位于输入字段上方。像这样: 我想要的:我希望输入字段位于页面底部。我使用 position: absolut
出于个人兴趣,我尝试定义一个模拟 AI,它基于他学到的信息和互联网搜索,以便提供比系统知道的更多的细节。 我举了一个 child 的例子,当他出生时他需要学习一切,他听到了很多然后提出了一些答案。他的
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 3年前关闭。 Improve this qu
我已经开始聊天了,但我已经将用户的 ID 硬编码到 Chat.php 中。 当他们登录站点时,我的登录名将他们的电子邮件设置为 session ( $_SESSION['email']=$email;
当用户点击像 Start a viber chat with us 这样的链接时,我试图找到一种方法来开始 viber 聊天。但到目前为止我没有找到正确的URI来做到这一点。例如,我知道我可以使用 s
我是 Javascript(纯 javascript)新手,我正在尝试创建一个执行以下操作的聊天 Controller 应用程序。 用户输入内容。 有人对我的知识库进行了后调用。 服务器响应消息。 目
已关闭。这个问题是 not about programming or software development 。目前不接受答案。 这个问题似乎不是关于 a specific programming
如果用户在 x 秒/分钟内处于非事件状态,我想结束聊天,以便我们的代理不必等待聊天自行关闭。我还想在结束聊天之前将标签附加到聊天中,以便我可以看到这是由于不活动造成的。 最佳答案 此内容归功于 j
我正在此网站中构建新网站,客户需要 24/7 实时客户支持。我想在网站上集成 Skype 聊天 聊天界面应该在客户端的网站上。 最佳答案 您可以通过在网站上放置 Skype 按钮来使用它。 http:
事实上,我只是开始积极练习 swing,以便我的理论知识能派上用场:) 我已经为聊天 GUI 实现做了很多工作,但最终遇到了一些问题。所以我决定从头开始重新设计聊天 GUI,但我需要为其选择正确的组件
已关闭。这个问题是 not about programming or software development 。目前不接受答案。 这个问题似乎不是关于 a specific programming
我正在尝试进行简单的聊天,其中连接到服务器的用户发送消息,其他用户接收消息。 这是我的 html: function setupEventSource()
我是一名优秀的程序员,十分优秀!