Node.js——微信emoji功能的實現(xiàn)

一個非常好用的emoji插件

jquery-emojiarea-master

如何利用該插件迅速搭建搭建emoji界面?

在主布局文件下寫下如下代碼

<script>
    var $wysiwyg = $('.emojis-wysiwyg').emojiarea({wysiwyg: true,button: '.showemoji'});
    //button: '.showemoji' 則是用于自定義打開emoji選擇界面的按鈕的樣式
    //emojis-wysiwyg則是textarea對應的class,該操作用于創(chuàng)建一個div與我們的textarea綁定
</script>

分析源碼

jquery-emojiarea.js

數(shù)據(jù)存儲與emojiarea構造方法
    //$.fx是類級別的插件開發(fā)丧诺,即給jQuery添加新的全局函數(shù)
    $.emojiarea = {
        path: '',//path代表儲存emoji相關信息的json文件
        icons: {},//icons儲存著詳細的emoji名稱(轉(zhuǎn)義后),以及圖片的名字
        defaults: {
            button: null,
            buttonLabel: 'Emojis',
            buttonPosition: 'after'
        }
    };
    $.fn.emojiarea = function(options) {
        //extend方法用于合并參數(shù)到{},后面覆蓋前面(例如options覆蓋 $.emojiarea.defaults部分內(nèi)容)
        options = $.extend({}, $.emojiarea.defaults, options);
        return this.each(function() {
            var $textarea = $(this);
            if ('contentEditable' in document.body && options.wysiwyg !== false) {          //表示可編輯屬性是否在document.body里
                new EmojiArea_WYSIWYG($textarea, options);//將$textarea屬性傳入EmojiArea_WYSIWYG函數(shù),構造一個emoji輸入框?qū)ο?            } else {
                new EmojiArea_Plain($textarea, options);
            }
        });
    };
(函數(shù)/對象)EmojiArea_WYSIWYG
    var EmojiArea_WYSIWYG = function($textarea, options) {
        var self = this;
        CONST = this;
        this.options = options;
        this.$textarea = $textarea;
        this.$editor = $('<div>').addClass('emoji-wysiwyg-editor');//editor就是代替了textarea的一個聊天框,它與$textarea綁定
        this.$editor.text($textarea.val());
        this.$editor.attr({contenteditable: 'true'});//contenteditable: 'true'屬性的設置極為重要,它使得div變成可編輯狀態(tài),例如編輯文字,復制圖片(下一章會講)
        this.$editor.on('blur keyup paste', function() { return self.onChange.apply(self, arguments); });//onChange方法用以editor和textarea之間的內(nèi)容更新
        this.$editor.on('mousedown focus', function() { document.execCommand('enableObjectResizing', false, false); });
        this.$editor.on('blur', function() { document.execCommand('enableObjectResizing', true, true); });

        var html = this.$editor.text();
        var emojis = $.emojiarea.icons;
        for (var key in emojis) {
            if (emojis.hasOwnProperty(key)) {
                html = html.replace(new RegExp(util.escapeRegex(key), 'g'), EmojiArea.createIcon(key));
            }
        }//遍歷emojis,其中escapeRegex方法用于通過替換為轉(zhuǎn)義碼來轉(zhuǎn)義最小的元字符集(\促王、*、+扒腕、?、|烤黍、{述么、[先舷、(、)前方、^狈醉、$、.惠险、# 和空白)
        //createIcon通過key創(chuàng)建一個<img>替換:iconname:形式的表情(在textarea中,:iconname:代表一個表情)
        this.$editor.html(html);

        $textarea.hide().after(this.$editor);

        this.setup();

        this.$button.on('mousedown', function() {
            if (self.hasFocus) {
                self.selection = util.saveSelection();
            }
        });
    };
editor中對鼠標劃取部分的操作
util.replaceSelection = (function() {
        if (window.getSelection) {//如果瀏覽器支持window.getSelection就使用這個方法,否則就用document.selection
            return function(content) {
                // 獲取選定對象
                var range, sel = window.getSelection();
                var node = typeof content === 'string' ? document.createTextNode(content) : content;
                if (sel.getRangeAt && sel.rangeCount) {
                    range = sel.getRangeAt(0);//設置光標對象,把選中的文字轉(zhuǎn)化為range對象苗傅,可以進行操作。接受一個參數(shù)班巩,一般填寫為0渣慕,表示從selection對象從0開始進行轉(zhuǎn)化;
                    range.deleteContents();
                    range.insertNode(document.createTextNode(' '));
                    range.insertNode(node);
                    range.setStart(node, 0);//光標位置定位在表情節(jié)點開始位置,第一個參數(shù)為這個range對象的container,第2個參數(shù)為索引值,可以指定選擇某段文字從哪開始
                    
                    window.setTimeout(function() {
                        range = document.createRange();//selection創(chuàng)建
                        range.setStartAfter(node);
                        range.collapse(true);// 使光標開始和光標結(jié)束重疊
                        sel.removeAllRanges();// 清除選定對象的所有光標對象
                        sel.addRange(range);// 插入新的光標對象
                    }, 0);
                }
            }
        } else if (document.selection && document.selection.createRange) {
            return function(content) {
                var range = document.selection.createRange();
                if (typeof content === 'string') {
                    range.text = content;
                } else {
                    range.pasteHTML(content.outerHTML);
                }
            }
        }
    })();

 util.restoreSelection = (function() {//用于加載editor中的光標
        if (window.getSelection) {
            return function(savedSelection) {
                var sel = window.getSelection();
                sel.removeAllRanges();
                for (var i = 0, len = savedSelection.length; i < len; ++i) {
                    sel.addRange(savedSelection[i]);
                }
            };
        } else if (document.selection && document.selection.createRange) {
            return function(savedSelection) {
                if (savedSelection) {
                    savedSelection.select();
                }
            };
        }
    })();
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市逊桦,隨后出現(xiàn)的幾起案子眨猎,更是在濱河造成了極大的恐慌,老刑警劉巖强经,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件睡陪,死亡現(xiàn)場離奇詭異,居然都是意外死亡夕凝,警方通過查閱死者的電腦和手機宝穗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來码秉,“玉大人逮矛,你說我怎么就攤上這事∽” “怎么了须鼎?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長府蔗。 經(jīng)常有香客問我晋控,道長,這世上最難降的妖魔是什么姓赤? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任赡译,我火速辦了婚禮,結(jié)果婚禮上不铆,老公的妹妹穿的比我還像新娘蝌焚。我一直安慰自己,他們只是感情好誓斥,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布只洒。 她就那樣靜靜地躺著,像睡著了一般劳坑。 火紅的嫁衣襯著肌膚如雪毕谴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天距芬,我揣著相機與錄音涝开,去河邊找鬼。 笑死蔑穴,一個胖子當著我的面吹牛忠寻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播存和,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼奕剃,長吁一口氣:“原來是場噩夢啊……” “哼衷旅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起纵朋,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤柿顶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后操软,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘁锯,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年聂薪,在試婚紗的時候發(fā)現(xiàn)自己被綠了家乘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡藏澳,死狀恐怖仁锯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情翔悠,我是刑警寧澤业崖,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站蓄愁,受9級特大地震影響双炕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撮抓,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一妇斤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丹拯,春花似錦趟济、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽戚炫。三九已至剑刑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間双肤,已是汗流浹背施掏。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茅糜,地道東北人七芭。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像蔑赘,于是被迫代替她去往敵國和親狸驳。 傳聞我的和親對象是個殘疾皇子预明,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容