123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- /*!
- * jQuery Sina Emotion v2.1.0
- * http://www.clanfei.com/
- *
- * Copyright 2012-2014 Lanfei
- * Released under the MIT license
- *
- * Date: 2014-05-19T20:10:23+0800
- */
- (function($) {
- var $target;
- var options;
- var emotions;
- var categories;
- var emotionsMap;
- var parsingArray = [];
- var defCategory = '默认';
- var initEvents = function() {
- $('body').bind({
- click: function() {
- $('#sinaEmotion').hide();
- }
- });
- $('#sinaEmotion').bind({
- click: function(event) {
- event.stopPropagation();
- }
- }).delegate('.prev', {
- click: function(event) {
- var page = $('#sinaEmotion .categories').data('page');
- showCatPage(page - 1);
- event.preventDefault();
- }
- }).delegate('.next', {
- click: function(event) {
- var page = $('#sinaEmotion .categories').data('page');
- showCatPage(page + 1);
- event.preventDefault();
- }
- }).delegate('.category', {
- click: function(event) {
- $('#sinaEmotion .categories .current').removeClass('current');
- showCategory($.trim($(this).addClass('current').text()));
- event.preventDefault();
- }
- }).delegate('.page', {
- click: function(event) {
- $('#sinaEmotion .pages .current').removeClass('current');
- var page = parseInt($(this).addClass('current').text() - 1);
- showFacePage(page);
- event.preventDefault();
- }
- }).delegate('.face', {
- click: function(event) {
- $('#sinaEmotion').hide();
- $target.insertText($(this).children('img').prop('alt'));
- event.preventDefault();
- }
- });
- };
- var loadEmotions = function(callback) {
- if(emotions){
- callback && callback();
- return;
- }
- if (!options) {
- options = $.fn.sinaEmotion.options;
- }
- emotions = {};
- categories = [];
- emotionsMap = {};
- $('body').append('<div id="sinaEmotion">正在加载,请稍后...</div>');
- initEvents();
- $.getJSON('https://api.weibo.com/2/emotions.json?callback=?', {
- source: options.appKey,
- language: options.language
- }, function(json) {
- var item, category;
- var data = json.data;
- $('#sinaEmotion').html('<div class="right"><a href="#" class="prev">«</a><a href="#" class="next">»</a></div><ul class="categories"></ul><ul class="faces"></ul><ul class="pages"></ul>');
- for (var i = 0, l = data.length; i < l; ++i) {
- item = data[i];
- category = item.category || defCategory;
- if (!emotions[category]) {
- emotions[category] = [];
- categories.push(category);
- }
- emotions[category].push({
- icon: item.icon,
- phrase: item.phrase
- });
- emotionsMap[item.phrase] = item.icon;
- }
- $(parsingArray).parseEmotion();
- parsingArray = null;
- callback && callback();
- });
- };
- var showCatPage = function(page) {
- var html = '';
- var length = categories.length;
- var maxPage = Math.ceil(length / 5);
- var $categories = $('#sinaEmotion .categories');
- var category = $categories.data('category') || defCategory;
- page = (page + maxPage) % maxPage;
- for (var i = page * 5; i < length && i < (page + 1) * 5; ++i) {
- html += '<li class="item"><a href="#" class="category' + (category == categories[i] ? ' current' : '') + '">' + categories[i] + '</a></li>';
- }
- $categories.data('page', page).html(html);
- };
- var showCategory = function(category) {
- $('#sinaEmotion .categories').data('category', category);
- showFacePage(0);
- showPages();
- };
- var showFacePage = function(page) {
- var face;
- var html = '';
- var pageHtml = '';
- var rows = options.rows;
- var category = $('#sinaEmotion .categories').data('category');
- var faces = emotions[category];
- page = page || 0;
- for (var i = page * rows, l = faces.length; i < l && i < (page + 1) * rows; ++i) {
- face = faces[i];
- html += '<li class="item"><a href="#" class="face"><img class="sina-emotion" src="' + face.icon + '" alt="' + face.phrase + '" /></a></li>';
- }
- $('#sinaEmotion .faces').html(html);
- };
- var showPages = function() {
- var html = '';
- var rows = options.rows;
- var category = $('#sinaEmotion .categories').data('category');
- var faces = emotions[category];
- var length = faces.length;
- if (length > rows) {
- for (var i = 0, l = Math.ceil(length / rows); i < l; ++i) {
- html += '<li class="item"><a href="#" class="page' + (i == 0 ? ' current' : '') + '">' + (i + 1) + '</a></li>';
- }
- $('#sinaEmotion .pages').html(html).show();
- } else {
- $('#sinaEmotion .pages').hide();
- }
- };
- /**
- * 为某个元素设置点击事件,点击弹出表情选择窗口
- * @param {[type]} target [description]
- * @return {[type]} [description]
- */
- $.fn.sinaEmotion = function(target) {
- target = target || function(){
- return $(this).parents('form').find('textarea,input[type=text]').eq(0);
- };
- var $that = $(this).last();
- var offset = $that.offset();
- if($that.is(':visible')){
- if(typeof target == 'function'){
- $target = target.call($that);
- }else{
- $target = $(target);
- }
- loadEmotions(function(){
- showCategory(defCategory);
- showCatPage(0);
- });
- $('#sinaEmotion').css({
- top: offset.top + $that.outerHeight() + 5,
- left: offset.left
- }).show();
- }
- return this;
- };
- $.fn.parseEmotion = function() {
- if(! categories){
- parsingArray = $(this);
- loadEmotions();
- }else if(categories.length == 0){
- parsingArray = parsingArray.add($(this));
- }else{
- $(this).each(function() {
- var $this = $(this);
- var html = $this.html();
- html = html.replace(/<.*?>/g, function($1) {
- $1 = $1.replace('[', '[');
- $1 = $1.replace(']', ']');
- return $1;
- }).replace(/\[[^\[\]]*?\]/g, function($1) {
- var url = emotionsMap[$1];
- if (url) {
- return '<img class="sina-emotion" src="' + url + '" alt="' + $1 + '" />';
- }
- return $1;
- });
- $this.html(html);
- });
- }
- return this;
- };
- $.fn.insertText = function(text) {
- this.each(function() {
- if (this.tagName !== 'INPUT' && this.tagName !== 'TEXTAREA') {
- return;
- }
- if (document.selection) {
- this.focus();
- var cr = document.selection.createRange();
- cr.text = text;
- cr.collapse();
- cr.select();
- } else if (this.selectionStart !== undefined) {
- var start = this.selectionStart;
- var end = this.selectionEnd;
- this.value = this.value.substring(0, start) + text + this.value.substring(end, this.value.length);
- this.selectionStart = this.selectionEnd = start + text.length;
- } else {
- this.value += text;
- }
- });
- return this;
- }
- $.fn.sinaEmotion.options = {
- rows: 72, // 每页显示的表情数
- language: 'cnname', // 简体(cnname)、繁体(twname)
- appKey: '1362404091' // 新浪微博开放平台的应用ID
- };
- })(jQuery);
|