Django项目笔记(六)——聊天功能的实现

Django上课笔记(六)——聊天功能的实现

也欢迎大家光临我另外项目课的其他博客:

Django上课笔记(一)——环境配置与项目创建(过程十分详细) - AcWing

(更新版)Django上课笔记(二)——菜单模块的实现, 含自动创建项目的脚本

Django上课笔记(三)——简单游戏的实现(模块拆分化详解) - AcWing

Django上课笔记(四)——(用户系统的实现) - AcWing

pycharm连接服务器同步写代码(图文详细过程)

linux基础课thrift详细开发过程 - AcWing

项目地址

https://git.acwing.com/codeRokie/acapp

解决之前的一些小bug

1.改变监听对象

之前大家在调试的时候应该也遇到这种情况:在一个页面放3个acapp时,按下键盘,三个窗口都有响应

这是因为我们之前监听键盘事件的对象是window,即整个浏览器窗口内。

我们应该把监听对象改为画布

game/static/js/src/playground/player/zbase.js中:将$(window).keydown改为

this.playground.game_map.$canvas.keydown

2.让canvas可以监听输入事件

2.1.给canvas绑定一个属性:

static/js/src/playground/game_map/zbase.js中:

this.$canvas = $(`<canvas tabindex=0></canvas>`);

2.2.为了能够让canvas获取输入信息,我们要将其聚焦:

static/js/src/playground/game_map/zbase.js中:

    start() {
        this.$canvas.focus();
    }

聊天框的实现

实现一个聊天框类

static/js/src/playground/chat_field/zbase.js下:

y总课上源代码

模块详解

视图部分

聊天框组件是由输入区域

this.$input = $(`<input type="text" class="ac-game-chat-field-input">`);

信息展示区域

this.$history = $(`<div class="ac-game-chat-field-history">历史记录</div>`);

组成。

实现按回车呼出聊天框
  1. 初始化时先将输入框隐藏
  2. 监听键盘事件,当用户按下回车时,显示输入框并聚焦
  3. 监听键盘事件,当用户按esc时,隐藏输入框,输入框并聚焦地图

game/static/js/src/playground/player/zbase.jsadd_listening_events()中实现对聊天模块的调用

if (e.which === 13) {  // enter
  if (outer.playground.mode === "multi mode") {
    // 打开聊天框
    outer.playground.chat_field.show_input();
    return false;
  }
} else if (e.which === 27) {  // esc
  if (outer.playground.mode === "multi mode") {
    // 关闭聊天框
    outer.playground.chat_field.hide_input();
  }
}
输入后按回车发送
  1. 保存聊天输入框的输入的信息
  2. 监听聊天输入框的键盘事件,按下回车后新建一个div元素把刚才输入的信息渲染到div中,并把div渲染到信息展示区域

game/static/js/src/playground/chat_fild/zbase.jsadd_listening_events()

add_listening_events() {
  let outer = this;

  this.$input.keydown(function (e) {
    if (e.which === 27) {  // ESC
      outer.hide_input();
      return false;
    } else if (e.which === 13) {  // ENTER
      //获取输入区域输入的内容
      let text = outer.$input.val();
      if (text) {
        let username = outer.playground.root.settings.username;
        //先清空输入框
        outer.$input.val("");
        //再把输入框中的消息展示到信息展示区
        outer.add_message(username, text);
        outer.playground.mps.send_message(username, text);
      }else {
        outer.hide_input();
        return false;
      }
      return false;
    }
  });
}

让信息可以从上到下依次渲染

add_message(username, text) {
this.show_history();
let message = `[${username}]${text}`;
this.$history.append(this.render_message(message));
this.$history.scrollTop(this.$history[0].scrollHeight);
}
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值