【问题标题】:how to make a chat box like facebook using ajax, jquery and php如何使用 ajax、jquery 和 php 制作像 facebook 这样的聊天框
【发布时间】:2014-01-16 03:29:08
【问题描述】:

看到我已经制作了几乎只有 2 个问题的聊天框。我不知道如何解决它们。我正在尝试无望的方法来使其正确,但它只是行不通。我将在下面解释我的代码... 这是显示聊天框、聊天文本区域和聊天成员的 HTML 部分。 我想要做的是左侧有一些聊天成员列表。如果我点击任何聊天成员的名字,与该人相关的聊天就会打开。也就是说,登录用户和其中一位聊天成员之间是一对一的聊天。聊天成员基本上是登录用户的恶魔。

<div id="chat_box">
</div>
<div id="input_chat">
    <input type="text" id="input_ur_chat" placeholder="Press ENTER After Writing" name="chat_msg" />
</div>
<div style="background-color:black; position:absolute; height:100%; width:25%; opacity:0.8;">
    <div id="chat_members">
<p id='1' class='chat_members_list'>anurag</p>
<p id='2' class='chat_members_list'>golu</p>
<p id='3' class='chat_members_list'>akash</p>
    </div>
</div>

在 div chat_members 中,id 表示该人的用户 ID,它是用于在数据库中唯一标识该用户的属性值。

现在我的聊天框的ajax和jquery代码如下:

<script>
$(document).ready(function()
{
    $('.chat_members_list').click(function()
    {
        var chatmember = $(this).attr('id');
        var iusername = "<?php echo $usname; ?>"; //the current logged in user
        //alert(chatmember);
        $(".chat_members_list").css("color","white");
        $("#" + chatmember).css("color","lightskyblue");
        load_data = {'fetch':1, 'username1':iusername, 'receivername1':chatmember};
        $("#chat_box").html("<img src='images/loader3.gif' />loading...");
        window.setInterval(function()
        {
            $.post('shout.php', load_data, function(data)
            {
                $('#chat_box').html(data);
                var scrolltoh = $('#chat_box')[0].scrollHeight;
                $('#chat_box').scrollTop(scrolltoh);
            });
        }, 1000);

        //method to trigger when user hits enter key
        $("#input_ur_chat").keyup(function(evt)
        {
            if(evt.keyCode == 13)
            {
                var imessage = $('#input_ur_chat').val();
                alert(iusername);
                alert(imessage);
                alert(chatmember);
                post_data = {'username':iusername, 'message':imessage, 'receivername':chatmember};

                //send data to "shout.php" using jQuery $.post()
                $.post('shout.php', post_data, function(data)
                {

                    //append data into messagebox with jQuery fade effect!
                    $(data).hide().appendTo('#chat_box').fadeIn();

                    //keep scrolled to bottom of chat!
                    var scrolltoh = $('#chat_box')[0].scrollHeight;
                    $('#chat_box').scrollTop(scrolltoh);

                    //reset value of message box
                    $('#input_ur_chat').val('');

                }).fail(function(err)
                { 

                    //alert HTTP server error
                    alert(err.statusText); 
                });
            }
        });
    });
});

这是我的 php 代码,

<?php
session_start();
$usname=$_SESSION['username'];
$db_username = 'root';
$db_password = '*********';
$db_name = 'anurag';
$db_host = 'localhost';
if($_POST)
{
$sql_con = mysqli_connect($db_host, $db_username, $db_password,$db_name)or die('could not connect to database');

//check if its an ajax request, exit if not
if(!isset($_SERVER['HTTP_X_REQUESTED_WITH']) AND strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest') {
    die();
} 

if(isset($_POST["message"]) &&  strlen($_POST["message"])>0)
{
    //sanitize user name and message received from chat box
    //You can replace username with registerd username, if only registered users are allowed.
    $username = filter_var(trim($_POST["username"]),FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);
    $message = filter_var(trim($_POST["message"]),FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);
    $user_ip = $_SERVER['REMOTE_ADDR'];
    $r_msg = $_POST['receivername'];
    $result1 = mysqli_query($sql_con,"SELECT uid FROM members WHERE username='$usname' ");
    $row1=mysqli_fetch_array($result1);
    $asd=$row1['uid'];
    //insert new message in db
    if(mysqli_query($sql_con,"INSERT INTO friends_chat values('$asd','$r_msg','$message',NOW())"))
    {
        $msg_time = date('h:i A M d',time()); // current time
        echo '<div class="shout_msg"><time>'.$msg_time.'</time><span class="username">'.$username.'</span><span class="message">'.$message.'</span></div>';
    }
}
elseif($_POST["fetch"]==1)
{
    $username1 = filter_var(trim($_POST["username1"]),FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);
    $r_msg1 = $_POST['receivername1'];
    $result12 = mysqli_query($sql_con,"SELECT uid FROM members WHERE username='$usname' ");
    $row12=mysqli_fetch_array($result12);
    $asd1=$row12['uid'];
    $results = mysqli_query($sql_con,"SELECT s_msg,r_msg,message,time_msg
                            FROM friends_chat
                            WHERE s_msg='$asd1'
                            AND r_msg='$r_msg1'
                            ");
    while($row = mysqli_fetch_array($results))
    {
        $msg_time1 = date('h:i A M d',strtotime($row["time_msg"])); //message posted time
        echo '<div class="shout_msg1"><time>'.$msg_time1.' : '.'</time><span class="username1">'.$row["s_msg"].' := '.'</span> <span class="message1">'.$row["message"].'</span></div>';
    }
}
else
{
    header('HTTP/1.1 500 Are you kiddin me?');
    exit();


}
}
?>

现在我会告诉你我的问题。

首先,当我点击一个聊天成员时,与该成员相关的聊天正在打开。当我在输入字段中输入任何值时,只插入一行。即使刷新页面并再次尝试,也只有一行插入。问题可能是脚本开始时的点击事件。因为只有当点击事件发生时才会启动 ajax 请求。这就是问题。我只想为每个成员单击一次事件,然后他们可以聊天。还有一个问题是,当我刷新页面并再次开始与具有该单击事件的成员之一聊天时,因为在刷新之前插入了 1 行,因此没有插入新行。我不知道这个问题的根源。 我希望你现在明白我的问题。如果您需要更多信息,请告诉我并帮助我。

【问题讨论】:

    标签: javascript php jquery ajax


    【解决方案1】:

    我认为keyup事件应该和click事件分开。 这应该是一个单独的事件

    $('.chat_members_list').click(function(){
        //code
    });
    

    虽然这也应该是一个单独的事件

    $("#input_ur_chat").keyup(function(evt){
        //code
    });
    

    【讨论】:

      【解决方案2】:

      您可能想查看套接字,例如 Socket.js。这有点困难,但这就是你要找的。套接字有点复杂,但速度非常快。您可以为此使用 AJAX,但 AJAX 与套接字相比非常慢。

      onMessage 事件中,您将消息广播给所有连接的用户,并使用 onConnectonDisconnect您向所有人广播已连接用户的列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-29
        • 1970-01-01
        • 2012-03-29
        • 1970-01-01
        相关资源
        最近更新 更多