ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(六) 之 Layim源码改造右键菜单--好友、组管理功能的实现。
前言
上一篇中讲解了加好友的流程,本篇将介绍好友管理,群组管理的右键菜单功能。当然由于菜单项目太多,都实现也得花费时间。只讲解一下我是如何从不知道怎么实现右键菜单到会自定义菜单的一个过程。另外呢,针对菜单:发送即时消息这个原本在Laim中已经有的功能做出实现,其他的方法,只要按照业务逻辑一一实现即可。
演示
用户信息右键菜单:

好友分组信息右键菜单:

群组信息右键菜单:

思路讲解
首先呢,Layim中针对历史消息这个栏有两个菜单项,清空和删除某一条,这是源代码中已经有的,当我看到这段代码的时候,那么实现其他的右键菜单就有戏了。

首先可以看到,增加右键菜单的方式就是给元素添加contextmenu事件,然后弹出右键菜单层就是强大的layer的工作了。由于我前端也不是很6,所以,代码照抄。加上自己的菜单,如果想加前边的图标,那么增加相应的html即可。下面我们把好友的右键菜单加上。
//好友右键菜单
layimMain.find('.layim-list-friend').on('contextmenu', '.layui-layim-list li', function (e) {
var othis = $(this);
var id = othis[0].id;
var html = '<ul id="contextmenu_' + othis[0].id + '" data-id="' + othis[0].id + '" data-index="' + othis.data('index') + '">';
html += '<li layim-event="menu_chat"><i class="layui-icon" ></i>' + space_icon + '发送即时消息</li>';
html += '<li layim-event="menu_profile"><i class="layui-icon"></i>' + space_icon + '查看资料</li>';
html += '<li layim-event="menu_history"><i class="layui-icon" ></i>' + space_icon + '消息记录</li>';
html += '<li layim-event="menu_nomsg">' + space_no_icon + '屏蔽消息</li>';
html += '<li layim-event="menu_delete">' + space_no_icon + '删除好友</li>';
html += '<li layim-event="menu_moveto">' + space_no_icon + '移动至</li></ul>';
if (othis.hasClass('layim-null')) return;
//注意一下这个方法
showtips(html, this, id, 0, 0);
//showtips(html, this, id, 160, 25); });
大家可以看到,事件是加在 layim-list-friend 下边的 layui-layim-ist 上的,有的同学会问,你怎么知道加在这里。我也不知道,右键查看元素,看一下代码就知道了。其实前端不管代码如何写的天花乱坠,最后总会生成html的。我们想加什么功能,一定要了解相应的html的结构。比如,给每个菜单添加事件怎么办呢。很简单,layim代码开头已经写明了注册事件的方法:
$('body').on('click', '*[layim-event]', function(e){
var othis = $(this), methid = othis.attr('layim-event');
events[methid] ? events[methid].call(this, othis, e) : '';
});
没错,就是上边这三行万能的代码,其实我并不知道其中的原理,尤其是第三行call方法。但是我知道,这么写一定能调用相应的方法。于是在events后在增加各种右键菜单的方法:

在看效果之前呢,我们先回到前前一段代码(注意一下这个方法部分)。就是showtips方法。当我们在后两个参数传0 0 的时候,效果是这样的:

看起来有点不舒服,所以我就想把这个弹层往右下方移动一点,可是layer.tips我也不能去动他,于是我的思路就是,当这个弹层初始化完毕之后,强行更改他的位置。于是我在layer.tips 的方法回调中增加resetposition方法(t=top,l=left)

那么到这里你应该知道这个resetposition做了什么事了吧。就是一个简单的修改top和left值

修改完成之后,就会看到我们演示中的样子了。不过,这里有个bug没改,就是当我们的好友在好友列表的最下方,已经接近电脑屏幕底端了。如果在往下移动的话,菜单会看不见,所以,小伙伴们做的时候要注意当前菜单的位置和高度,来动态进行top调整。
实战效果
做完上边的工作之后,我们运行程序,点击右键试试。


可以看到事件已经成功触发了,所以对应菜单我们只要实现相应的效果即可。下面我们做一下发送即时消息对接功能。源代码中已经有 chat方法,方法参数有个 othis。我们只要关心这个othis是什么,然后在 menu_chat方法中调用chat就可以了。查看一下源代码,很惊喜的发现原来这个othis在我们右键菜单打开之前,我们就获取到了,就是这个东西:
layimMain.find('.layim-list-friend').on('contextmenu', '.layui-layim-list li', function (e) {
var othis = $(this);
我的做法的就是加layim中的全局变量,将这个othis先保存起来,然后在menu_chat中调用。
, menu_chat: function () {
//打开聊天窗口
events.chat(global.othis);
//关闭右键菜单
layer.closeAll('tips');
},
搞定othis参数之后,我们在重新点击右键,发送即时消息,成功打开聊天窗口。
OK,小伙伴们,剩下的菜单功能就交给你们啦。
总结
其实好多小伙伴们觉得自己想加一个功能又没有思路,其实我们多读一读源代码,照着葫芦画瓢也会发现意想不到的惊喜。通过阅读layim源代码我学了很多平时压根想不到的东西。js这玩意还是挺神奇的,当然对于一个后端工程师来说。今天的右键菜单就讲到这里了。
下篇预告:【中级】ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(七) 之 历史记录查询(时间,关键字,图片,文件),关键字高亮显示。
想要学习的小伙伴,可以关注我的博客哦,我的QQ:645857874,Email:fanpan26@126.com
GitHub:https://github.com/fanpan26/LayIM_NetClient/
ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(六) 之 Layim源码改造右键菜单--好友、组管理功能的实现。的更多相关文章
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室 实战系列
ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言 http://www.cnblogs.com/panzi/p/5742089.html ASP.NET S ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十二) 代码重构使用反射工厂解耦(一)缓存切换
前言 上一篇中,我们用了反射工厂来解除BLL和UI层耦合的问题.当然那是最简单的解决方法,再复杂一点的程序可能思路相同,但是在编程细节中需要考虑的就更多了,比如今天我在重构过程中遇到的问题.也是接下来 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言
前端时间听一个技术朋友说 LayIM 2.0 发布了,听到这个消息抓紧去官网看了一下.(http://layim.layui.com/)哎呀呀,还要购买授权[大家支持一下哦],果断买了企业版,喜欢钻研 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(一) 之 基层数据搭建,让数据活起来(数据获取)
大家好,本篇是接上一篇 ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言 ASP.NET SignalR WebIM系列第二篇.本篇会带领大家将 LayIM ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(二) 之 ChatServer搭建,连接服务器,以及注意事项。
上篇:ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(一) 之 基层数据搭建,让数据活起来(数据获取) 上一篇我们已经完成了初步界面的搭建工作,本篇将介绍IM的核心内容 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(三) 之 实现单聊,群聊,发送图片,文件。
上篇讲解了如何搭建聊天服务器,以及客户端js怎么和layui的语法配合.服务器已经连接上了,那么聊天还会远吗? 进入正题,正如上一篇提到的我们用 Client.Group(groupId)的方法向客户 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(四) 之 用户搜索(Elasticsearch),加好友流程(1)。
前面几篇基本已经实现了大部分即时通讯功能:聊天,群聊,发送文件,图片,消息.不过这些业务都是比较粗犷的.下面我们就把业务细化,之前用的是死数据,那我们就从加好友开始吧.加好友,首先你得知道你要加谁.L ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(五) 之 加好友,加群流程,消息管理和即时消息提示的实现
前言 前前一篇留了个小问题,在上一篇中忘了写了,就是关于LayIM已经封装好的上传文件或者图片的问题.对接好接口之后,如果上传速度慢,界面就会出现假死情况,虽然文件正在上传.于是我就简单做了个图标替代 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(七) 之 历史记录查询(时间,关键字,图片,文件),关键字高亮显示。
前言 上一篇讲解了如何自定义右键菜单,都是前端的内容,本篇内容就一个:查询.聊天历史纪录查询,在之前介绍查找好友的那篇博客里已经提到过 Elasticsearch,今天它又要上场了.对于Elastic ...
随机推荐
- Javascript包含对象的数组去重
Array.prototype.clearRepeat = function(){ var result = [], obj = {}; for(var i = 0; i < this.leng ...
- Redis学习笔记十:独立功能之监视器
通过执行 monitor 命令可以让客户端自己变成一个监视器,实时接收并打印当前处理的命令请求的相关信息. 127.0.0.1:6379> monitor OK 1451752646.83727 ...
- PowerDesigner的使用(一)
一. PowerDesigner 功能 1. 需求管理:记录需求,分析设计模型 2. 生成文档:生成HTML格式文档,方便沟通. 3. 影响度分析:模型之间连接起来,同步修改功能. 4. 数据映射:提 ...
- ducument.ready不生效的问题 ruby on rails
rails web app页面之间的跳转的时候使用ducument.ready只有在再次加载的时候才生效, 因为rails用了turbolinks, https://github.com/turbol ...
- 关于tableView的错误提示
WARNING: Using legacy cell layout due to delegate implementation of tableView:accessoryTypeForRowWit ...
- word20161128
1. accordion 英[əˈkɔ:diən] 美[əˈkɔ:rdiən] n.手风琴; adj.可折叠的; [例句]Where some people learned to play the a ...
- Linux的五个查找命令
1. find find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件. find的使用格式如下: $ find <指定目录> <指定条件> <指定动作> ...
- 剑指Offer 顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...
- gulp学习笔记1-定义
1.gulp是前端开发过程中对代码进行构建的自动化工具,可以通过它提供的各种插件实现如:预编译(sass&less).压缩.合并.图片精灵等前端的重复操作 2.基于nodeJS,以js编写插件 ...
- (原创)用Receiver和SystemService监听网络状态,注册Receiver的两种方式
android中网络编程不可避免地要监听网络状态,wifi或者3G以及以太网,并根据当前状态做出相应决策. 在MyReceiver类中的onReceive方法中获得系统服务 ConnectivityM ...