zoukankan      html  css  js  c++  java
  • html 富文本编辑器相关--中文状态下输入@的问题

    如何支持输入@可以【@群内人】的功能?

    常规思路是   监听keydown 事件  的shift+2

        document.getElementById('input-content').addEventListener('keydown', function (e) {
            if (CHATOBJ.groupType != 2) {//不是群消息
                return;
            }
            //if (e.keyCode === 16) return;
            console.log('没有弹出联系人?:',e);
            if (e.shiftKey && e.keyCode == 50) {//是@
                console.log('开始搜索:',e);
                aiteObj.searching = aiteObj.state.SEARCHING;
                aiteObj.current_aiteId = Math.uuid();
                aiteObj.getSerchList();
                insertAite();
                aiteObj.cursorPosition = aiteObj.getCursorPosition();
                e.preventDefault();
            }
    
        });

    经试验发现这个事件(shift+2) 只是在英文状态下会触发,在中文状态下则事件不会触发,只可以触发(shift)事件。

    ------------------------------------------------------------------------------------------------------------------------------------------

    此处作为html下和中文状态深深相关关联的dom3事件  不得不提到

    compositionstartcompositionupdatecompositionend

    https://segmentfault.com/a/1190000004326310

    ----------------------------------------------------------------------------------------------------------------------------------------

    然而并没有什么卵用,以上方法只适合中文状态下输入中文,  @却不是中文,

    最后由于我们做的是客户端,有c+提供@按下事件,

    个人认为 目前纯html能力不足以解决这个问题,

    附上c+未提供事件之前的代码

    /*
     *  Created by shangkui
     *  Date:2017-04-10
     *  群@
     */
    var commonAiteObj = {
        getSerchListStr: function (list) {
            var tempItem = '';
            var ret = '';
            list.forEach(function (item) {
                var imId = item.imId;
                tempItem += '<li class="msg-aite" im-id="' + imId + '"><div>' + item['nickName'] + '</div></li>'
            });
            return ret = '<ul>' + tempItem + '</ul>';
        },
        showSerchList: function (list, position) {
            if (list.length === 0) {
                console.log('没有查找到任何人员');
                commonAiteObj.hideSerchList();
                return;
            }
            var SerchListStr = this.getSerchListStr(list);
            //console.log('群成员字符串:',SerchListStr);
            //console.log(position);
            aiteObj.$memberContainer.removeClass('hideList').html(SerchListStr);
    
            var top = aiteObj.$memberContainer.height();
            aiteObj.$memberContainer.css({
                left: position.right ,
                top: position.top - top
            });
        },
        hideSerchList: function () {
            if (aiteObj.searching == aiteObj.state.SEARCHING) {
                console.log('输入@后触发其他地方');
                aiteObj.searching = aiteObj.state.STOP;
                aiteObj.$memberContainer.addClass('hideList');
                var temp_aite = aiteObj.$inputContainer.find('#' + aiteObj.current_aiteId + '');
                var temp_aiteValue = temp_aite.html();
                console.log(temp_aiteValue);
                //temp_aite.after(temp_aiteValue);
                temp_aite.remove();
                insertImg(temp_aiteValue);
            }
        },
        serching: function () {
            console.log('searching状态:', aiteObj.searching);
            if ((aiteObj.searching === aiteObj.state.SEARCHING) && (!aiteObj.composing)) {
                var $temp_aite = aiteObj.$inputContainer.find('#' + aiteObj.current_aiteId + '');
                var temp_aiteValue = $temp_aite.html();
                var searchKey = temp_aiteValue.substring(1, temp_aiteValue.length);
                aiteObj.cursorPosition = aiteObj.getCursorPosition();
                console.log('实时搜索的内容:', searchKey);
                //console.log('zongrenshu:', aiteObj.groupMemCount);
                mainObject.searchGroupMemberWhenAT(CHATOBJ.groupId, myInfo.imUserid,searchKey,0, aiteObj.groupMemCount, function (data) {
                    //console.log('搜索', data);
                    commonAiteObj.showSerchList(data, aiteObj.cursorPosition);
                });
            }
        },
        serchItemClick: function (target) {
            var $this = $(target);
            $this.parent().parent().addClass('hideList');
            var name = $this.find('div').html();
            var imId = $this.attr('im-id');
            console.log('点击的条目:', name);
            //console.log('点击的条目:', imId);
            //var $aite_person = $('<span>'+name+'</span>');
            var $temp_aite = aiteObj.$inputContainer.find('#' + aiteObj.current_aiteId + '');
            $temp_aite[0].contentEditable = false;
            $temp_aite.attr('im-id', imId);
            $temp_aite.attr('class', 'input-msg-aite');
            $temp_aite.html('@' + name + ' ');
            aiteObj.searching = aiteObj.state.FINISH;
            return false;
        }
    
    };
    
    function AiteObj() {
        this.state = {
            STOP: 'STOP',
            SEARCHING: 'SEARCHING',
            FINISH: 'FINISH'
        };
        this.searching = this.state.STOP;
        this.current_aiteId = '';//当前编辑状态中的艾特的id
        this.$memberContainer = '';
        this.$inputContainer = '';
        this.cursorPosition = '';
        this.composing = false;
        this.groupMemCount= 0;
        this.focusState = false;
    }
    AiteObj.prototype = {
        getSerchList: function () {
            //群成员数量
            mainObject.getGroupMemberCount({'GroupId': CHATOBJ.groupId}, function (data) {
                //console.log('群成员数量:',CHATOBJ.groupId);
                console.log('群成员数量:', data);
                aiteObj.groupMemCount = data.GroupMemCount;
                if (aiteObj.groupMemCount < 0) {
                    console.error('请求群成员数量出错')
                }
                mainObject.getGroupMembers({
                    'GroupId': CHATOBJ.groupId,
                    'GroupMemberPage': 0,
                    'GroupMemberPagesize': aiteObj.groupMemCount
                });
            });
        },
        getSerchListCallback: function (list) {
            if (!(this.searching == this.state.SEARCHING)) {
                return;
            }
            commonAiteObj.showSerchList(list, aiteObj.cursorPosition);
        },
        getCursorPosition:function () {
            var aiteSpan = aiteObj.$inputContainer.find('#'+aiteObj.current_aiteId+'')[0];
            //console.log('aiteSpan,',aiteSpan);
            var aiteSpanClientRect = aiteSpan.getBoundingClientRect();
            console.log(aiteSpan);
            console.log(aiteSpanClientRect);
            return aiteSpanClientRect;
        },
        triggerSearch:function () {
    
        }
    
    };
    var aiteObj = new AiteObj();
    
    $(function () {
        aiteObj.$memberContainer = $('.acknowledMsgMemberList');
        aiteObj.$inputContainer = $('#input-content');
        /**
         * 输入@触发
         */
        document.getElementById('input-content').addEventListener('keydown', function (e) {
            if (CHATOBJ.groupType != 2) {//不是群消息
                return;
            }
            //if (e.keyCode === 16) return;
            console.log('没有弹出联系人?:',e);
            if (e.shiftKey && e.keyCode == 50) {//是@
                console.log('开始搜索:',e);
                aiteObj.searching = aiteObj.state.SEARCHING;
                aiteObj.current_aiteId = Math.uuid();
                aiteObj.getSerchList();
                insertAite();
                aiteObj.cursorPosition = aiteObj.getCursorPosition();
                e.preventDefault();
            }
    
        });
    /*    $('#input-content').on('keydown',function (e) {
            if (CHATOBJ.groupType != 2) {//不是群消息
                return;
            }
            if (e.keyCode === 16) return;
            console.log('没有弹出联系人?:',e);
            if (e.shiftKey && e.keyCode == 50) {//是@
                console.log('开始搜索:',e);
                aiteObj.searching = aiteObj.state.SEARCHING;
                aiteObj.current_aiteId = Math.uuid();
                aiteObj.getSerchList();
                insertAite();
                aiteObj.cursorPosition = aiteObj.getCursorPosition();
                e.preventDefault();
            }
    
        });*/
    
        /**
         * 搜索条目点击事件
         */
        aiteObj.$memberContainer.on('click', '.msg-aite', function (e) {
            var target = this;
            return commonAiteObj.serchItemClick(target);
        });
        /**
         * 输入@后输入其他继续搜索
         */
        $(document).on('input', '#input-content', function (e) {
            commonAiteObj.serching();
        });
    
        /**
         * 输入@后失去焦点
         */
        /*   $(document).on('blur', '#input-content', function (e) {
         if(searching){
         console.log('输入@后失去焦点:',e);
         searching= false;
         $memberContainer.addClass('hideList');
         var temp_aite = $inputContainer.find('#'+current_aiteId+'');
         var temp_aiteValue = temp_aite.html();
         console.log(temp_aiteValue);
         temp_aite.after(temp_aiteValue);
         temp_aite.remove();
         };
    
         });*/
    
        /**
         * 输入@后触发其他区域
         */
        $(document).on('click', function () {
            commonAiteObj.hideSerchList();
        });
    
        aiteObj.$inputContainer[0].addEventListener("compositionstart", function (event) {
            console.log('compositionstart:', event.data);
            aiteObj.composing = true;
        });
        aiteObj.$inputContainer[0].addEventListener("compositionend", function (event) {
            console.log('compositionend:', event.data);
            aiteObj.composing = false;
        });
    
        aiteObj.$inputContainer[0].addEventListener("blur", function (event) {
            console.log('失去焦点:');
            aiteObj.focusState = false;
        });
        aiteObj.$inputContainer[0].addEventListener("focus", function (event) {
            console.log('获得焦点:');
            aiteObj.focusState = true;
        });
        //此处获取c++回调 shift+2 回调 触发搜索
    
    
        /**
         * 输入enter触发
         */
        document.getElementById('input-content').addEventListener('keydown', function (e) {
            if(e.keyCode === 13){
                commonAiteObj.hideSerchList();
            }
    
        });
    
        /**
         * 获取光标的位置
         */
        /*   function getCursorPosition() {
         var selection = getSelection();
         var range = selection.getRangeAt(0);
         var rect = range.getClientRects()[0];
         return rect;
         }*/
        /*function getCursorPosition() {
    
           var aiteSpan = aiteObj.$inputContainer.find('#'+aiteObj.current_aiteId+'')[0];
           //console.log('aiteSpan,',aiteSpan);
            var aiteSpanClientRect = aiteSpan.getBoundingClientRect();
            console.log(aiteSpanClientRect);
           return aiteSpanClientRect;
    
        };*/
    
        function insertAite() {
            //var $temp = $('<span id="' + aiteObj.current_aiteId + '">@</span>');
            var temphtml = '<span id="' + aiteObj.current_aiteId + '">@</span>';
            //aiteObj.$inputContainer.append($temp);
            insertImg(temphtml);
        };
    
    })
    View Code
  • 相关阅读:
    抓取猫眼电影top100的正则、bs4、pyquery、xpath实现方法
    Win实用好用软件清单推荐
    Manjaro安装配置美化字体模糊发虚解决记录
    爬取杭电oj所有题目
    Python爬取微博热搜以及链接
    20191225_Python构造函数知识以及相关注意事项
    java_细节_windows7下记事本保存为utf-8格式的问题
    基础_划分子网
    爬虫_爬取有道每日一句
    算法_基础_伪代码定义以及遵循的规则
  • 原文地址:https://www.cnblogs.com/WhiteHorseIsNotHorse/p/6705472.html
Copyright © 2011-2022 走看看