畅言目前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]
// 畅言emoji后台存储为: [emoji:d83cdfc6]
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"));
// 存储检测到的emoji至暂存列表
l.push(emoji)
}
// 将检测到的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")