busuanzi不显示问题

装好不算子,时而他就不显示了,像个幽灵一样.其实只要我们仔细分析,可以定位到问题的。

安装 busuanzi

next 主题集成了 busuanzi,我们只要在配置文件中把busuanzi_count打开即可

注意我们安装的是新版本,只要保证文件layout\_third-party\statistics\busuanzi-counter.njk里的网址是"https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"就行

不蒜子计数依赖于浏览器请求中的 Referer 信息来获取页面的访问量数据。如果你使用的浏览器具有阻止跨站追踪功能(例如 Safari),那么浏览器可能会忽略网站设定而使用最严格的 Referrer-Policy,导致加载的访问量数据不准确。另见 https://caniuse.com/referrer-policy

20220521163706

live2d 导致 busuanzi 不显示

正常情况下, busuanzi 会向 head 中 append 的一个 script 标签名为 scriptTag,用于加载数据;数据加载完成后,通过 scriptTag.parentElement.removeChild(scriptTag) 移除之;在启用 hexo-helper-live2d 时,scriptTag.parentElement 为 null (原因未知),导致 try catch 语句执行,通过 bszTag.hides() 将页面上的所有统计数据隐藏。

我个人没有兴趣继续研究此问题,目前只能建议不要同时使用 busuanzi 和 hexo-helper-live2d。考虑到此问题与 NexT 主题本身无关,请联系这两个项目的维护者讨论和解决。

可能导致 Hexo 或 NexT 出现问题的插件或服务

名称 问题描述 解决方案 Issue
hexo-helper-live2d 会导致不蒜子计数无法加载 不要同时使用 theme-next/hexo-theme-next#1233 (comment)
aplayer 导致中文目录无法点击 不要使用 aplayer DIYgod/APlayer#242

不显示问题解决 1

经查,不蒜子部分源码的 style 从 "display: inline;" 替换为了 "display: none;"

发现next\source\css\_common\components\post\post-header.stylnext\source\css\_common\outline\footer\index.styl中有设置"display: none;"

而 busuanzi 在界面中展示,是在layout\_partials\footer.njklayout\_partials\post\post-meta.njk中实现的,并且通过匹配 id,造成应用了 styl 中的不显示属性

于是,解决方案有两种,一个是把 styl 中的隐藏去掉,另一个,是把界面中的 id 改掉

第一种方案,对我们掌握到的源码来说有效,可以让 styl 失效.但是我们还有一个不可控因素,就是那个 busuanzi.ibruce.info 里的 js 文件.这个源码我们看不到,它很可能就会通过匹配 id 把属性又设置上去(已证实.即使我们把本地 css 去掉,只要一运行 js 文件,display-none 就又回来了)

所以,我们九八两个文件中的 id 改掉就好,在后面加一个 1 吧,哈哈 改成busuanzi_container_site_uv1busuanzi_container_page_pv1

注意,只需要修改 container,别把 value 改了,value 改了,它就找不到标签来显示数字了.因为 styl 是引用在 container 上的

不显示问题解决 2

将不蒜子的 js 插件保存到本地blog\source\js\busuanzi.pure.mini.js

如果使用的是来自外网的 js 文件,也下载到本地。将 js 文件更改为如下:

var bszCaller, bszTag;
!(function () {
var c,
d,
e,
a = !1,
b = [];
(ready = function (c) {
return (
a ||
"interactive" === document.readyState ||
"complete" === document.readyState
? c.call(document)
: b.push(function () {
return c.call(this);
}),
this
);
}),
(d = function () {
for (var a = 0, c = b.length; c > a; a++) b[a].apply(document);
b = [];
}),
(e = function () {
a ||
((a = !0),
d.call(window),
document.removeEventListener
? document.removeEventListener("DOMContentLoaded", e, !1)
: document.attachEvent &&
(document.detachEvent("onreadystatechange", e),
window == window.top && (clearInterval(c), (c = null))));
}),
document.addEventListener
? document.addEventListener("DOMContentLoaded", e, !1)
: document.attachEvent &&
(document.attachEvent("onreadystatechange", function () {
/loaded|complete/.test(document.readyState) && e();
}),
window == window.top &&
(c = setInterval(function () {
try {
a || document.documentElement.doScroll("left");
} catch (b) {
return;
}
e();
}, 5)));
})(),
(bszCaller = {
fetch: function (a, b) {
var c = "BusuanziCallback_" + Math.floor(1099511627776 * Math.random());
(window[c] = this.evalCall(b)),
(a = a.replace("=BusuanziCallback", "=" + c)),
(scriptTag = document.createElement("SCRIPT")),
(scriptTag.type = "text/javascript"),
(scriptTag.defer = !0),
(scriptTag.src = a),
(scriptTag.referrerPolicy = "no-referrer-when-downgrade"),
document.getElementsByTagName("HEAD")[0].appendChild(scriptTag);
},
evalCall: function (a) {
return function (b) {
ready(function () {
try {
a(b), scriptTag.parentElement.removeChild(scriptTag);
} catch (c) {
bszTag.hides();
}
});
};
},
}),
bszCaller.fetch(
"//busuanzi.ibruce.info/busuanzi?jsonpCallback=BusuanziCallback",
function (a) {
bszTag.texts(a), bszTag.shows();
}
),
(bszTag = {
bszs: ["site_pv", "page_pv", "site_uv"],
texts: function (a) {
this.bszs.map(function (b) {
var c = document.getElementById("busuanzi_value_" + b);
c && (c.innerHTML = a[b]);
});
},
hides: function () {
this.bszs.map(function (a) {
var b = document.getElementById("busuanzi_container_" + a);
b && (b.style.display = "");
});
},
shows: function () {
this.bszs.map(function (a) {
var b = document.getElementById("busuanzi_container_" + a);
b && (b.style.display = "inline");
});
},
});

操作其实就是把其中的 b.style.display="none"中 none 去掉。

再把themes/next/layout/_third-party/statistics/busuanzi-counter.njk中的busuanzi链接改为本地/js/busuanzi.pure.mini.js

最后把next\source\css\_common\components\post\post-header.stylnext\source\css\_common\outline\footer\index.styl中的"display: none;"改为"display: inline"