Greasy Fork 还支持 简体中文。

tiebaCustomFace

贴吧自定义表情

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name        tiebaCustomFace 
// @description    贴吧自定义表情
// @icon        http://tb.himg.baidu.com/sys/portrait/item/c339b7e2d3a1b5c4c3a8d726
// @include     http://tieba.baidu.com/*
// @version     2014.3.23
// @namespace https://greasyfork.org/users/25324
// ==/UserScript==

var _window = typeof unsafeWindow == 'undefined' ? window : unsafeWindow;
var $ = _window.$;

var faces = []; //全部表情
var selector; //判断选中的是回复框还是楼中楼
var recentlyFaceNum = 45; //最近使用表情数量
var LZLCss = '.insertsmiley_holder';
//读取表情列表
var splitor = " "; //GM变量分隔符
var tabNum = 0;

var baiduFace1 = [];
//度娘自带表情

function defaultFace(num, name) {
    this.num = num;
    this.name = name;
}

var face = GM_getValue('FACES', '{"tabName":"","faceSrc":[""],"colCount":"8","rowCount":1,"faceWidth_Height":60,"position":0}');
if (face == "")
    face = '{"tabName":"","faceSrc":[""],"colCount":"8","rowCount":1,"faceWidth_Height":60,"position":0}';
face = face.split(splitor); //分割成数组
for (var i = 0; i < face.length; i++) {
    faces.push(JSON.parse(face[i]));
    if (!faces[i].position)
        faces[i].position = 0;
}

//创建表情构造函数

function Face(tabName, srcArray, colCount, position) {
    this.tabName = tabName;
    this.faceSrc = srcArray;
    this.colCount = colCount;
    this.rowCount = Math.round(srcArray.length / colCount) + 1;
    this.faceWidth_Height = 500 / colCount - 2;
    this.position = position || 0;
}


//响应监听函数
var tbodyHtml = []; //存储表情tbody内的html
var addFaces = function() {
    //获得百度自带表情json,隐藏用
    $('.s_tab_btn').each(function() {
        baiduFace1.push(new defaultFace($(this).attr('data-index'), $(this).find('span').html()));
    });

    faces[0].tabName = "最近";
    addSettingElement(); //添加编辑删除等元素
    addEventOnce(); //添加只需添加一次的事件
    if (faces.length === 0) //保证faces中至少有一个元素
        faces[0] = new Face("", [""], 8);
    for (var index = 0; index < faces.length; index++) {
        var face = faces[index];
        if (face.position == 0)
            selector.find('li.s_tab_btn[data-index="' + (parseInt(face.position) + 1) + '"]').before('<li id="smilyTab' + index + '" class="s_tab_btn customSmily"><span class="s_tab_btnbg" data-index="' + face.tabName + '">' + face.tabName + '</span></li>');
        else
            selector.find('li.s_tab_btn[data-index="' + (parseInt(face.position)) + '"]').after('<li id="smilyTab' + index + '" class="s_tab_btn customSmily"><span class="s_tab_btnbg" data-index="' + face.tabName + '">' + face.tabName + '</span></li>');
        tabOnClick(index);
    }
    //隐藏元素
    var hidef = GM_getValue('hideFace', '');
    if (hidef) {
        hidef = hidef.split(',');
        for (var i = 0; i < hidef.length; i++) {
            $(css + ' li.s_tab_btn[data-index="' + hidef[i] + '"]').hide();
            $(css + ' li.s_tab_btn span[data-index="' + hidef[i] + '"]').parent().hide();
        }
    } //

    var sf = document.querySelector(css + " #showFace");
    sf.addEventListener("click", blacklistManage, false);

    normalTabClick(); //添加自带表情组点击事件
    setTimeout(ImgOnClickAddMostUsedFace, 200); //添加最近表情点击事件
    tabNum = GM_getValue('tabNum', '0');
    //初始化默认表情组
    //if(tabNum!=-1)
    //tabNum = 0;	//默认上次标签页
    //tabNum=0;
    if (tabNum == 0 || tabNum > faces.length) {
        hidemenu();
    }
    if (faces.length > tabNum) {
        selector.find('.selected').removeClass('selected');
        refreshFaces(tabNum);
        selector.find("#smilyTab" + tabNum + " span").addClass('selected');
    } else
        fetchTbodyHtml();
}

//黑名单管理
var blacklistManage = function(dataindex) {
    addBlacklistDiv();
}
//添加表情黑名单管理div
var addBlacklistDiv = function() {
    var blist = GM_getValue('hideFace', "").split(',');
    var html = '<div id="blist"><div id="blistdiv">';
    var content;
    for (var i = 0; i < baiduFace1.length; i++)
        html = html + '<span class="blistElement" index="' + baiduFace1[i].num + '">' + baiduFace1[i].name + '</span>';
    html += '<br>';
    for (var i = 0; i < faces.length; i++)
        html = html + '<span class="blistElement" index="' + faces[i].tabName + '">' + faces[i].tabName + '</span>';
    html += '</div><span id="blistConfig">确认</span></div>';
    selector.find('DIV.s_layer_tab.j_tab').after(html);
    GM_addStyle(blistcss);

    //点击显示/隐藏

    function hasClass(node, className) //是否具有某个类名
    {
        var names = node.className.split(/\s+/);
        for (var i = 0; i < names.length; i++) {
            if (names[i] == className) return true;
        }
        return false;
    }
    var t = GM_getValue('hideFace', '').split(',');
    for (var i = 0; i < t.length; i++) {
        if (t[i])
            $('#blist span.blistElement[index="' + t[i] + '"]').addClass('blisthide');
    }
    var allElement = document.querySelectorAll('#blistdiv span.blistElement');
    [].forEach.call(allElement, function(e) {
        function Eclick() {
            var l = e.getAttribute('index');
            if (hasClass(e, 'blisthide')) {
                e.className = e.className.replace("blisthide", '');
                $('li.s_tab_btn[data-index="' + l + '"]').show();
                if (l == '最近') //默认标签页
                {
                    tabNum = 0;
                    GM_setValue('tabNum', 0)
                }
                $(css + ' li.s_tab_btn span[data-index="' + l + '"]').parent().show();
                var s = GM_getValue('hideFace', '').split(',');
                s.splice(s.indexOf(l), 1);
                GM_setValue('hideFace', s.join(','));

            } else {
                if (l == '最近') {
                    tabNum = 1000;
                    GM_setValue('tabNum', tabNum);
                }
                e.className = e.className + " " + 'blisthide';
                var listTemp = GM_getValue('hideFace', '');
                $('li.s_tab_btn[data-index="' + l + '"]').hide();
                $(css + ' li.s_tab_btn span[data-index="' + l + '"]').parent().hide();
                GM_setValue('hideFace', listTemp + "," + l);
            }
        }
        e.addEventListener('click', Eclick, false);
    });
    var cf = document.querySelector('#blistConfig');
    cf.addEventListener('click', function() {
        $('#blist').remove();
    });
}

//标签点击事件(标签元素背景相关)
//添加设置元素
var addSettingElement = function() {
    selector.find('DIV.s_layer_tab.j_tab').after('<div id="setting">' + '<div id="aditFaceMenu">编辑</div>' //增加编辑按钮
    + '<div id="addFaceMenu">增加</div>' //增加按钮
    + '<div id="deleteFaceMenu">删除</div>' //删除按钮
    + '<div id="tab_MoveLeft">左移</div>' + '<div id="tab_MoveRight">右移</div>' + '<div id="getProfile">导出</div>' + '<div id="loadProfile">导入</div>' + '<div id="showFace">隐藏</div>' + '</div>');
    //+'<div id="settingmenu">显示/隐藏菜单</div>');	
}
//添加只需添加一次的事件
var m, n, s, l, r, cc; //事件
var addEventOnce = function() {
    m = document.querySelector(css + " #aditFaceMenu");
    m.addEventListener("click", aditFace, false);
    n = document.querySelector(css + " #addFaceMenu");
    n.addEventListener("click", addNewFace, false);
    s = document.querySelector(css + " #deleteFaceMenu");
    s.addEventListener("click", deleteFace, false);
    l = document.querySelector(css + " #tab_MoveLeft");
    l.addEventListener("click", tab_MoveLeft, false);
    r = document.querySelector(css + " #tab_MoveRight");
    r.addEventListener("click", tab_MoveRight, false);
    var gp = document.querySelector(css + " #getProfile"); //导出配置
    gp.addEventListener("click", function() {
        if (confirm("转到纯文本模式复制文本保存配置"))
            $('body').html(GM_getValue('FACES'));
    }, false);
    var lp = document.querySelector(css + " #loadProfile"); //导入配置
    lp.addEventListener("click", function() {
        var a = prompt("要导入的数据(覆盖原有数据)");
        if (a) {
            GM_setValue("FACES", a);
            if (confirm("是否确认要导入(将会刷新)"))
                window.location.reload();
        } else
            alert("不能为空");
    }, false);
}
var tabOnClick = function(index) //添加自定义表情标签事件,index为id后缀
{
    function clickIdTab() {
        $('.edui-container li.s_tab_btn[data-index="1"]').click();
        $('.tbui_scroll_bar.j_scroll_bar').show();
        selector.find('TABLE.s_layer_table tbody').html(tbodyHtml[index]);
        if (tabNum != 0)
            GM_setValue('tabNum', index); //记录下标以便下次打开默认为该组
        selector.find('#aditFaceMenu').show(); //显示设置栏
        selector.find('#deleteFaceMenu').show();
        selector.find('#tab_MoveRight').show();
        selector.find('#tab_MoveLeft').show();
        selector.find('.selected').removeClass('selected');
        $(this).find('span').addClass("selected");
        if (index == 0) {
            hidemenu();
        }
    }
    cc = document.querySelector(css + ' #smilyTab' + index);
    cc.addEventListener("click", clickIdTab, false);
}

//普通表情tab点击事件
var normalTabClick = function() {
    var dd = document.querySelectorAll(css + ' LI.s_tab_btn');
    [].forEach.call(dd, function(e) {
        function clickNormalTab() {
            setTimeout(ImgOnClickAddMostUsedFace, 400); //添加表情点击事件
            if (!$(this).attr('id')) {
                selector.find('.customSmily span').removeClass('selected'); //移除选中状态
                hidemenu();
                if (tabNum != 0)
                    GM_setValue('tabNum', 10000);
            }
        }
        e.addEventListener("click", clickNormalTab, false);
    });
}

var hidemenu = function() {
    selector.find('#aditFaceMenu').hide(); //隐藏设置选项
    selector.find('#deleteFaceMenu').hide();
    selector.find('#tab_MoveRight').hide();
    selector.find('#tab_MoveLeft').hide();
}
//修改后更新表情框
var refreshFaces = function(index) {
    tbodyHtml = fetchTbodyHtml();
    selector.find('TABLE.s_layer_table tbody').html(tbodyHtml[index]);
}

//添加表情点击函数,作为常用表情功能
var ImgOnClickAddMostUsedFace = function() {
    var customId = selector.find('.selected').parent().attr('id');
    var reg = /http:\/\/static\.tieba\.baidu\.com\/tb\/editor\/images\/[0-9][0-9]\.gif/;
    var f = document.querySelectorAll('.s_face.j_emotion');
    f && [].forEach.call(f, function(e) {
        var url = e.getAttribute('data-surl');
        e.addEventListener('click', function() {
            var ind = faces[0].faceSrc.indexOf(url);
            if (ind != -1) {
                faces[0].faceSrc.splice(ind, 1);
            }
            if (faces[0].faceSrc.length > recentlyFaceNum)
                faces[0].faceSrc.pop();
            if (!reg.test(url)) {
                faces[0].faceSrc.unshift(url);
                saveFaces();
            }
            if (customId) {
                var cindex = parseInt(customId.replace("smilyTab", ""));
                if (cindex > 0) {
                    var ind = faces[cindex].faceSrc.indexOf(url);
                    faces[cindex].faceSrc.splice(ind, 1);
                    faces[cindex].faceSrc.unshift(url);
                    saveFaces();
                }
            }
        });
    });
}

//针对某些非百度内部和宽度大于100的表情,点击改变BDE_SMILY为BDE_IMAGE,否则会未知错误
unsafeWindow.onClickImg = function(src) {
    /*获取原始图片大小*/
    var theImage = new Image();
    theImage.src = src;
    var myReg = /imgsrc\.baidu\.com|static\.tieba\.baidu\.com/;
    var imageWidth = theImage.width;
    var imageHeight = theImage.height;
    if (!(myReg.test(src) && imageWidth <= 100)) {
        setTimeout(function() {
            var i = $('#ueditor_replace img[src="' + src + '"][class="BDE_Smiley"]')
            i.attr('class', 'BDE_Image');
            //i.attr('width',imageWidth);
            //i.attr('height',imageHeight);
        }, 40);
    }
}
//获取tbodyHtml(表情的HTML表示)
var fetchTbodyHtml = function() {
    var tbody = new Array();
    for (var index = 0; index < faces.length; index++) {
        var face = faces[index];
        tbody[index] = '';
        //face.rowCount += 2;
        var row = 360 / face.faceWidth_Height > face.rowCount ? (360 / face.faceWidth_Height) : face.rowCount;
        for (var i = 0; i < row; i++) {
            tbody[index] += '<tr height=' + face.faceWidth_Height + '>';
            for (var j = 0; j < face.colCount; j++) {
                var data_postflag = (j >= face.colCount / 2) ? 1 : 0; //控制悬浮预览图像的方位,1为右侧
                var cindex = i * face.colCount + j;
                var currentFaceSrc = face.faceSrc[cindex]; //当前表情链接
                var lzlImgReg = /http:\/\/static\.tieba\.baidu\.com\/tb.*/;
                if (css == '.insertsmiley_holder' && !lzlImgReg.test(currentFaceSrc)) //楼中楼不添加百度内部图片
                    currentFaceSrc = undefined;
                if (currentFaceSrc) {
                    currentFaceSrc = currentFaceSrc.replace(/\s|click=[0-9]*/g, ''); //去链接空格
                    tbody[index] += '<td class="s_face j_emotion" index="' + cindex + '" border="1" data-surl="' + currentFaceSrc + '" data-postflag="' + data_postflag + '" style="border-collapse:collapse;"';
                    tbody[index] = tbody[index] + ' align="center" 	bgcolor="#FFFFFF" width="' + face.faceWidth_Height + '" max-height="' + face.faceWidth_Height + '">';
                    tbody[index] += '<a class="img imgclasses" onclick="onClickImg(\'' + currentFaceSrc + '\')" style="background:none;"><img class="faceImg" src="' + currentFaceSrc + '" style="max-height:' + face.faceWidth_Height + 'px;max-width:' + face.faceWidth_Height + 'px;"></img></a>';
                    tbody[index] += '</td>';
                }
            }
            tbody[index] += '</tr>';
        }
    }
    return tbody;
}

//删除表情
var deleteFace = function() {
    var cindex = selector.find('.selected').parent().attr('id').replace("smilyTab", "");
    cindex = parseInt(cindex);
    if (confirm("是否要删除 " + faces[cindex].tabName + " 表情组")) {
        faces.splice(cindex, 1);
        selector.find('.selected').parent().remove();
        saveFaces();
        //动态改变id(faces长度减1了)
        for (var i = cindex; i < faces.length; i++) {
            selector.find("#smilyTab" + (i + 1)).attr('id', 'smilyTab' + i);
            //添加点击函数
            tabOnClick(i);
        }
        if (faces.length > cindex) {
            refreshFaces(cindex);
            selector.find("#smilyTab" + (cindex) + " span").addClass('selected');
        } else if (faces.length > 1) {
            refreshFaces(cindex - 1);
            selector.find("#smilyTab" + (cindex - 1) + " span").addClass('selected');
        } else {
            selector.find('#aditFaceMenu').hide();
            selector.find('#deleteFaceMenu').hide();
        }
    }
}

//添加设置框
var addSettingFloat = function() {
    if (!document.querySelector(css + " #Face_float"))
        selector.find('div').eq(0).after(floatdiv);
    GM_addStyle(ccss);
}
//添加表情函数
var addNewFace = function() {
    addSettingFloat();
    //selector.find('#Face_float').show();
    selector.find('#Face_floatedit').val("");
    selector.find('#tabName').val("未命名");
    selector.find('#colCount').val(8);
    var config_1 = function() {
        var cindex = faces.length;
        selector.find('li.s_tab_btn[data-index="1"]').before('<li id="smilyTab' + cindex + '" class="s_tab_btn customSmily"><span class="s_tab_btnbg">' + selector.find('#tabName').val() + '</span></li>');
        selector.find('.selected').removeClass('selected');
        selector.find("#smilyTab" + cindex).find('span').addClass("selected");
        faces.push(new Face(selector.find('#tabName').val(),
            selector.find('#Face_floatedit').val().split('\n'),
            selector.find('#colCount').val()));
        refreshFaces(cindex);
        tabOnClick(cindex);
        saveFaces();
        selector.find('#maxwindow').remove();
        d.removeEventListener("click", config_1, false); //移除监听
        selector.find('#aditFaceMenu').show();
        selector.find('#deleteFaceMenu').show();
    }
    var d = document.querySelector(css + " #Face_yesc");
    d.addEventListener("click", config_1, false);
    cancle();
}

//设置栏
//悬浮层
var floatdiv = '<div id="maxwindow"><div id="Face_float">' + '<textarea id="Face_floatedit">' + '</textarea></div>' + '<div id="tabSetting"><span id="d_tabName">标签名:<input id="tabName" type="text" onkeydown="if(event.keyCode==13) return false;">' + '</span><span id="d_colCount">每行表情:<input id="colCount" type="text" onkeydown="if(event.keyCode==13) return false;"></span></div>' + '<div id="config"><span id="Face_yesc" class="fff">保存</span><span id="Face_noc" class="fff" >取消</span></div></div>';

//编辑表情
var aditFace = function() {

    //selector.find('#Face_float').show();
    if (selector.find('.selected').parent().attr('id')) {
        addSettingFloat();
        var findex = selector.find('.selected').parent().attr('id').replace("smilyTab", "");
        findex = parseInt(findex);
        initFaceEditor(findex);
        config();
        cancle();
    }
}

//初始化编辑框
var initFaceEditor = function(e) {
    var vals = "";
    for (var i = 0; i < faces[e].faceSrc.length; i++) {
        if (i != faces[e].faceSrc.length - 1)
            vals = vals + faces[e].faceSrc[i] + "\n";
        else
            vals = vals + faces[e].faceSrc[i];
    }

    selector.find('#Face_floatedit').val(vals);
    selector.find('#tabName').val(faces[e].tabName);
    selector.find('#colCount').val(faces[e].colCount);
}

//保存按钮
var config = function() {
    var Face_yesc = function() {
        var findex = selector.find('.selected').parent().attr('id').replace("smilyTab", "");
        findex = parseInt(findex);
        var tabname = selector.find('#tabName').val();
        var colcount = selector.find('#colCount').val();
        var tempsrc = selector.find('#Face_floatedit').val().split('\n');
        faces[findex] = new Face(tabname, tempsrc, colcount);
        saveFaces();
        selector.find('.selected').html(tabname);
        refreshFaces(findex);
        selector.find('#maxwindow').remove();
        c.removeEventListener("click", Face_yesc, false);
    }
    //使用jquery的click事件会使GM_的API无效
    var c = document.querySelector(css + " #Face_yesc");
    c.addEventListener("click", Face_yesc, false);
}
//取消按钮
var cancle = function() {
    selector.find('#Face_noc').click(function() {
        selector.find('#maxwindow').remove();
    });
}

//保存表情
var saveFaces = function() {
    var facesTmp = "";
    for (var i = 0; i < faces.length; i++) {
        faces[i].faceSrc = uniQueue(faces[i].faceSrc);
        if (i != faces.length - 1)
            facesTmp = facesTmp + JSON.stringify(faces[i]) + splitor;
        else
            facesTmp += JSON.stringify(faces[i]);
    }
    GM_setValue('FACES', facesTmp);
    tbodyHtml = fetchTbodyHtml();
}

//数组去重复

    function uniQueue(array) {
        var arr = [];
        var m;
        while (array.length > 0) {
            m = array[0];
            arr.push(m);
            array = $.grep(array, function(n, i) {
                return n == m;
            }, true);
        }
        return arr;
    }

    //表情标签页滚动
var nextTab = function() {
    if ((-TabWidthOffset) < tabWidthCount * tabWidth)
        selector.find('.s_tab_content').attr('style', 'margin-left:' + (TabWidthOffset -= tabWidth) + 'px;');
}
var prevtTab = function() {
    if (-TabWidthOffset > 0)
        selector.find('.s_tab_content').attr('style', 'margin-left:' + (TabWidthOffset += tabWidth) + 'px;');
}

///////////////////////////////////////////
////////自定义表情组位置/////////////////////
////////////////////////////////////////////
//表情组右移动
var tab_MoveRight = function(index) {
    var cindex = selector.find('.selected').parent().attr('id').replace("smilyTab", "");
    cindex = parseInt(cindex);
    //console.log(0);
    if ($(css + ' #smilyTab' + cindex).next().length != 0 && cindex > 0) {
        var t = $(css + ' #smilyTab' + cindex).next();
        if (t && t.attr('id')) {
            var anotherIndex = t.attr('id').replace("smilyTab", "");
            var temp = faces[cindex];
            faces[cindex] = faces[anotherIndex];
            faces[anotherIndex] = temp;
            $(css + ' #smilyTab' + cindex).insertAfter(t);
            if (tabNum != 0)
                GM_setValue('tabNum', anotherIndex);
            $(css + ' #smilyTab' + cindex).attr('id', t.attr('id'));
            t.attr('id', 'smilyTab' + (cindex));
            tabOnClick(cindex);
            tabOnClick(anotherIndex);
            saveFaces();
        } else {
            faces[cindex].position = parseInt(t.attr('data-index')) + 0.1;
            $(css + ' #smilyTab' + cindex).insertAfter(t);
            saveFaces();
        }
    }
}
//表情组左移
var tab_MoveLeft = function() {
    var cindex = selector.find('.selected').parent().attr('id').replace("smilyTab", "");
    cindex = parseInt(cindex);
    //console.log(1);
    if ($(css + ' #smilyTab' + cindex).prev().length != 0 && cindex > 0 && $(css + ' #smilyTab' + cindex).prev().attr('id') != "smilyTab0") {
        var t = $(css + ' #smilyTab' + cindex).prev();
        if (t && t.attr('id')) {
            var anotherIndex = t.attr('id').replace("smilyTab", "");
            var temp = faces[cindex];
            faces[cindex] = faces[anotherIndex];
            faces[anotherIndex] = temp;
            $(css + ' #smilyTab' + cindex).insertBefore(t);
            if (tabNum != 0)
                GM_setValue('tabNum', anotherIndex);
            $(css + ' #smilyTab' + cindex).attr('id', t.attr('id'));
            t.attr('id', 'smilyTab' + (cindex));
            tabOnClick(cindex);
            tabOnClick(anotherIndex);
            saveFaces();
        } else {
            faces[cindex].position = t.attr('data-index') == 0 ? 0 : (t.attr('data-index')) - 0.9;
            $(css + ' #smilyTab' + cindex).insertBefore(t);
            saveFaces();
        }
    }
}

var addBDESrc; //鼠标悬浮获得的图片链接
//修改分享按钮为加入表情到表情组
var addImgToCustomFace = function() {
    (function c() {
        var b = document.querySelector('.share.j_shareImg');
        if (b) {
            b.addEventListener('mouseover', function() {
                $('.share.j_shareImg').unbind('click'); //取消分享按钮默认的点击事件
                setShareDiv(); //重构分享框
                //addAddImgEvents();
            }, false);
        } else
            setTimeout(c, 20); //检查悬浮框是否弹出
    })();

    function setSrc(g) //悬浮在图片上时获取图片src
    {
        [].forEach.call(g, function(e) {
            e.addEventListener('mouseover', function() {
                var s = e.getAttribute('src');
                if (s.match(/http:\/\/imgsrc\.baidu\.com\/forum/)) {
                    s = s.replace(/http:\/\/imgsrc\.baidu\.com\/forum\/.*sign=.*\//mg, ''); //获得点击后的原图
                    addBDESrc = 'http://imgsrc.baidu.com/forum/pic/item/' + s;
                } else
                    addBDESrc = s;
                //console.log(addBDESrc);
            }, false);
        });
    }
    setTimeout(function() //setTimeout兼容贴吧大图还原脚本用,因为那边重构了每个图片
    {
        var a = document.querySelectorAll('cc .BDE_Image'); //普通图片
        var b = document.querySelectorAll('.j_user_sign'); //签名图
        setSrc(a);
        setSrc(b);
    }, 500);
}
var setShareDiv = function() {
    (function c() {
        if (document.querySelector('.bdimgshare-p-icon.bdshare-i-mshare')) {
            var content = "";
            for (var i = 1; i < faces.length; i++)
                content = content + '<a class="bdimgshare-p-icon bdshare-i-mshare ccccc" onclick="return false;" href="#" data-btype="' + i + '">' + faces[i].tabName + '</a>';
            var html = '<h6>添加到</h6>' + '<div class="bdimgshare-layer-list">' + content + '</div>';
            $('.bdimgshare-layer-pnl').html(html);
            //添加事件
            var b = document.querySelectorAll('.ccccc');
            [].forEach.call(b, function(e) {
                var cindex = e.getAttribute('data-btype'); //表情组下标
                e.addEventListener('click', function() //点击表情组后隐藏弹框
                {
                    $('.bdimgshare-layer-pnl').parent().parent().hide();
                    if (addBDESrc && faces[cindex].faceSrc.indexOf(addBDESrc) == -1) //判断是否已有相同图片
                    {
                        faces[cindex].faceSrc.unshift(addBDESrc);
                        saveFaces();
                    }
                }, false)
            });
        } else
            setTimeout(c, 50);
    })();

}

//弹出添加表情框
var showAddFaceDiv = function() {
    if (!document.querySelector('#addFaceDiv')) {

        var cdiv = '<div id="addFaceDiv">';
        for (var i = 1; i < faces.length; i++) {
            cdiv = cdiv + '<a class="addface" onclick="return false;" href="#" data-btype="' + i + '">' + faces[i].tabName + '</a>';
        }
        cdiv += '<br><br><img width="80px" height="80px" src="' + addBDESrc + '">';
        cdiv += '</div>';

        $('body').append(cdiv);
        var ev = document.querySelectorAll('.addface');
        [].forEach.call(ev, function(e) {
            var cindex = e.getAttribute('data-btype'); //表情组下标
            e.addEventListener('click', function() //点击表情组后隐藏弹框
            {
                $('#addFaceDiv').remove();
                if (addBDESrc && faces[cindex].faceSrc.indexOf(addBDESrc) == -1) //判断是否已有相同图片
                {
                    faces[cindex].faceSrc.unshift(addBDESrc);
                    saveFaces();
                }
            }, false)
        });
        GM_addStyle('\
			#addFaceDiv\
			{\
				z-index:99999999;\
				position:fixed;\
				top:10%;\
				border:solid #DFDFDF 5px;\
				line-height:50px;\
				width:700px;\
				height:300px;\
				background:#F9EED0;\
				padding:5px;\
				text-align:center;\
			}\
			.addface\
			{\
				font-size:20px;\
				margin-right:10px;\
			}');
    } else {
        $('#addFaceDiv').remove();
        showAddFaceDiv();
    }
}

//ctrl+鼠标左键弹出showAddFaceDiv
setTimeout(function() {
    var imgs = document.querySelectorAll('img');
    [].forEach.call(imgs, function(dd) {
        dd.onclick = function(e) {
            //e.preventDefault();
            if (e.altKey) {
                var s = dd.getAttribute('src');
                if (s.match(/http:\/\/imgsrc\.baidu\.com\/forum/)) {
                    e.preventDefault();
                    s = s.replace(/http:\/\/imgsrc\.baidu\.com\/forum\/.*sign=.*\//mg, ''); //获得点击后的原图
                    addBDESrc = 'http://imgsrc.baidu.com/forum/pic/item/' + s;
                } else
                    addBDESrc = s;
                showAddFaceDiv();
            }
        }
    });
}, 100);
//点击增加表情框外删除div
document.onclick = function(e) {
    var e = window.event ? window.event : e,
        target = e.srcElement || e.target;
    while (target.nodeName.toLowerCase() != "html") {
        if (target.id == "addFaceDiv" || target.tagName == 'IMG') {
            break;
        }
        target = target.parentNode;
    }
    if (target.nodeName.toLowerCase() == "html")
        $('#addFaceDiv').remove();
}

//去除表情组中重复表情
GM_registerMenuCommand("tiebaCustomFace--去除表情组中重复表情", function() {

});

//prev、next表情滚动条点击事件
var tabScroll = function() {}

//样式
var imgCss = 'IMG.faceImg\
{\
height:101% !important;\
padding:0px 2px 0px 2px !important;\
position:relative;\
bottom:-2px  !important;\
}';
GM_addStyle(imgCss);

var aditmenu = '#aditFaceMenu,#addFaceMenu,#deleteFaceMenu,#tab_MoveLeft,#tab_MoveRight,#getProfile,#loadProfile,#showFace\
{\
	width:50px !important;\
	height:20px!important;\
	position:absolute !important;\
	left:-48px !important;\
	bottom:10px !important;\
	font-size:20px;\
	color:#99C871;\
	border-radius:5px 0px 0px 5px;\
	background:#FAFAFA;\
	cursor:pointer;\
}\
#getProfile\
{\
	bottom:30px !important;\
}\
#loadProfile\
{\
	bottom:50px !important;\
}\
#aditFaceMenu\
{\
	bottom:70px !important;\
}\
#deleteFaceMenu\
{\
	bottom:90px !important;\
}\
#tab_MoveLeft\
{\
	bottom:110px !important;\
}\
#tab_MoveRight\
{\
	bottom:130px !important;\
}\
#showFace\
{\
	bottom:170px !important;\
}\
#settingmenu\
{\
	position:fixed !important;\
	bottom:280px !important;\
}\
.s_tab_btnbg{\
padding:0px 1px !important;\
}\
.faceImg\
{\
	height: auto !important;\
}\
IMG.faceImg:hover\
{\
	cursor:pointer !important;\
}\
.customSmily\
{\
}\
';
GM_addStyle(aditmenu);

//添加删除编辑框样式
var ccss = '\
	#Face_float\
	{\
		margin:auto;\
		width:801px;\
		height:360px;\
		background:#F9EED0;\
		border:solid #DFDFDF 10px;\
	}\
	#Face_floatedit\
	{\
		margin:auto;\
		border:none !important;\
		overflow:auto; \
  		width: 800px;\
  		resize: none;\
  		height: 360px;\
  		font-size:15px;\
  		color:black;\
 	}\
	#maxwindow\
	{\
		text-align:center;\
  		position: fixed;\
  		bottom: 0%;\
  		left: 0%;\
  		width: 100%;\
  		height: 100%;\
  		z-index: 65535 !important;\
  		background:white !important;\
  		opacity:.9;\
 	}\
 	.search_main_fixed\
 	{\
 		z-index:1 !important;\
 	}\
	#config\
	{\
		margin:auto;\
		height:50px;\
		display:block;\
		cursor:pointer;\
	}\
	#config span\
	{\
		position:relative;\
		top:20px;\
		margin-right:10px;\
		font-size:30px;\
		border:1px solid grey;\
		width:50px;\
		height:50px;\
	}\
	#tabSetting span\
	{\
		font-size:20px;\
		border:0px solid grey;\
		width:50px;\
		height:50px;\
		margin-right:15px;\
	}\
	#tabSetting input\
	{\
		color:green;\
	}';

//黑名单样式
var blistcss = '\
	#blist\
	{\
		position:fixed;\
		left:0px;\
		top:0px;\
		width:100%;\
		height:100%;\
		background:none;\
		z-index:55555;\
		text-align:center;\
	}\
	#blistdiv\
	{\
		margin: auto;\
		border:solid #DFDFDF 5px;\
		line-height:50px;\
		width:600px;\
		height:300px;\
		background:#F9EED0;\
		padding:5px;\
		text-align:center;\
	}\
	.blistElement\
	{\
		padding:0px 0px 4px 10px;\
		cursor:pointer;\
		width:50px;\
		height:20px;\
		font-size:20px;\
	}\
	.blisthide\
	{\
		color:#CEDECA;\
	}\
	#blistConfig\
	{\
		background:#CFDCC9;\
		padding:0px;\
		cursor:pointer;\
		border:white solid 2px;\
		width:50px;\
		height:20px;\
		font-size:20px;\
	}\
	';

//小脸数据导入支持(页面右下角)

function xiaolianLoad() {
    var xiaolian = function() {
        var a = prompt('输入小脸数据');
        if (a) {
            a = eval(a);
            for (var i = 0; i < a.length; i++)
                faces.push(new Face(a[i]['name'], a[i]['collection'], 8));
            saveFaces();
        }

    }
    $('#tab_forumname').after('<span id="xiaolian" width="40" height="40" style="position:fixed;right:0px;bottom:0px;cursor:pointer;">小脸导入</span>');
    var x = document.querySelector('#xiaolian');
    x.addEventListener('click', xiaolian, false);
}


//开始监听

//LZL表情按钮监听
var css;
//发帖框表情监听

function normal_Listener() {
    var a = document.querySelector('.edui-btn.edui-btn-emotion');
    if (a) {
        function m() {
            css = '.edui-container';
            if (document.querySelector('.edui-container li.s_tab_btn[data-index="1"]') && (!document.querySelector('.edui-container #smilyTab0'))) {
                $('.edui-container li.s_tab_btn[data-index="1"]').click();
                selector = $(css).find('.edui-dropdown-menu');
                addFaces();
                //a.removeEventListener("click",m,false);
            } else {
                setTimeout(m, 20);
            }
        }
        a.addEventListener("click", m, false);
    } else
        setTimeout(normal_Listener, 100);
}
//重写LZL表情监听,使用jquery似乎会因为GM API不允许unsafewindow导致setvalue和getvalue失效
var LZL_Listener = function(s) {
    var lzlAll = document.querySelectorAll(s);
    [].forEach.call(lzlAll, function(e) {
        function c1() {
            var c = document.querySelector('.insertsmiley_holder');
            if (c) {
                c.addEventListener('click', function() {
                    css = '.insertsmiley_holder';
                    (function c2() {
                        if (document.querySelector('.insertsmiley_holder .s_layer_table') && (!document.querySelector('.insertsmiley_holder #smilyTab0'))) {
                            selector = $(css).find('.layer_content');
                            addFaces();
                        } else
                            setTimeout(c2, 60);
                    })();
                });
            } else
                setTimeout(c1, 60);
        }
        e.addEventListener('click', c1, false);
    });
}

////开始监听
normal_Listener();
//LZL_Listener('DIV.j_lzl_r.p_reply');
//LZL_Listener('.j_lzl_p');
//LZL_Listener('.lzl_s_r');
addImgToCustomFace();
//xiaolianLoad();		//小脸导入函数,需要的自己取消注释,改完后刷新在页面右下角