畅言目前PC版的评论中无法正常显示emoji,大致搜了搜网上也没有相关的插件或者官方文档。大致的规划一下也就是写一段替换的代码,找到回调函数就完成了。本文在我也不知道愿不愿意透露姓名的陈大佬的指导下完成,我主要就是写了个测试环境,可以说非常愉快了。
本文主要列出替换的JS,简述了一下找回调函数的思路。
替换代码
畅言的emoji传到前台的数据是[emoji:d83cdfc6]格式。
所以我们需要做的就是把这一段文字转化成Unicode字符,这是个很简单的操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| divList = document.getElementById("SOHUCS").getElementsByClassName("wrap-word-gw"); for (var divIndex = 0; divIndex < divList.length; divIndex++) { div = divList[divIndex] for (var emoji, regex = /\[emoji:(.*?)\]/g, l = []; null != (n = regex.exec(div.innerHTML)); ) { f = "\\u" + n[1].substring(0, n[1].length / 2), s = "\\u" + n[1].substring(n[1].length / 2, n[1].length), emoji = f + s, emoji = unescape(emoji.replace(/\\u/g, "%u")); l.push(emoji) } for (var i = 0; i < l.length; i++) { div.innerHTML = div.innerHTML.replace(/\[emoji:(.*?)\]/, l[i]) } }
|
替换思路
下面问题就在于能不能找到回调函数,在评论载入完成后调用替换。
目前暂时没有找出可用的回调,现在最简单的使用window.onload = function(){}完成了替换。
所以目前的结果就是页面载入完成后替换,->这里<-是代码。
我发现upload/changyan.js中有changyan.api.ready的函数。
1 2 3 4
| window.changyan.api.ready = function(fn) { window.changyan.api.tmpHandles = window.changyan.api.tmpHandles || []; window.changyan.api.tmpHandles.push(fn); };
|
之后src/adapter.min.js中通过runReadyFn完成回调。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| var runReadyFn = function() { if (window.changyan.tmpHandles && window.changyan.tmpHandles.length) { for (var i = 0; i < window.changyan.tmpHandles.length; i++) { var _fn = window.changyan.tmpHandles[i]; _fn && _fn(); } window.changyan.tmpHandles = []; } }; window.changyan.rendered = false; $$event.listen("changyan:cmt-header:header-rendered", function() { if (!window.changyan.rendered) { runReadyFn(); window.changyan.rendered = true; } }); $$event.listen("changyan:mobile-cmt-list:list-render", function() { if (!window.changyan.rendered) { runReadyFn(); window.changyan.rendered = true; } }); $$event.listen("changyan:cmt-box:box-render", function() { if (!window.changyan.rendered) { runReadyFn(); window.changyan.rendered = true; } });
|
一点吐槽
在研究代码的过程当中,发现代码中还有残留下来的内容。
比如extensions/longloop.js中的:
1
| e("C:/Users/Yaodoggy/Documents/Program Files/Wamp/wamp/www-mdevp/mdevp/cache/www/longloop/longloop.js")
|