【问题标题】:problem bulding a public chatroom using Javascript,AJAX,PHP,MySql使用 Javascript、AJAX、PHP、MySql 构建公共聊天室的问题
【发布时间】:2019-11-20 04:33:15
【问题描述】:

所以我正在尝试使用 AJAX 创建一个公共聊天应用程序。我希望它工作的方式是:用户在文本区域中键入内容并单击“发送”按钮,AJAX 会将此消息发布到 php 文件中,然后将该消息保存在数据库中。在同一页面上还有一个带来消息的 GET 请求,由另一个 PHP 脚本组织并将它们写入“屏幕”div。我已经为此工作了一周,我发现的所有 ajax 教程都有两个问题:

1:他们使用 jQuery,我正在学习 Javascript,还不想学习 jQuery,所以我的代码是纯 JS,我也不想仅仅因为它的 AJAX 类而导入整个库 2:他们只解释了如何对静态 URL 或 txt 文件进行简单的 GET/POST 请求,而我需要刷新内容而无需重新加载,因为它是一个聊天室。

因此,经过几天又几天的头撞墙,我得出的结论是,在这里问我的问题是唯一的解决方案。我已经添加了尽可能多的 cmets,我还在这里分别包含了 PHP、JS、HTML 代码。我正好有 3 个问题:

1:我怎样才能每 5 秒刷新一次 div,我知道如何使用 jQuery 来做到这一点,但我还是需要 vanilla JS。 我尝试像这样将第 24 行更改为第 29 行:http.onload = setInterval(function(){...},5000);但是尽管 div 确实刷新了,但我看到的唯一消息是“未定义”,我不知道是什么原因造成的。 2:我发送消息的 POST 请求在 Javascript 点击事件监听器中的函数内不起作用,我点击发送按钮,在开发工具的网络选项卡中没有任何反应我看到 get.php 响应通常属于到 GET 请求但没有 POST 请求。 3:我的聊天室的架构还可以吗,还是你建议一个更好、更高效的? 谢谢你! 这是我的 HTML:

<!DOCTYPE HTML>
<html lang = "en">
<head>
  <title>Chat</title>
  <meta charset = "UTF-8" />
</head>
<body>
    <a href="logout.php">log out</a>
    <!-- this is the div i want the messages from the other users to be displayed in-->
    <div id="screen">
    </div>

     <!-- this is the text area where the user will type their message -->
        <form method="POST">
        <textarea name="room" id="room" cols="100" rows="10">
        </textarea>
     <!-- this is the send button-->
        <input type="submit" value="send" name="send" id="send">
      </form>

这是我的 JS:

<script>
     // show old messages from the user & other users
     var old = new XMLHttpRequest();
     old.open("GET" , "get.php" , true);
     old.onload = function display()
     {
       var screen = document.getElementById('screen');
       // im using inner html so i can edit the message's font/color etc in php
       screen.innerHTML = this.responseText;
     }
     old.send();
       // bind the value of the text area to a variable
    var data = document.getElementById("room").value;
    var send = document.getElementById('send');
    //  i want the message to be sent only fter the button is pressed
    send.addEventListener("click" , send);
    function send() {


    var http = new XMLHttpRequest();
    http.open("POST" , "chat.php" , true);
    // perhaps the problem is that i am choosing a wrong header here?
    http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    http.onload = function()
    {
      if(http.readyState == 4 && http.status == 200)
      {   
          console.log('ok');
      }
    }
    http.send({message: data});
}



</script>

如果你们需要我的 PHP,我也可以发送我的两个 PHP 文件(get.php 和 chat.php)。

【问题讨论】:

  • 作为一个经验丰富的 webdev,我强烈建议你引入 jQuery,即使只是为了那些 AJAX 调用,它真的不需要学习,而且会让你头疼。通过不将它用于一些简单的事情,您将专注于 Web 开发的细节,当您尝试建立一个快速聊天室并学习一些现在对您没有真正帮助时其他概念。
  • 谢谢你,我正在构建这些项目来学习,因为这是我的爱好,所以我不介意构建它们是否需要时间,如果我曾经为一家公司工作,我肯定会使用最快的方法但现在我正在学习 javascript

标签: javascript php html ajax


【解决方案1】:

我很欣赏并鼓励你对 vanilla Javascript 的追求,因为我看到你想学习,所以我不会在这里给你所有的代码。

  1. send 函数不工作,因为你有冲突 变量。您的var send = document.getElementById('send'); 和 你的功能send。由于您正在学习,我还建议使用更有意义且不那么通用的名称。这也是为了防止将来发生变量/函数或保留关键字的冲突,尤其是在团队中编码时。而不是 getsendget.php 等。尝试使用骆驼格式的 sendchatmessage()getallmessages() 或然而_you_like_best。

  2. 1234563然而。
  3. setInterval 应该可以工作,但我会留给您了解如何使用它。一些提示。它将一个 id 返回给计时器,您应该在需要时存储和清除它。您可以将您的get old 代码重构为一个函数,以便您可以在setInterval 中使用它来重复调用它。 https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setInterval

  4. 这不是最佳架构,因为您不断地以低速率轮询服务器。因此,发送消息的用户可能会在 5 秒后看到他/她自己的消息。如果聊天不是经常使用并且它什么都没有轮询,那么它也会对资源造成压力。似乎您并没有添加到 div 中,而是返回了整个历史记录(我从您的代码结构中猜测),这意味着数据开销会越来越大。您可以探索 Web Sockets 作为此轮询问题的解决方案。或者,您可以想办法最小化这个问题,例如。立即将用户发送的消息直接添加到 screen 中,返回一个 id 以及仅新消息,以便您可以使用 javascript 跟踪订单和重复项,从而减少数据负载。

希望这会有所帮助!玩得开心,祝你好运!

【讨论】:

  • 非常感谢您的帮助!我计划在完成这个项目后学习 web sockets xD
  • 我也遇到了另一个问题,你看到我确实更改了元素名称和函数名称,但是即使现在当我点击发送按钮时,chat.php 也会在网络选项卡上出现一毫秒消失了,我没有得到 console.log(),你认为是什么问题?编辑:问题是我使用的是在 AJAX 完成之前刷新页面的 POST 表单,将按钮从提交更改为普通按钮解决了问题:D
  • 很高兴您自己解决了这个问题!玩得开心!
  • 我有最后一个问题,我希望你能回答我 xD 你看到我遇到的最后一个问题是我不知道如何正确发送数据。尽我所能发现,人们总是发送硬编码信息,但我试图发送一个变量,所以在我的代码中我有 var data = document.getElementById("room").value;我必须以某种方式把它放在我的 http.send() 中,这样我就会在我的 php 中有某种形式的键值对,这样我就可以使用 $_POST ['key'] 访问它。我尝试创建一个对象,对其进行字符串化并发送无济于事,我也不知道如何在表单数据中传递变量xD
  • 您应该开始一个新问题,因为这是一个不同的主题,每个人都可以通过一些代码示例更好地帮助您。但是,这将是一个重复的问题,因为有很多关于堆栈溢出的示例。您可以查看这个并将其调整为您自己的用途。 stackoverflow.com/questions/55676972/…多个参数,用&分隔
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 2011-05-30
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 2011-07-12
相关资源
最近更新 更多