<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="/assets/rss-20b3285f.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>标签: live2d - ouuan's blog</title>
        <link>https://ouuan.moe/tag/live2d</link>
        <description>标签为 live2d 的文章 - ouuan 的博客</description>
        <lastBuildDate>Fri, 05 Aug 2022 05:55:15 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-CN</language>
        <copyright>Copyright © 2022 - 2026 ouuan
Licensed under CC BY-SA 4.0</copyright>
        <atom:link href="https://ouuan.moe/tag/live2d/feed.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[busuanzi 访问量统计与 live2d 插件同时使用导致 busuanzi 不显示的根本原因以及解决方法]]></title>
            <link>https://ouuan.moe/post/2022/08/busuanzi-and-live2d</link>
            <guid>https://ouuan.moe/post/2022/08/busuanzi-and-live2d</guid>
            <pubDate>Fri, 05 Aug 2022 05:55:15 GMT</pubDate>
            <description><![CDATA[<p>昨天在一位网友的 Hexo 博客遇到了很诡异的 busuanzi 访问量统计不显示问题<span class="mojikumi-line-end">，</span>经过一番研究发现是 busuanzi 代码的一处问题和 live2d 插件的一处问题凑在一起导致的<span class="mojikumi-line-end">。</span></p>
<p>今天在写博客之前先搜了一下 <span class="mojikumi">“</span>busuanzi live2d<span class="mojikumi">”</span><span class="mojikumi-line-end">，</span>发现搜出来一堆结果<span class="mojikumi-line-end">，</span>我还以为我白研究了..结果点进去一看<span class="mojikumi-line-end">，</span>第一页结果里没有一个指出了问题的根本原因<span class="mojikumi-line-end">，</span>而且修复方法基本上都是删 feature 或者换组件<span class="mojikumi-line-end">，</span>但实际上只要知道问题的根本原因就可以在不妨碍正常功能运作的前提下进行修复<span class="mojikumi-line-end">。</span>所以昨天晚上没白忙活<span class="mojikumi-line-end">，</span>我这篇博客还是要写的<span class="mojikumi-line-end">。</span></p>
]]></description>
            <content:encoded><![CDATA[<p>昨天在一位网友的 Hexo 博客遇到了很诡异的 busuanzi 访问量统计不显示问题<span class="mojikumi-line-end">，</span>经过一番研究发现是 busuanzi 代码的一处问题和 live2d 插件的一处问题凑在一起导致的<span class="mojikumi-line-end">。</span></p>
<p>今天在写博客之前先搜了一下 <span class="mojikumi">“</span>busuanzi live2d<span class="mojikumi">”</span><span class="mojikumi-line-end">，</span>发现搜出来一堆结果<span class="mojikumi-line-end">，</span>我还以为我白研究了..结果点进去一看<span class="mojikumi-line-end">，</span>第一页结果里没有一个指出了问题的根本原因<span class="mojikumi-line-end">，</span>而且修复方法基本上都是删 feature 或者换组件<span class="mojikumi-line-end">，</span>但实际上只要知道问题的根本原因就可以在不妨碍正常功能运作的前提下进行修复<span class="mojikumi-line-end">。</span>所以昨天晚上没白忙活<span class="mojikumi-line-end">，</span>我这篇博客还是要写的<span class="mojikumi-line-end">。</span></p>

<p>当然<span class="mojikumi-line-end">，</span>我只看了第一页搜索结果<span class="mojikumi-line-end">，</span>可能有更深入研究的文章被搜索引擎埋没了<span class="mojikumi-line-end">，</span>我这篇文章说不定也不会被搜到<span class="mojikumi-line-end">，</span>只不过既然第一页没有<span class="mojikumi-line-end">，</span>就让我也来成为被搜索引擎埋没的一员<span class="mojikumi-line-end">，</span>这样的话说不定被搜到的可能性就增加了<span class="mojikumi-line-start">（</span></p>
<h2 id="问题描述" class="heading"><a href="#问题描述" class="heading-anchor" aria-label="章节： 问题描述" tabindex="-1"></a><span>问题描述</span></h2>
<p>在一个同时启用了 busuanzi 访问量统计和 live2d 插件的 Hexo 博客里<span class="mojikumi-line-end">，</span>访问或刷新博客时有大概率 busuanzi 会被隐藏<span class="mojikumi-line-end">。</span></p>
<p>被隐藏的具体表现为<span class="mojikumi-line-end">，</span>刷新的瞬间 id 为 <code>busuanzi_<wbr>container_<wbr>*</code> 的容器是显示的<span class="mojikumi-line-end">，</span>然后容器的样式很快被设为 <code>display: none</code><span class="mojikumi-line-end">。</span></p>
<p>查看 F12 的 Network<span class="mojikumi-line-end">，</span>busuanzi 相关请求正常返回<span class="mojikumi-line-end">；</span>console 中没有报错<span class="mojikumi-line-end">。</span></p>
<h2 id="问题定位" class="heading"><a href="#问题定位" class="heading-anchor" aria-label="章节： 问题定位" tabindex="-1"></a><span>问题定位</span></h2>
<p>注<span class="mojikumi-line-end">：</span>这个过程中我也走了一些弯路<span class="mojikumi-line-end">，</span>就不写出来了<span class="mojikumi-line-end">。</span></p>
<h3 id="设置-display-none-的定位" class="heading"><a href="#设置-display-none-的定位" class="heading-anchor" aria-label="章节： 设置 display: none 的定位" tabindex="-1"></a><span>设置 <code>display: none</code> 的定位</span></h3>
<p>查看 <a href="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js">busuanzi.pure.mini.js</a><span class="mojikumi-line-end">，</span>发现 <code>display: none</code> 在 <code>hides</code> 函数中被设置<span class="mojikumi-line-end">：</span></p>
<section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h4 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="JavaScript 代码块" data-v-c675dba6>JavaScript</h4><ile-root id="ile-1"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-1--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #403F53">hides: </span><span style="color: #994CC3">function</span><span style="color: #111111">()</span><span style="color: #403F53"> {</span></span>
<span><span style="color: #403F53">  </span><span style="color: #0C969B">this</span><span style="color: #994CC3">.</span><span style="color: #111111">bszs</span><span style="color: #994CC3">.</span><span style="color: #4876D6">map</span><span style="color: #403F53">(</span><span style="color: #994CC3">function</span><span style="color: #111111">(</span><span style="color: #403F53">a</span><span style="color: #111111">)</span><span style="color: #403F53"> {</span></span>
<span><span style="color: #403F53">    </span><span style="color: #994CC3">var </span><span style="color: #403F53">b</span><span style="color: #994CC3"> = </span><span style="color: #0C969B">document</span><span style="color: #994CC3">.</span><span style="color: #4876D6">getElementById</span><span style="color: #403F53">(</span><span style="color: #111111">&quot;</span><span style="color: #C96765">busuanzi_container_</span><span style="color: #111111">&quot;</span><span style="color: #994CC3"> + </span><span style="color: #403F53">a);</span></span>
<span><span style="color: #403F53">    b </span><span style="color: #994CC3">&amp;&amp;</span><span style="color: #403F53"> (</span><span style="color: #0C969B">b</span><span style="color: #994CC3">.</span><span style="color: #111111">style</span><span style="color: #994CC3">.</span><span style="color: #0C969B">display</span><span style="color: #403F53"> </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #111111">&quot;</span><span style="color: #C96765">none</span><span style="color: #111111">&quot;</span><span style="color: #403F53">)</span></span>
<span><span style="color: #403F53">  })</span></span>
<span><span style="color: #403F53">},</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #D6DEEB">hides: </span><span style="color: #C792EA">function</span><span style="color: #D9F5DD">()</span><span style="color: #D6DEEB"> {</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #7FDBCA">this</span><span style="color: #C792EA">.</span><span style="color: #FAF39F">bszs</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">map</span><span style="color: #D6DEEB">(</span><span style="color: #C792EA">function</span><span style="color: #D9F5DD">(</span><span style="color: #D7DBE0">a</span><span style="color: #D9F5DD">)</span><span style="color: #D6DEEB"> {</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C792EA">var </span><span style="color: #D7DBE0">b</span><span style="color: #C792EA"> = </span><span style="color: #7FDBCA">document</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">getElementById</span><span style="color: #D6DEEB">(</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">busuanzi_container_</span><span style="color: #D9F5DD">&quot;</span><span style="color: #C792EA"> + </span><span style="color: #D7DBE0">a</span><span style="color: #D6DEEB">);</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #D7DBE0">b</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">&amp;&amp;</span><span style="color: #D6DEEB"> (</span><span style="color: #7FDBCA">b</span><span style="color: #C792EA">.</span><span style="color: #FAF39F">style</span><span style="color: #C792EA">.</span><span style="color: #7FDBCA">display</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">none</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">)</span></span>
<span><span style="color: #D6DEEB">  })</span></span>
<span><span style="color: #D6DEEB">},</span></span></code></pre></div></section>
<p>而 hides 函数仅在一处被调用<span class="mojikumi-line-end">：</span></p>
<section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h4 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="JavaScript 代码块" data-v-c675dba6>JavaScript</h4><ile-root id="ile-2"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-2--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #994CC3">try</span><span style="color: #403F53"> {</span></span>
<span><span style="color: #403F53">  </span><span style="color: #4876D6">a</span><span style="color: #403F53">(b), </span><span style="color: #0C969B">scriptTag</span><span style="color: #994CC3">.</span><span style="color: #111111">parentElement</span><span style="color: #994CC3">.</span><span style="color: #4876D6">removeChild</span><span style="color: #403F53">(scriptTag)</span></span>
<span><span style="color: #403F53">} </span><span style="color: #994CC3">catch</span><span style="color: #403F53"> (c) {</span></span>
<span><span style="color: #403F53">  </span><span style="color: #0C969B">bszTag</span><span style="color: #994CC3">.</span><span style="color: #4876D6">hides</span><span style="color: #403F53">()</span></span>
<span><span style="color: #403F53">}</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #C792EA">try</span><span style="color: #D6DEEB"> {</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #82AAFF">a</span><span style="color: #D6DEEB">(</span><span style="color: #D7DBE0">b</span><span style="color: #D6DEEB">), </span><span style="color: #7FDBCA">scriptTag</span><span style="color: #C792EA">.</span><span style="color: #FAF39F">parentElement</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">removeChild</span><span style="color: #D6DEEB">(</span><span style="color: #D7DBE0">scriptTag</span><span style="color: #D6DEEB">)</span></span>
<span><span style="color: #D6DEEB">} </span><span style="color: #C792EA">catch</span><span style="color: #D6DEEB"> (</span><span style="color: #D7DBE0">c</span><span style="color: #D6DEEB">) {</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #7FDBCA">bszTag</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">hides</span><span style="color: #D6DEEB">()</span></span>
<span><span style="color: #D6DEEB">}</span></span></code></pre></div></section>
<p>所以是在 <code>a<wbr>(<wbr>b<wbr>), <wbr>scriptTag<wbr>.<wbr>parentElement<wbr>.<wbr>removeChild<wbr>(<wbr>scriptTag<wbr>)</code> 抛出异常时容器被隐藏<span class="mojikumi-line-end">。</span></p>
<h3 id="异常原因的定位" class="heading"><a href="#异常原因的定位" class="heading-anchor" aria-label="章节： 异常原因的定位" tabindex="-1"></a><span>异常原因的定位</span></h3>
<p>由于在其它地方的 busuanzi 不会出现这一问题<span class="mojikumi-line-end">，</span>而问题的原因还完全不清楚<span class="mojikumi-line-end">，</span>为了尽可能还原原始环境以复现问题<span class="mojikumi-line-end">，</span>我选择了使用 <a href="https://addons.mozilla.org/zh-CN/firefox/addon/header-editor/">Firefox 的 Header Editor 插件</a> 直接在原博客进行测试<span class="mojikumi-line-end">。</span>具体来说<span class="mojikumi-line-end">，</span>就是在本地复制一份 busuanzi 的代码<span class="mojikumi-line-end">，</span>然后跑一个 http server<span class="mojikumi-line-end">，</span>在 Header Editor 里把 busuanzi 代码的请求重定向到本地的 http server<span class="mojikumi-line-end">。</span></p>
<p>首先<span class="mojikumi-line-end">，</span>在 <code>catch</code> 中添加 <code>console<wbr>.<wbr>error<wbr>(<wbr>c<wbr>)</code><span class="mojikumi-line-end">，</span>得到错误内容 <code>TypeError<wbr>: <wbr>scriptTag<wbr>.<wbr>parentElement<wbr> <wbr>is<wbr> <wbr>null</code><span class="mojikumi-line-end">。</span></p>
<p>查看代码中 <code>scriptTag</code> 相关的部分<span class="mojikumi-line-end">：</span></p>
<section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h4 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="JavaScript 代码块" data-v-c675dba6>JavaScript</h4><ile-root id="ile-3"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-3--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #403F53">scriptTag </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #0C969B">document</span><span style="color: #994CC3">.</span><span style="color: #4876D6">createElement</span><span style="color: #403F53">(</span><span style="color: #111111">&quot;</span><span style="color: #C96765">SCRIPT</span><span style="color: #111111">&quot;</span><span style="color: #403F53">), </span><span style="color: #0C969B">scriptTag</span><span style="color: #994CC3">.</span><span style="color: #0C969B">type</span><span style="color: #403F53"> </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #111111">&quot;</span><span style="color: #C96765">text/javascript</span><span style="color: #111111">&quot;</span><span style="color: #403F53">, </span><span style="color: #0C969B">scriptTag</span><span style="color: #994CC3">.</span><span style="color: #0C969B">defer</span><span style="color: #403F53"> </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #994CC3">!</span><span style="color: #AA0982">0</span><span style="color: #403F53">, </span><span style="color: #0C969B">scriptTag</span><span style="color: #994CC3">.</span><span style="color: #0C969B">src</span><span style="color: #403F53"> </span><span style="color: #994CC3">=</span><span style="color: #403F53"> a, </span><span style="color: #0C969B">scriptTag</span><span style="color: #994CC3">.</span><span style="color: #0C969B">referrerPolicy</span><span style="color: #403F53"> </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #111111">&quot;</span><span style="color: #C96765">no-referrer-when-downgrade</span><span style="color: #111111">&quot;</span><span style="color: #403F53">, </span><span style="color: #0C969B">document</span><span style="color: #994CC3">.</span><span style="color: #4876D6">getElementsByTagName</span><span style="color: #403F53">(</span><span style="color: #111111">&quot;</span><span style="color: #C96765">HEAD</span><span style="color: #111111">&quot;</span><span style="color: #403F53">)[</span><span style="color: #AA0982">0</span><span style="color: #403F53">]</span><span style="color: #994CC3">.</span><span style="color: #4876D6">appendChild</span><span style="color: #403F53">(scriptTag)</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #D7DBE0">scriptTag</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">document</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">createElement</span><span style="color: #D6DEEB">(</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">SCRIPT</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">), </span><span style="color: #7FDBCA">scriptTag</span><span style="color: #C792EA">.</span><span style="color: #7FDBCA">type</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">text/javascript</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">, </span><span style="color: #7FDBCA">scriptTag</span><span style="color: #C792EA">.</span><span style="color: #7FDBCA">defer</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">!</span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">, </span><span style="color: #7FDBCA">scriptTag</span><span style="color: #C792EA">.</span><span style="color: #7FDBCA">src</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #D7DBE0">a</span><span style="color: #D6DEEB">, </span><span style="color: #7FDBCA">scriptTag</span><span style="color: #C792EA">.</span><span style="color: #7FDBCA">referrerPolicy</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">no-referrer-when-downgrade</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">, </span><span style="color: #7FDBCA">document</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">getElementsByTagName</span><span style="color: #D6DEEB">(</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">HEAD</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">)[</span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">]</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">appendChild</span><span style="color: #D6DEEB">(</span><span style="color: #D7DBE0">scriptTag</span><span style="color: #D6DEEB">)</span></span></code></pre></div></section>
<p>所以<span class="mojikumi-line-end">，</span>再在 <code>catch</code> 中添加 <code class="break-all">s = document.querySelector("[src*=BusuanziCallback]"); console.log(s.parentElement);</code><span class="mojikumi-line-end">，</span>发现 <code>s<wbr>.<wbr>parentElement</code> 不是 <code>null</code><span class="mojikumi-line-end">。</span></p>
<p>再添加 <code>console<wbr>.<wbr>log<wbr>(<wbr>s<wbr> === <wbr>scriptTag<wbr>)</code><span class="mojikumi-line-end">，</span>发现结果是 <code>s</code> 和 <code>scriptTag</code> 不同<span class="mojikumi-line-end">，</span>所以原因在于此时的 <code>scriptTag</code> 变量已经不指向 DOM 中的这个元素了<span class="mojikumi-line-end">。</span></p>
<h3 id="定位到-live2d-插件" class="heading"><a href="#定位到-live2d-插件" class="heading-anchor" aria-label="章节： 定位到 live2d 插件" tabindex="-1"></a><span>定位到 live2d 插件</span></h3>
<p>此时我原本是没有任何头绪的<span class="mojikumi-line-end">，</span>但我发现<span class="mojikumi-line-end">，</span>并不是每次刷新页面都会触发这一问题<span class="mojikumi-line-end">，</span>所以没有触发问题时和触发问题时的差别就成了问题的突破口<span class="mojikumi-line-end">。</span></p>
<p>经过多次刷新<span class="mojikumi-line-end">，</span>我发现<span class="mojikumi-line-end">，</span>有一串 console 输出<span class="mojikumi-line-end">，</span>在出现问题时总位于我在 <code>catch</code> 中添加的调试信息之前<span class="mojikumi-line-end">，</span>而在没出现问题时则位于调试信息之后<span class="mojikumi-line-end">：</span></p>
<section class="code-block relative my-6 shadow" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h4 class="text-3 text-footer" aria-label="plain text 代码块" data-v-c675dba6>plain text</h4><ile-root id="ile-4"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-4--></div><div class="dark:hidden" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><samp><span><span style="color: #403f53">Live2D 2.1.00_1 live2d.core.js:5925:16</span></span>
<span><span style="color: #403f53">profile : Desktop live2d.core.js:5913:16</span></span>
<span><span style="color: #403f53">  [PROFILE_NAME] = Desktop live2d.core.js:5918:20</span></span>
<span><span style="color: #403f53">  [USE_ADJUST_TRANSLATION] = false live2d.core.js:5918:20</span></span>
<span><span style="color: #403f53">  [USE_CACHED_POLYGON_IMAGE] = false live2d.core.js:5918:20</span></span>
<span><span style="color: #403f53">  [EXPAND_W] = 2</span></span></samp></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><samp><span><span style="color: #d6deeb">Live2D 2.1.00_1 live2d.core.js:5925:16</span></span>
<span><span style="color: #d6deeb">profile : Desktop live2d.core.js:5913:16</span></span>
<span><span style="color: #d6deeb">  [PROFILE_NAME] = Desktop live2d.core.js:5918:20</span></span>
<span><span style="color: #d6deeb">  [USE_ADJUST_TRANSLATION] = false live2d.core.js:5918:20</span></span>
<span><span style="color: #d6deeb">  [USE_CACHED_POLYGON_IMAGE] = false live2d.core.js:5918:20</span></span>
<span><span style="color: #d6deeb">  [EXPAND_W] = 2</span></span></samp></pre></div></section>
<p>多亏了 live2d 的这串输出<span class="mojikumi-line-end">，</span>我得以将问题定位到 live2d 插件上<span class="mojikumi-line-end">。</span></p>
<p>实际上<span class="mojikumi-line-end">，</span>如果没有这些 console 输出<span class="mojikumi-line-end">，</span>也可以通过 <code>&#x3C;head></code> 中 <code>L2Dwidget<wbr>.<wbr>0<wbr>.<wbr>min<wbr>.<wbr>js</code> 和 <code class="break-all">busuanzi?jsonpCallback=BusuanziCallback</code> 两个 <code>&#x3C;script></code> 的相对位置发现问题<span class="mojikumi-line-end">，</span>只不过这样的话就更隐蔽更难发现了<span class="mojikumi-line-end">。</span></p>
<h3 id="在-live2d-插件中定位问题" class="heading"><a href="#在-live2d-插件中定位问题" class="heading-anchor" aria-label="章节： 在 live2d 插件中定位问题" tabindex="-1"></a><span>在 live2d 插件中定位问题</span></h3>
<p>在 <code>L2Dwidget<wbr>.<wbr>min<wbr>.<wbr>js</code> 的第一行有源码地址以及时间<span class="mojikumi-line-end">：</span><code>/*! <wbr>https<wbr>://<wbr>github<wbr>.<wbr>com<wbr>/<wbr>xiazeyu<wbr>/<wbr>live2d<wbr>-<wbr>widget<wbr>.<wbr>js<wbr> <wbr>built<wbr>@<wbr>2019<wbr>-<wbr>4<wbr>-<wbr>6<wbr> <wbr>09<wbr>:<wbr>38<wbr>:<wbr>17<wbr> */</code></p>
<p>因为注释中给出的时间不是最新版本<span class="mojikumi-line-end">，</span>先查看 git log 并 checkout 到相应时间的版本<span class="mojikumi-line-end">。</span></p>
<p>既然问题在于 <code>&#x3C;script></code> 元素被重新创建而导致原变量不指向 DOM 中元素<span class="mojikumi-line-end">，</span>就在代码中 grep <code>head</code><span class="mojikumi-line-end">，</span>然后发现 <a href="https://github.com/xiazeyu/live2d-widget.js/blob/fa8f2d831a1a9e96cd85bd1ef593a3336aeac720/src/dialog/index.js#L4-L38">问题代码</a><span class="mojikumi-line-end">：</span><code>document<wbr>.<wbr>head<wbr>.<wbr>innerHTML<wbr> += ……</code></p>
<p>至此<span class="mojikumi-line-end">，</span>问题原因已发现<span class="mojikumi-line-end">，</span>就是 live2d 插件通过修改 <code>document<wbr>.<wbr>head<wbr>.<wbr>innerHTML</code> 来添加样式<span class="mojikumi-line-end">，</span>导致 busuanzi 的 <code>scriptTag</code> 变量指向的不再是 DOM 中的 <code>&#x3C;script></code> 元素<span class="mojikumi-line-end">。</span></p>
<p>实际上<span class="mojikumi-line-end">，</span>live2d 插件的这一问题 <a href="https://github.com/xiazeyu/live2d-widget.js/pull/61">已经修复</a><span class="mojikumi-line-end">，</span>但需要使用新版才行<span class="mojikumi-line-end">。</span></p>
<h2 id="解决方法" class="heading"><a href="#解决方法" class="heading-anchor" aria-label="章节： 解决方法" tabindex="-1"></a><span>解决方法</span></h2>
<h3 id="修改-busuanzi-的解决方法" class="heading"><a href="#修改-busuanzi-的解决方法" class="heading-anchor" aria-label="章节： 修改 busuanzi 的解决方法" tabindex="-1"></a><span>修改 busuanzi 的解决方法</span></h3>
<p>因为 busuanzi 的代码较短<span class="mojikumi-line-end">，</span>而且本来就是用的外部的代码<span class="mojikumi-line-end">，</span>改起来比较容易<span class="mojikumi-line-end">。</span></p>
<p>把 <code>scriptTag<wbr>.<wbr>parentElement<wbr>.<wbr>removeChild<wbr>(<wbr>scriptTag<wbr>)</code> 修改为 <code class="break-all">s=document.querySelector('[src*=BusuanziCallback]'),s.parentElement.removeChild(s)</code> 即可<span class="mojikumi-line-end">。</span>可以把修改后的静态文件放在博客里<span class="mojikumi-line-end">，</span>然后修改 busuanzi <code>&#x3C;script></code> 的 <code>src</code><span class="mojikumi-line-end">。</span></p>
<a id="相关代码" name="相关代码" aria-hidden="true"></a>
<aside role="note" data-v-a2ab257f><details class="shadow-md rd-1 b-l-6 my-6 bg-blue-1 dark:bg-blue-9 b-blue" data-v-a2ab257f><summary class="p-3 flex justify-between items-center cursor-pointer" data-v-a2ab257f><h4 class="flex items-center gap-1 font-bold" data-v-a2ab257f><span class="text-5 i-mdi-pencil text-blue" data-v-a2ab257f></span><span class="sr-only" data-v-a2ab257f>Note: </span><span data-v-a2ab257f>相关代码</span></h4><span class="details-icon text-5" data-v-a2ab257f></span></summary><div class="overflow-auto rd-br-1 bg-card px-6 dark:bg-bghover" data-v-a2ab257f><p>修改后的 busuanzi 代码<span class="mojikumi-line-start">（</span>还在 <code>catch</code> 里加了个 <code>console<wbr>.<wbr>error</code><span class="mojikumi">）</span><span class="mojikumi-line-end">：</span></p><section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h5 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="JavaScript 代码块" data-v-c675dba6>JavaScript</h5><ile-root id="ile-5"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-5--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #994CC3">var </span><span style="color: #403F53">bszCaller</span><span style="color: #994CC3">,</span><span style="color: #403F53">bszTag;</span><span style="color: #994CC3">!function</span><span style="color: #111111">()</span><span style="color: #403F53">{</span><span style="color: #994CC3">var </span><span style="color: #403F53">c</span><span style="color: #5F7E97">,</span><span style="color: #403F53">d</span><span style="color: #5F7E97">,</span><span style="color: #403F53">e</span><span style="color: #5F7E97">,</span><span style="color: #403F53">a</span><span style="color: #994CC3">=!</span><span style="color: #AA0982">1</span><span style="color: #5F7E97">,</span><span style="color: #403F53">b</span><span style="color: #994CC3">=</span><span style="color: #403F53">[];</span><span style="color: #4876D6">ready</span><span style="color: #994CC3">=function</span><span style="color: #111111">(</span><span style="color: #403F53">c</span><span style="color: #111111">)</span><span style="color: #403F53">{</span><span style="color: #994CC3">return</span><span style="color: #403F53"> a</span><span style="color: #994CC3">||</span><span style="color: #111111">&quot;</span><span style="color: #C96765">interactive</span><span style="color: #111111">&quot;</span><span style="color: #994CC3">===</span><span style="color: #0C969B">document</span><span style="color: #994CC3">.</span><span style="color: #0C969B">readyState</span><span style="color: #994CC3">||</span><span style="color: #111111">&quot;</span><span style="color: #C96765">complete</span><span style="color: #111111">&quot;</span><span style="color: #994CC3">===</span><span style="color: #0C969B">document</span><span style="color: #994CC3">.</span><span style="color: #0C969B">readyState</span><span style="color: #994CC3">?</span><span style="color: #0C969B">c</span><span style="color: #994CC3">.</span><span style="color: #4876D6">call</span><span style="color: #403F53">(document)</span><span style="color: #994CC3">:</span><span style="color: #0C969B">b</span><span style="color: #994CC3">.</span><span style="color: #4876D6">push</span><span style="color: #403F53">(</span><span style="color: #994CC3">function</span><span style="color: #111111">()</span><span style="color: #403F53">{</span><span style="color: #994CC3">return</span><span style="color: #403F53"> </span><span style="color: #0C969B">c</span><span style="color: #994CC3">.</span><span style="color: #4876D6">call</span><span style="color: #403F53">(</span><span style="color: #0C969B">this</span><span style="color: #403F53">)})</span><span style="color: #5F7E97">,</span><span style="color: #0C969B">this</span><span style="color: #403F53">}</span><span style="color: #5F7E97">,</span><span style="color: #4876D6">d</span><span style="color: #994CC3">=function</span><span style="color: #111111">()</span><span style="color: #403F53">{</span><span style="color: #994CC3">for</span><span style="color: #403F53">(</span><span style="color: #994CC3">var </span><span style="color: #403F53">a</span><span style="color: #994CC3">=</span><span style="color: #AA0982">0</span><span style="color: #5F7E97">,</span><span style="color: #403F53">c</span><span style="color: #994CC3">=</span><span style="color: #0C969B">b</span><span style="color: #994CC3">.</span><span style="color: #0C969B">length</span><span style="color: #403F53">;c</span><span style="color: #994CC3">&gt;</span><span style="color: #403F53">a;a</span><span style="color: #994CC3">++</span><span style="color: #403F53">)b[a]</span><span style="color: #994CC3">.</span><span style="color: #4876D6">apply</span><span style="color: #403F53">(document);b</span><span style="color: #994CC3">=</span><span style="color: #403F53">[]}</span><span style="color: #5F7E97">,</span><span style="color: #4876D6">e</span><span style="color: #994CC3">=function</span><span style="color: #111111">()</span><span style="color: #403F53">{a</span><span style="color: #994CC3">||</span><span style="color: #403F53">(a</span><span style="color: #994CC3">=!</span><span style="color: #AA0982">0</span><span style="color: #5F7E97">,</span><span style="color: #0C969B">d</span><span style="color: #994CC3">.</span><span style="color: #4876D6">call</span><span style="color: #403F53">(window)</span><span style="color: #5F7E97">,</span><span style="color: #0C969B">document</span><span style="color: #994CC3">.</span><span style="color: #0C969B">removeEventListener</span><span style="color: #994CC3">?</span><span style="color: #0C969B">document</span><span style="color: #994CC3">.</span><span style="color: #4876D6">removeEventListener</span><span style="color: #403F53">(</span><span style="color: #111111">&quot;</span><span style="color: #C96765">DOMContentLoaded</span><span style="color: #111111">&quot;</span><span style="color: #5F7E97">,</span><span style="color: #403F53">e</span><span style="color: #5F7E97">,</span><span style="color: #994CC3">!</span><span style="color: #AA0982">1</span><span style="color: #403F53">)</span><span style="color: #994CC3">:</span><span style="color: #0C969B">document</span><span style="color: #994CC3">.</span><span style="color: #0C969B">attachEvent</span><span style="color: #994CC3">&amp;&amp;</span><span style="color: #403F53">(</span><span style="color: #0C969B">document</span><span style="color: #994CC3">.</span><span style="color: #4876D6">detachEvent</span><span style="color: #403F53">(</span><span style="color: #111111">&quot;</span><span style="color: #C96765">onreadystatechange</span><span style="color: #111111">&quot;</span><span style="color: #5F7E97">,</span><span style="color: #403F53">e)</span><span style="color: #5F7E97">,</span><span style="color: #403F53">window</span><span style="color: #994CC3">==</span><span style="color: #0C969B">window</span><span style="color: #994CC3">.</span><span style="color: #0C969B">top</span><span style="color: #994CC3">&amp;&amp;</span><span style="color: #403F53">(</span><span style="color: #4876D6">clearInterval</span><span style="color: #403F53">(c)</span><span style="color: #5F7E97">,</span><span style="color: #403F53">c</span><span style="color: #994CC3">=</span><span style="color: #BC5454">null</span><span style="color: #403F53">)))}</span><span style="color: #5F7E97">,</span><span style="color: #0C969B">document</span><span style="color: #994CC3">.</span><span style="color: #0C969B">addEventListener</span><span style="color: #994CC3">?</span><span style="color: #0C969B">document</span><span style="color: #994CC3">.</span><span style="color: #4876D6">addEventListener</span><span style="color: #403F53">(</span><span style="color: #111111">&quot;</span><span style="color: #C96765">DOMContentLoaded</span><span style="color: #111111">&quot;</span><span style="color: #5F7E97">,</span><span style="color: #403F53">e</span><span style="color: #5F7E97">,</span><span style="color: #994CC3">!</span><span style="color: #AA0982">1</span><span style="color: #403F53">)</span><span style="color: #994CC3">:</span><span style="color: #0C969B">document</span><span style="color: #994CC3">.</span><span style="color: #0C969B">attachEvent</span><span style="color: #994CC3">&amp;&amp;</span><span style="color: #403F53">(</span><span style="color: #0C969B">document</span><span style="color: #994CC3">.</span><span style="color: #4876D6">attachEvent</span><span style="color: #403F53">(</span><span style="color: #111111">&quot;</span><span style="color: #C96765">onreadystatechange</span><span style="color: #111111">&quot;</span><span style="color: #5F7E97">,</span><span style="color: #994CC3">function</span><span style="color: #111111">()</span><span style="color: #403F53">{</span><span style="color: #111111">/</span><span style="color: #5CA7E4">loaded</span><span style="color: #0C969B">|</span><span style="color: #5CA7E4">complete</span><span style="color: #111111">/</span><span style="color: #994CC3">.</span><span style="color: #4876D6">test</span><span style="color: #403F53">(</span><span style="color: #0C969B">document</span><span style="color: #994CC3">.</span><span style="color: #0C969B">readyState</span><span style="color: #403F53">)</span><span style="color: #994CC3">&amp;&amp;</span><span style="color: #4876D6">e</span><span style="color: #403F53">()})</span><span style="color: #5F7E97">,</span><span style="color: #403F53">window</span><span style="color: #994CC3">==</span><span style="color: #0C969B">window</span><span style="color: #994CC3">.</span><span style="color: #0C969B">top</span><span style="color: #994CC3">&amp;&amp;</span><span style="color: #403F53">(c</span><span style="color: #994CC3">=</span><span style="color: #4876D6">setInterval</span><span style="color: #403F53">(</span><span style="color: #994CC3">function</span><span style="color: #111111">()</span><span style="color: #403F53">{</span><span style="color: #994CC3">try</span><span style="color: #403F53">{a</span><span style="color: #994CC3">||</span><span style="color: #0C969B">document</span><span style="color: #994CC3">.</span><span style="color: #111111">documentElement</span><span style="color: #994CC3">.</span><span style="color: #4876D6">doScroll</span><span style="color: #403F53">(</span><span style="color: #111111">&quot;</span><span style="color: #C96765">left</span><span style="color: #111111">&quot;</span><span style="color: #403F53">)}</span><span style="color: #994CC3">catch</span><span style="color: #403F53">(b){</span><span style="color: #994CC3">return</span><span style="color: #403F53">}</span><span style="color: #4876D6">e</span><span style="color: #403F53">()}</span><span style="color: #5F7E97">,</span><span style="color: #AA0982">5</span><span style="color: #403F53">)))}(),bszCaller</span><span style="color: #994CC3">=</span><span style="color: #403F53">{</span><span style="color: #4876D6">fetch</span><span style="color: #403F53">:</span><span style="color: #994CC3">function</span><span style="color: #111111">(</span><span style="color: #403F53">a,b</span><span style="color: #111111">)</span><span style="color: #403F53">{</span><span style="color: #994CC3">var </span><span style="color: #403F53">c</span><span style="color: #994CC3">=</span><span style="color: #111111">&quot;</span><span style="color: #C96765">BusuanziCallback_</span><span style="color: #111111">&quot;</span><span style="color: #994CC3">+</span><span style="color: #0C969B">Math</span><span style="color: #994CC3">.</span><span style="color: #4876D6">floor</span><span style="color: #403F53">(</span><span style="color: #AA0982">1099511627776</span><span style="color: #994CC3">*</span><span style="color: #0C969B">Math</span><span style="color: #994CC3">.</span><span style="color: #4876D6">random</span><span style="color: #403F53">());window[c]</span><span style="color: #994CC3">=</span><span style="color: #0C969B">this</span><span style="color: #994CC3">.</span><span style="color: #4876D6">evalCall</span><span style="color: #403F53">(b)</span><span style="color: #5F7E97">,</span><span style="color: #403F53">a</span><span style="color: #994CC3">=</span><span style="color: #0C969B">a</span><span style="color: #994CC3">.</span><span style="color: #4876D6">replace</span><span style="color: #403F53">(</span><span style="color: #111111">&quot;</span><span style="color: #C96765">=BusuanziCallback</span><span style="color: #111111">&quot;</span><span style="color: #5F7E97">,</span><span style="color: #111111">&quot;</span><span style="color: #C96765">=</span><span style="color: #111111">&quot;</span><span style="color: #994CC3">+</span><span style="color: #403F53">c)</span><span style="color: #5F7E97">,</span><span style="color: #403F53">scriptTag</span><span style="color: #994CC3">=</span><span style="color: #0C969B">document</span><span style="color: #994CC3">.</span><span style="color: #4876D6">createElement</span><span style="color: #403F53">(</span><span style="color: #111111">&quot;</span><span style="color: #C96765">SCRIPT</span><span style="color: #111111">&quot;</span><span style="color: #403F53">)</span><span style="color: #5F7E97">,</span><span style="color: #0C969B">scriptTag</span><span style="color: #994CC3">.</span><span style="color: #0C969B">type</span><span style="color: #994CC3">=</span><span style="color: #111111">&quot;</span><span style="color: #C96765">text/javascript</span><span style="color: #111111">&quot;</span><span style="color: #5F7E97">,</span><span style="color: #0C969B">scriptTag</span><span style="color: #994CC3">.</span><span style="color: #0C969B">defer</span><span style="color: #994CC3">=!</span><span style="color: #AA0982">0</span><span style="color: #5F7E97">,</span><span style="color: #0C969B">scriptTag</span><span style="color: #994CC3">.</span><span style="color: #0C969B">src</span><span style="color: #994CC3">=</span><span style="color: #403F53">a</span><span style="color: #5F7E97">,</span><span style="color: #0C969B">scriptTag</span><span style="color: #994CC3">.</span><span style="color: #0C969B">referrerPolicy</span><span style="color: #994CC3">=</span><span style="color: #111111">&quot;</span><span style="color: #C96765">no-referrer-when-downgrade</span><span style="color: #111111">&quot;</span><span style="color: #5F7E97">,</span><span style="color: #0C969B">document</span><span style="color: #994CC3">.</span><span style="color: #4876D6">getElementsByTagName</span><span style="color: #403F53">(</span><span style="color: #111111">&quot;</span><span style="color: #C96765">HEAD</span><span style="color: #111111">&quot;</span><span style="color: #403F53">)[</span><span style="color: #AA0982">0</span><span style="color: #403F53">]</span><span style="color: #994CC3">.</span><span style="color: #4876D6">appendChild</span><span style="color: #403F53">(scriptTag)},</span><span style="color: #4876D6">evalCall</span><span style="color: #403F53">:</span><span style="color: #994CC3">function</span><span style="color: #111111">(</span><span style="color: #403F53">a</span><span style="color: #111111">)</span><span style="color: #403F53">{</span><span style="color: #994CC3">return</span><span style="color: #403F53"> </span><span style="color: #994CC3">function</span><span style="color: #111111">(</span><span style="color: #403F53">b</span><span style="color: #111111">)</span><span style="color: #403F53">{</span><span style="color: #4876D6">ready</span><span style="color: #403F53">(</span><span style="color: #994CC3">function</span><span style="color: #111111">()</span><span style="color: #403F53">{</span><span style="color: #994CC3">try</span><span style="color: #403F53">{</span><span style="color: #4876D6">a</span><span style="color: #403F53">(b)</span><span style="color: #5F7E97">,</span><span style="color: #403F53">s</span><span style="color: #994CC3">=</span><span style="color: #0C969B">document</span><span style="color: #994CC3">.</span><span style="color: #4876D6">querySelector</span><span style="color: #403F53">(</span><span style="color: #111111">&#39;</span><span style="color: #C96765">[src*=BusuanziCallback]</span><span style="color: #111111">&#39;</span><span style="color: #403F53">)</span><span style="color: #5F7E97">,</span><span style="color: #0C969B">s</span><span style="color: #994CC3">.</span><span style="color: #111111">parentElement</span><span style="color: #994CC3">.</span><span style="color: #4876D6">removeChild</span><span style="color: #403F53">(s)}</span><span style="color: #994CC3">catch</span><span style="color: #403F53">(c){</span><span style="color: #0C969B">console</span><span style="color: #994CC3">.</span><span style="color: #4876D6">error</span><span style="color: #403F53">(c)</span><span style="color: #5F7E97">,</span><span style="color: #0C969B">bszTag</span><span style="color: #994CC3">.</span><span style="color: #4876D6">hides</span><span style="color: #403F53">()}})}}},</span><span style="color: #0C969B">bszCaller</span><span style="color: #994CC3">.</span><span style="color: #4876D6">fetch</span><span style="color: #403F53">(</span><span style="color: #111111">&quot;</span><span style="color: #C96765">//busuanzi.ibruce.info/busuanzi?jsonpCallback=BusuanziCallback</span><span style="color: #111111">&quot;</span><span style="color: #403F53">,</span><span style="color: #994CC3">function</span><span style="color: #111111">(</span><span style="color: #403F53">a</span><span style="color: #111111">)</span><span style="color: #403F53">{</span><span style="color: #0C969B">bszTag</span><span style="color: #994CC3">.</span><span style="color: #4876D6">texts</span><span style="color: #403F53">(a)</span><span style="color: #5F7E97">,</span><span style="color: #0C969B">bszTag</span><span style="color: #994CC3">.</span><span style="color: #4876D6">shows</span><span style="color: #403F53">()}),bszTag</span><span style="color: #994CC3">=</span><span style="color: #403F53">{bszs:[</span><span style="color: #111111">&quot;</span><span style="color: #C96765">site_pv</span><span style="color: #111111">&quot;</span><span style="color: #403F53">,</span><span style="color: #111111">&quot;</span><span style="color: #C96765">page_pv</span><span style="color: #111111">&quot;</span><span style="color: #403F53">,</span><span style="color: #111111">&quot;</span><span style="color: #C96765">site_uv</span><span style="color: #111111">&quot;</span><span style="color: #403F53">],</span><span style="color: #4876D6">texts</span><span style="color: #403F53">:</span><span style="color: #994CC3">function</span><span style="color: #111111">(</span><span style="color: #403F53">a</span><span style="color: #111111">)</span><span style="color: #403F53">{</span><span style="color: #0C969B">this</span><span style="color: #994CC3">.</span><span style="color: #111111">bszs</span><span style="color: #994CC3">.</span><span style="color: #4876D6">map</span><span style="color: #403F53">(</span><span style="color: #994CC3">function</span><span style="color: #111111">(</span><span style="color: #403F53">b</span><span style="color: #111111">)</span><span style="color: #403F53">{</span><span style="color: #994CC3">var </span><span style="color: #403F53">c</span><span style="color: #994CC3">=</span><span style="color: #0C969B">document</span><span style="color: #994CC3">.</span><span style="color: #4876D6">getElementById</span><span style="color: #403F53">(</span><span style="color: #111111">&quot;</span><span style="color: #C96765">busuanzi_value_</span><span style="color: #111111">&quot;</span><span style="color: #994CC3">+</span><span style="color: #403F53">b);c</span><span style="color: #994CC3">&amp;&amp;</span><span style="color: #403F53">(</span><span style="color: #0C969B">c</span><span style="color: #994CC3">.</span><span style="color: #0C969B">innerHTML</span><span style="color: #994CC3">=</span><span style="color: #403F53">a[b])})},</span><span style="color: #4876D6">hides</span><span style="color: #403F53">:</span><span style="color: #994CC3">function</span><span style="color: #111111">()</span><span style="color: #403F53">{</span><span style="color: #0C969B">this</span><span style="color: #994CC3">.</span><span style="color: #111111">bszs</span><span style="color: #994CC3">.</span><span style="color: #4876D6">map</span><span style="color: #403F53">(</span><span style="color: #994CC3">function</span><span style="color: #111111">(</span><span style="color: #403F53">a</span><span style="color: #111111">)</span><span style="color: #403F53">{</span><span style="color: #994CC3">var </span><span style="color: #403F53">b</span><span style="color: #994CC3">=</span><span style="color: #0C969B">document</span><span style="color: #994CC3">.</span><span style="color: #4876D6">getElementById</span><span style="color: #403F53">(</span><span style="color: #111111">&quot;</span><span style="color: #C96765">busuanzi_container_</span><span style="color: #111111">&quot;</span><span style="color: #994CC3">+</span><span style="color: #403F53">a);b</span><span style="color: #994CC3">&amp;&amp;</span><span style="color: #403F53">(</span><span style="color: #0C969B">b</span><span style="color: #994CC3">.</span><span style="color: #111111">style</span><span style="color: #994CC3">.</span><span style="color: #0C969B">display</span><span style="color: #994CC3">=</span><span style="color: #111111">&quot;</span><span style="color: #C96765">none</span><span style="color: #111111">&quot;</span><span style="color: #403F53">)})},</span><span style="color: #4876D6">shows</span><span style="color: #403F53">:</span><span style="color: #994CC3">function</span><span style="color: #111111">()</span><span style="color: #403F53">{</span><span style="color: #0C969B">this</span><span style="color: #994CC3">.</span><span style="color: #111111">bszs</span><span style="color: #994CC3">.</span><span style="color: #4876D6">map</span><span style="color: #403F53">(</span><span style="color: #994CC3">function</span><span style="color: #111111">(</span><span style="color: #403F53">a</span><span style="color: #111111">)</span><span style="color: #403F53">{</span><span style="color: #994CC3">var </span><span style="color: #403F53">b</span><span style="color: #994CC3">=</span><span style="color: #0C969B">document</span><span style="color: #994CC3">.</span><span style="color: #4876D6">getElementById</span><span style="color: #403F53">(</span><span style="color: #111111">&quot;</span><span style="color: #C96765">busuanzi_container_</span><span style="color: #111111">&quot;</span><span style="color: #994CC3">+</span><span style="color: #403F53">a);b</span><span style="color: #994CC3">&amp;&amp;</span><span style="color: #403F53">(</span><span style="color: #0C969B">b</span><span style="color: #994CC3">.</span><span style="color: #111111">style</span><span style="color: #994CC3">.</span><span style="color: #0C969B">display</span><span style="color: #994CC3">=</span><span style="color: #111111">&quot;</span><span style="color: #C96765">inline</span><span style="color: #111111">&quot;</span><span style="color: #403F53">)})}};</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #C792EA">var </span><span style="color: #D7DBE0">bszCaller</span><span style="color: #C792EA">,</span><span style="color: #D7DBE0">bszTag</span><span style="color: #D6DEEB">;</span><span style="color: #C792EA">!function</span><span style="color: #D9F5DD">()</span><span style="color: #D6DEEB">{</span><span style="color: #C792EA">var </span><span style="color: #D7DBE0">c</span><span style="color: #5F7E97">,</span><span style="color: #D7DBE0">d</span><span style="color: #5F7E97">,</span><span style="color: #D7DBE0">e</span><span style="color: #5F7E97">,</span><span style="color: #D7DBE0">a</span><span style="color: #C792EA">=!</span><span style="color: #F78C6C">1</span><span style="color: #5F7E97">,</span><span style="color: #D7DBE0">b</span><span style="color: #C792EA">=</span><span style="color: #D6DEEB">[];</span><span style="color: #82AAFF">ready</span><span style="color: #C792EA">=function</span><span style="color: #D9F5DD">(</span><span style="color: #D7DBE0">c</span><span style="color: #D9F5DD">)</span><span style="color: #D6DEEB">{</span><span style="color: #C792EA">return</span><span style="color: #D6DEEB"> </span><span style="color: #D7DBE0">a</span><span style="color: #C792EA">||</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">interactive</span><span style="color: #D9F5DD">&quot;</span><span style="color: #C792EA">===</span><span style="color: #7FDBCA">document</span><span style="color: #C792EA">.</span><span style="color: #7FDBCA">readyState</span><span style="color: #C792EA">||</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">complete</span><span style="color: #D9F5DD">&quot;</span><span style="color: #C792EA">===</span><span style="color: #7FDBCA">document</span><span style="color: #C792EA">.</span><span style="color: #7FDBCA">readyState</span><span style="color: #C792EA">?</span><span style="color: #7FDBCA">c</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">call</span><span style="color: #D6DEEB">(</span><span style="color: #D7DBE0">document</span><span style="color: #D6DEEB">)</span><span style="color: #C792EA">:</span><span style="color: #7FDBCA">b</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">push</span><span style="color: #D6DEEB">(</span><span style="color: #C792EA">function</span><span style="color: #D9F5DD">()</span><span style="color: #D6DEEB">{</span><span style="color: #C792EA">return</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">c</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">call</span><span style="color: #D6DEEB">(</span><span style="color: #7FDBCA">this</span><span style="color: #D6DEEB">)})</span><span style="color: #5F7E97">,</span><span style="color: #7FDBCA">this</span><span style="color: #D6DEEB">}</span><span style="color: #5F7E97">,</span><span style="color: #82AAFF">d</span><span style="color: #C792EA">=function</span><span style="color: #D9F5DD">()</span><span style="color: #D6DEEB">{</span><span style="color: #C792EA">for</span><span style="color: #D6DEEB">(</span><span style="color: #C792EA">var </span><span style="color: #D7DBE0">a</span><span style="color: #C792EA">=</span><span style="color: #F78C6C">0</span><span style="color: #5F7E97">,</span><span style="color: #D7DBE0">c</span><span style="color: #C792EA">=</span><span style="color: #7FDBCA">b</span><span style="color: #C792EA">.</span><span style="color: #7FDBCA">length</span><span style="color: #D6DEEB">;</span><span style="color: #D7DBE0">c</span><span style="color: #C792EA">&gt;</span><span style="color: #D7DBE0">a</span><span style="color: #D6DEEB">;</span><span style="color: #D7DBE0">a</span><span style="color: #C792EA">++</span><span style="color: #D6DEEB">)</span><span style="color: #D7DBE0">b</span><span style="color: #D6DEEB">[</span><span style="color: #D7DBE0">a</span><span style="color: #D6DEEB">]</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">apply</span><span style="color: #D6DEEB">(</span><span style="color: #D7DBE0">document</span><span style="color: #D6DEEB">);</span><span style="color: #D7DBE0">b</span><span style="color: #C792EA">=</span><span style="color: #D6DEEB">[]}</span><span style="color: #5F7E97">,</span><span style="color: #82AAFF">e</span><span style="color: #C792EA">=function</span><span style="color: #D9F5DD">()</span><span style="color: #D6DEEB">{</span><span style="color: #D7DBE0">a</span><span style="color: #C792EA">||</span><span style="color: #D6DEEB">(</span><span style="color: #D7DBE0">a</span><span style="color: #C792EA">=!</span><span style="color: #F78C6C">0</span><span style="color: #5F7E97">,</span><span style="color: #7FDBCA">d</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">call</span><span style="color: #D6DEEB">(</span><span style="color: #D7DBE0">window</span><span style="color: #D6DEEB">)</span><span style="color: #5F7E97">,</span><span style="color: #7FDBCA">document</span><span style="color: #C792EA">.</span><span style="color: #7FDBCA">removeEventListener</span><span style="color: #C792EA">?</span><span style="color: #7FDBCA">document</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">removeEventListener</span><span style="color: #D6DEEB">(</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">DOMContentLoaded</span><span style="color: #D9F5DD">&quot;</span><span style="color: #5F7E97">,</span><span style="color: #D7DBE0">e</span><span style="color: #5F7E97">,</span><span style="color: #C792EA">!</span><span style="color: #F78C6C">1</span><span style="color: #D6DEEB">)</span><span style="color: #C792EA">:</span><span style="color: #7FDBCA">document</span><span style="color: #C792EA">.</span><span style="color: #7FDBCA">attachEvent</span><span style="color: #C792EA">&amp;&amp;</span><span style="color: #D6DEEB">(</span><span style="color: #7FDBCA">document</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">detachEvent</span><span style="color: #D6DEEB">(</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">onreadystatechange</span><span style="color: #D9F5DD">&quot;</span><span style="color: #5F7E97">,</span><span style="color: #D7DBE0">e</span><span style="color: #D6DEEB">)</span><span style="color: #5F7E97">,</span><span style="color: #D7DBE0">window</span><span style="color: #C792EA">==</span><span style="color: #7FDBCA">window</span><span style="color: #C792EA">.</span><span style="color: #7FDBCA">top</span><span style="color: #C792EA">&amp;&amp;</span><span style="color: #D6DEEB">(</span><span style="color: #82AAFF">clearInterval</span><span style="color: #D6DEEB">(</span><span style="color: #D7DBE0">c</span><span style="color: #D6DEEB">)</span><span style="color: #5F7E97">,</span><span style="color: #D7DBE0">c</span><span style="color: #C792EA">=</span><span style="color: #FF5874">null</span><span style="color: #D6DEEB">)))}</span><span style="color: #5F7E97">,</span><span style="color: #7FDBCA">document</span><span style="color: #C792EA">.</span><span style="color: #7FDBCA">addEventListener</span><span style="color: #C792EA">?</span><span style="color: #7FDBCA">document</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">addEventListener</span><span style="color: #D6DEEB">(</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">DOMContentLoaded</span><span style="color: #D9F5DD">&quot;</span><span style="color: #5F7E97">,</span><span style="color: #D7DBE0">e</span><span style="color: #5F7E97">,</span><span style="color: #C792EA">!</span><span style="color: #F78C6C">1</span><span style="color: #D6DEEB">)</span><span style="color: #C792EA">:</span><span style="color: #7FDBCA">document</span><span style="color: #C792EA">.</span><span style="color: #7FDBCA">attachEvent</span><span style="color: #C792EA">&amp;&amp;</span><span style="color: #D6DEEB">(</span><span style="color: #7FDBCA">document</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">attachEvent</span><span style="color: #D6DEEB">(</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">onreadystatechange</span><span style="color: #D9F5DD">&quot;</span><span style="color: #5F7E97">,</span><span style="color: #C792EA">function</span><span style="color: #D9F5DD">()</span><span style="color: #D6DEEB">{</span><span style="color: #D9F5DD">/</span><span style="color: #5CA7E4">loaded</span><span style="color: #7FDBCA">|</span><span style="color: #5CA7E4">complete</span><span style="color: #D9F5DD">/</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">test</span><span style="color: #D6DEEB">(</span><span style="color: #7FDBCA">document</span><span style="color: #C792EA">.</span><span style="color: #7FDBCA">readyState</span><span style="color: #D6DEEB">)</span><span style="color: #C792EA">&amp;&amp;</span><span style="color: #82AAFF">e</span><span style="color: #D6DEEB">()})</span><span style="color: #5F7E97">,</span><span style="color: #D7DBE0">window</span><span style="color: #C792EA">==</span><span style="color: #7FDBCA">window</span><span style="color: #C792EA">.</span><span style="color: #7FDBCA">top</span><span style="color: #C792EA">&amp;&amp;</span><span style="color: #D6DEEB">(</span><span style="color: #D7DBE0">c</span><span style="color: #C792EA">=</span><span style="color: #82AAFF">setInterval</span><span style="color: #D6DEEB">(</span><span style="color: #C792EA">function</span><span style="color: #D9F5DD">()</span><span style="color: #D6DEEB">{</span><span style="color: #C792EA">try</span><span style="color: #D6DEEB">{</span><span style="color: #D7DBE0">a</span><span style="color: #C792EA">||</span><span style="color: #7FDBCA">document</span><span style="color: #C792EA">.</span><span style="color: #FAF39F">documentElement</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">doScroll</span><span style="color: #D6DEEB">(</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">left</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">)}</span><span style="color: #C792EA">catch</span><span style="color: #D6DEEB">(</span><span style="color: #D7DBE0">b</span><span style="color: #D6DEEB">){</span><span style="color: #C792EA">return</span><span style="color: #D6DEEB">}</span><span style="color: #82AAFF">e</span><span style="color: #D6DEEB">()}</span><span style="color: #5F7E97">,</span><span style="color: #F78C6C">5</span><span style="color: #D6DEEB">)))}(),</span><span style="color: #D7DBE0">bszCaller</span><span style="color: #C792EA">=</span><span style="color: #D6DEEB">{</span><span style="color: #82AAFF">fetch</span><span style="color: #D6DEEB">:</span><span style="color: #C792EA">function</span><span style="color: #D9F5DD">(</span><span style="color: #D7DBE0">a</span><span style="color: #D6DEEB">,</span><span style="color: #D7DBE0">b</span><span style="color: #D9F5DD">)</span><span style="color: #D6DEEB">{</span><span style="color: #C792EA">var </span><span style="color: #D7DBE0">c</span><span style="color: #C792EA">=</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">BusuanziCallback_</span><span style="color: #D9F5DD">&quot;</span><span style="color: #C792EA">+</span><span style="color: #7FDBCA">Math</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">floor</span><span style="color: #D6DEEB">(</span><span style="color: #F78C6C">1099511627776</span><span style="color: #C792EA">*</span><span style="color: #7FDBCA">Math</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">random</span><span style="color: #D6DEEB">());</span><span style="color: #D7DBE0">window</span><span style="color: #D6DEEB">[</span><span style="color: #D7DBE0">c</span><span style="color: #D6DEEB">]</span><span style="color: #C792EA">=</span><span style="color: #7FDBCA">this</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">evalCall</span><span style="color: #D6DEEB">(</span><span style="color: #D7DBE0">b</span><span style="color: #D6DEEB">)</span><span style="color: #5F7E97">,</span><span style="color: #D7DBE0">a</span><span style="color: #C792EA">=</span><span style="color: #7FDBCA">a</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">replace</span><span style="color: #D6DEEB">(</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">=BusuanziCallback</span><span style="color: #D9F5DD">&quot;</span><span style="color: #5F7E97">,</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">=</span><span style="color: #D9F5DD">&quot;</span><span style="color: #C792EA">+</span><span style="color: #D7DBE0">c</span><span style="color: #D6DEEB">)</span><span style="color: #5F7E97">,</span><span style="color: #D7DBE0">scriptTag</span><span style="color: #C792EA">=</span><span style="color: #7FDBCA">document</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">createElement</span><span style="color: #D6DEEB">(</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">SCRIPT</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">)</span><span style="color: #5F7E97">,</span><span style="color: #7FDBCA">scriptTag</span><span style="color: #C792EA">.</span><span style="color: #7FDBCA">type</span><span style="color: #C792EA">=</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">text/javascript</span><span style="color: #D9F5DD">&quot;</span><span style="color: #5F7E97">,</span><span style="color: #7FDBCA">scriptTag</span><span style="color: #C792EA">.</span><span style="color: #7FDBCA">defer</span><span style="color: #C792EA">=!</span><span style="color: #F78C6C">0</span><span style="color: #5F7E97">,</span><span style="color: #7FDBCA">scriptTag</span><span style="color: #C792EA">.</span><span style="color: #7FDBCA">src</span><span style="color: #C792EA">=</span><span style="color: #D7DBE0">a</span><span style="color: #5F7E97">,</span><span style="color: #7FDBCA">scriptTag</span><span style="color: #C792EA">.</span><span style="color: #7FDBCA">referrerPolicy</span><span style="color: #C792EA">=</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">no-referrer-when-downgrade</span><span style="color: #D9F5DD">&quot;</span><span style="color: #5F7E97">,</span><span style="color: #7FDBCA">document</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">getElementsByTagName</span><span style="color: #D6DEEB">(</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">HEAD</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">)[</span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">]</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">appendChild</span><span style="color: #D6DEEB">(</span><span style="color: #D7DBE0">scriptTag</span><span style="color: #D6DEEB">)},</span><span style="color: #82AAFF">evalCall</span><span style="color: #D6DEEB">:</span><span style="color: #C792EA">function</span><span style="color: #D9F5DD">(</span><span style="color: #D7DBE0">a</span><span style="color: #D9F5DD">)</span><span style="color: #D6DEEB">{</span><span style="color: #C792EA">return</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">function</span><span style="color: #D9F5DD">(</span><span style="color: #D7DBE0">b</span><span style="color: #D9F5DD">)</span><span style="color: #D6DEEB">{</span><span style="color: #82AAFF">ready</span><span style="color: #D6DEEB">(</span><span style="color: #C792EA">function</span><span style="color: #D9F5DD">()</span><span style="color: #D6DEEB">{</span><span style="color: #C792EA">try</span><span style="color: #D6DEEB">{</span><span style="color: #82AAFF">a</span><span style="color: #D6DEEB">(</span><span style="color: #D7DBE0">b</span><span style="color: #D6DEEB">)</span><span style="color: #5F7E97">,</span><span style="color: #D7DBE0">s</span><span style="color: #C792EA">=</span><span style="color: #7FDBCA">document</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">querySelector</span><span style="color: #D6DEEB">(</span><span style="color: #D9F5DD">&#39;</span><span style="color: #ECC48D">[src*=BusuanziCallback]</span><span style="color: #D9F5DD">&#39;</span><span style="color: #D6DEEB">)</span><span style="color: #5F7E97">,</span><span style="color: #7FDBCA">s</span><span style="color: #C792EA">.</span><span style="color: #FAF39F">parentElement</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">removeChild</span><span style="color: #D6DEEB">(</span><span style="color: #D7DBE0">s</span><span style="color: #D6DEEB">)}</span><span style="color: #C792EA">catch</span><span style="color: #D6DEEB">(</span><span style="color: #D7DBE0">c</span><span style="color: #D6DEEB">){</span><span style="color: #7FDBCA">console</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">error</span><span style="color: #D6DEEB">(</span><span style="color: #D7DBE0">c</span><span style="color: #D6DEEB">)</span><span style="color: #5F7E97">,</span><span style="color: #7FDBCA">bszTag</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">hides</span><span style="color: #D6DEEB">()}})}}},</span><span style="color: #7FDBCA">bszCaller</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">fetch</span><span style="color: #D6DEEB">(</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">//busuanzi.ibruce.info/busuanzi?jsonpCallback=BusuanziCallback</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">,</span><span style="color: #C792EA">function</span><span style="color: #D9F5DD">(</span><span style="color: #D7DBE0">a</span><span style="color: #D9F5DD">)</span><span style="color: #D6DEEB">{</span><span style="color: #7FDBCA">bszTag</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">texts</span><span style="color: #D6DEEB">(</span><span style="color: #D7DBE0">a</span><span style="color: #D6DEEB">)</span><span style="color: #5F7E97">,</span><span style="color: #7FDBCA">bszTag</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">shows</span><span style="color: #D6DEEB">()}),</span><span style="color: #D7DBE0">bszTag</span><span style="color: #C792EA">=</span><span style="color: #D6DEEB">{bszs:[</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">site_pv</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">,</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">page_pv</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">,</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">site_uv</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">],</span><span style="color: #82AAFF">texts</span><span style="color: #D6DEEB">:</span><span style="color: #C792EA">function</span><span style="color: #D9F5DD">(</span><span style="color: #D7DBE0">a</span><span style="color: #D9F5DD">)</span><span style="color: #D6DEEB">{</span><span style="color: #7FDBCA">this</span><span style="color: #C792EA">.</span><span style="color: #FAF39F">bszs</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">map</span><span style="color: #D6DEEB">(</span><span style="color: #C792EA">function</span><span style="color: #D9F5DD">(</span><span style="color: #D7DBE0">b</span><span style="color: #D9F5DD">)</span><span style="color: #D6DEEB">{</span><span style="color: #C792EA">var </span><span style="color: #D7DBE0">c</span><span style="color: #C792EA">=</span><span style="color: #7FDBCA">document</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">getElementById</span><span style="color: #D6DEEB">(</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">busuanzi_value_</span><span style="color: #D9F5DD">&quot;</span><span style="color: #C792EA">+</span><span style="color: #D7DBE0">b</span><span style="color: #D6DEEB">);</span><span style="color: #D7DBE0">c</span><span style="color: #C792EA">&amp;&amp;</span><span style="color: #D6DEEB">(</span><span style="color: #7FDBCA">c</span><span style="color: #C792EA">.</span><span style="color: #7FDBCA">innerHTML</span><span style="color: #C792EA">=</span><span style="color: #D7DBE0">a</span><span style="color: #D6DEEB">[</span><span style="color: #D7DBE0">b</span><span style="color: #D6DEEB">])})},</span><span style="color: #82AAFF">hides</span><span style="color: #D6DEEB">:</span><span style="color: #C792EA">function</span><span style="color: #D9F5DD">()</span><span style="color: #D6DEEB">{</span><span style="color: #7FDBCA">this</span><span style="color: #C792EA">.</span><span style="color: #FAF39F">bszs</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">map</span><span style="color: #D6DEEB">(</span><span style="color: #C792EA">function</span><span style="color: #D9F5DD">(</span><span style="color: #D7DBE0">a</span><span style="color: #D9F5DD">)</span><span style="color: #D6DEEB">{</span><span style="color: #C792EA">var </span><span style="color: #D7DBE0">b</span><span style="color: #C792EA">=</span><span style="color: #7FDBCA">document</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">getElementById</span><span style="color: #D6DEEB">(</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">busuanzi_container_</span><span style="color: #D9F5DD">&quot;</span><span style="color: #C792EA">+</span><span style="color: #D7DBE0">a</span><span style="color: #D6DEEB">);</span><span style="color: #D7DBE0">b</span><span style="color: #C792EA">&amp;&amp;</span><span style="color: #D6DEEB">(</span><span style="color: #7FDBCA">b</span><span style="color: #C792EA">.</span><span style="color: #FAF39F">style</span><span style="color: #C792EA">.</span><span style="color: #7FDBCA">display</span><span style="color: #C792EA">=</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">none</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">)})},</span><span style="color: #82AAFF">shows</span><span style="color: #D6DEEB">:</span><span style="color: #C792EA">function</span><span style="color: #D9F5DD">()</span><span style="color: #D6DEEB">{</span><span style="color: #7FDBCA">this</span><span style="color: #C792EA">.</span><span style="color: #FAF39F">bszs</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">map</span><span style="color: #D6DEEB">(</span><span style="color: #C792EA">function</span><span style="color: #D9F5DD">(</span><span style="color: #D7DBE0">a</span><span style="color: #D9F5DD">)</span><span style="color: #D6DEEB">{</span><span style="color: #C792EA">var </span><span style="color: #D7DBE0">b</span><span style="color: #C792EA">=</span><span style="color: #7FDBCA">document</span><span style="color: #C792EA">.</span><span style="color: #82AAFF">getElementById</span><span style="color: #D6DEEB">(</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">busuanzi_container_</span><span style="color: #D9F5DD">&quot;</span><span style="color: #C792EA">+</span><span style="color: #D7DBE0">a</span><span style="color: #D6DEEB">);</span><span style="color: #D7DBE0">b</span><span style="color: #C792EA">&amp;&amp;</span><span style="color: #D6DEEB">(</span><span style="color: #7FDBCA">b</span><span style="color: #C792EA">.</span><span style="color: #FAF39F">style</span><span style="color: #C792EA">.</span><span style="color: #7FDBCA">display</span><span style="color: #C792EA">=</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">inline</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">)})}};</span></span></code></pre></div></section><p>然后将</p><section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h5 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="HTML 代码块" data-v-c675dba6>HTML</h5><ile-root id="ile-6"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-6--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #994CC3">&lt;script </span><span style="color: #4876D6">async</span><span style="color: #994CC3"> </span><span style="color: #4876D6">src</span><span style="color: #994CC3">=</span><span style="color: #111111">&quot;</span><span style="color: #C96765">//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js</span><span style="color: #111111">&quot;</span><span style="color: #994CC3">&gt;&lt;/script&gt;</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #7FDBCA">&lt;</span><span style="color: #CAECE6">script</span><span style="color: #7FDBCA"> </span><span style="color: #C5E478">async</span><span style="color: #7FDBCA"> </span><span style="color: #C5E478">src</span><span style="color: #7FDBCA">=</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js</span><span style="color: #D9F5DD">&quot;</span><span style="color: #7FDBCA">&gt;&lt;/</span><span style="color: #CAECE6">script</span><span style="color: #7FDBCA">&gt;</span></span></code></pre></div></section><p>修改为<span class="mojikumi-line-start">（</span>如果上面的代码放在了博客的 <code>/<wbr>js<wbr>/<wbr>busuanzi<wbr>.<wbr>pure<wbr>.<wbr>mini<wbr>.<wbr>js</code><span class="mojikumi-line-end">）</span></p><section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h5 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="HTML 代码块" data-v-c675dba6>HTML</h5><ile-root id="ile-7"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-7--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #994CC3">&lt;script </span><span style="color: #4876D6">async</span><span style="color: #994CC3"> </span><span style="color: #4876D6">src</span><span style="color: #994CC3">=</span><span style="color: #111111">&quot;</span><span style="color: #C96765">/js/busuanzi.pure.mini.js</span><span style="color: #111111">&quot;</span><span style="color: #994CC3">&gt;&lt;/script&gt;</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #7FDBCA">&lt;</span><span style="color: #CAECE6">script</span><span style="color: #7FDBCA"> </span><span style="color: #C5E478">async</span><span style="color: #7FDBCA"> </span><span style="color: #C5E478">src</span><span style="color: #7FDBCA">=</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">/js/busuanzi.pure.mini.js</span><span style="color: #D9F5DD">&quot;</span><span style="color: #7FDBCA">&gt;&lt;/</span><span style="color: #CAECE6">script</span><span style="color: #7FDBCA">&gt;</span></span></code></pre></div></section></div></details></aside>
<p>网上搜到的很多解决办法是把 <code>id<wbr>="<wbr>busuanzi_<wbr>container_<wbr>*"</code> 删掉<span class="mojikumi-line-end">，</span>这样当然就不会被隐藏了<span class="mojikumi-line-end">，</span>只不过这个隐藏本意是在出错时不把错误或者无意义的内容显示给访客<span class="mojikumi-line-end">，</span>保留这一行为还是挺好的<span class="mojikumi-line-end">。</span></p>
<h3 id="修改-live2d-的解决方法" class="heading"><a href="#修改-live2d-的解决方法" class="heading-anchor" aria-label="章节： 修改 live2d 的解决方法" tabindex="-1"></a><span>修改 live2d 的解决方法</span></h3>
<p>总之<span class="mojikumi-line-end">，</span>就是把 <code>innerHTML +=</code> 换成 <code>createElement</code> 和 <code>appendChild</code><span class="mojikumi-line-end">，</span>按 <a href="https://github.com/xiazeyu/live2d-widget.js/pull/61/files#diff-61426849230d9976d234f7c4ca195c623d9bb05a91d76b7ae51501e394f81860L10-R43">xiazeyu/live2d-widget.js#61</a> 改就行<span class="mojikumi-line-end">。</span></p>
<p>live2d 的代码还是挺长的<span class="mojikumi-line-end">，</span>直接修改 minify 后的代码不太好<span class="mojikumi-line-end">。</span>如果是 hexo 插件的话<span class="mojikumi-line-end">，</span>要修改应该也蛮麻烦的<span class="mojikumi-line-end">。</span>总之<span class="mojikumi-line-end">，</span>如果你知道怎么改比较好的话可以改<span class="mojikumi-line-end">，</span>不然的话还是推荐改 busuanzi<span class="mojikumi-line-end">。</span></p>
<h2 id="问题启示" class="heading"><a href="#问题启示" class="heading-anchor" aria-label="章节： 问题启示" tabindex="-1"></a><span>问题启示</span></h2>
<h3 id="不要修改原-dom-中的-innerhtml" class="heading"><a href="#不要修改原-dom-中的-innerhtml" class="heading-anchor" aria-label="章节： 不要修改原 DOM 中的 innerHTML" tabindex="-1"></a><span>不要修改原 DOM 中的 innerHTML</span></h3>
<p>直接修改 DOM 元素的 innerHTML 会让其中的元素都重新渲染<span class="mojikumi-line-start">（</span>加载？创建？<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>不仅指向其中元素的变量会失效<span class="mojikumi-line-end">，</span>也可能导致画面闪烁等问题<span class="mojikumi-line-start">（</span>例如导致 live2d-widget 修复这一问题的不是 busuanzi 失效而是 <a href="https://github.com/EYHN/hexo-helper-live2d/issues/149">CSS 闪烁</a><span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<p>所以<span class="mojikumi-line-end">，</span>如果是添加 DOM 元素<span class="mojikumi-line-end">，</span>应当避免修改 <code>innerHTML</code><span class="mojikumi-line-end">，</span>而应当使用 <a href="https://developer.mozilla.org/en-US/docs/Web/API/Document/createElement"><code>document<wbr>.<wbr>createElement</code></a> 和 <a href="https://developer.mozilla.org/en-US/docs/Web/API/Node/appendChild"><code>Node<wbr>.<wbr>appendChild<wbr>()</code></a> 以及 <code>removeChild</code><span class="mojikumi-line-end">、</span><code>replaceChild</code><span class="mojikumi-line-end">、</span><code>insertBefore</code> 等 API<span class="mojikumi-line-end">。</span></p>
<h3 id="不要依赖于指向-dom-元素的变量长时间不改变" class="heading"><a href="#不要依赖于指向-dom-元素的变量长时间不改变" class="heading-anchor" aria-label="章节： 不要依赖于指向 DOM 元素的变量长时间不改变" tabindex="-1"></a><span>不要依赖于指向 DOM 元素的变量长时间不改变</span></h3>
<p>如果 DOM 因各种原因部分重建<span class="mojikumi-line-end">，</span>指向 DOM 元素的变量很可能不再指向当前 DOM 中的元素<span class="mojikumi-line-end">。</span>所以<span class="mojikumi-line-end">，</span>最好不要在过了一段时间后<span class="mojikumi-line-start">（</span>例如在 callback 中<span class="mojikumi-line-end">）</span>再次使用指向 DOM 元素的变量<span class="mojikumi-line-end">，</span>而应当再次获取这一元素<span class="mojikumi-line-end">。</span></p>
<h3 id="不要-silently-fail" class="heading"><a href="#不要-silently-fail" class="heading-anchor" aria-label="章节： 不要 silently fail" tabindex="-1"></a><span>不要 silently fail</span></h3>
<p>在处理异常<span class="mojikumi-line-end">，</span>尤其是未知的异常时<span class="mojikumi-line-end">，</span>即使不 throw 出去<span class="mojikumi-line-end">，</span>也最好用 <code>console<wbr>.<wbr>error</code> 等方法记录下来<span class="mojikumi-line-end">。</span>记录在 console 中的错误信息并不会显示给普通用户<span class="mojikumi-line-end">，</span>但可以给寻找问题所在的用户提供宝贵的提示信息<span class="mojikumi-line-end">。</span></p>
<h3 id="使用-header-editor-在对原环境最小修改的情况下进行调试" class="heading"><a href="#使用-header-editor-在对原环境最小修改的情况下进行调试" class="heading-anchor" aria-label="章节： 使用 Header Editor 在对原环境最小修改的情况下进行调试" tabindex="-1"></a><span>使用 Header Editor 在对原环境最小修改的情况下进行调试</span></h3>
<p>这次使用 Header Editor 调试还是我临时想到的<span class="mojikumi-line-start">（</span><s>知道有这么个插件还是以前用 <a href="https://github.com/EndlessCheng/mahjong-helper">mahjong-helper</a><span class="mojikumi-line-end">，</span>当然现在已经没在用了</s><span class="mojikumi">）</span><span class="mojikumi-line-end">。</span>一开始还用 pastebin 上传代码<span class="mojikumi-line-end">，</span>效率极低<span class="mojikumi-line-end">，</span>后来才想起来本地跑个 http server 就可以了..用这个插件来调试还是挺方便的<span class="mojikumi-line-end">。</span></p>
<h3 id="留心依赖版本" class="heading"><a href="#留心依赖版本" class="heading-anchor" aria-label="章节： 留心依赖版本" tabindex="-1"></a><span>留心依赖版本</span></h3>
<p>一开始我还在 GitHub 上搜到一个 <a href="https://github.com/JoeyBling/busuanzi.pure.js">busuanzi.pure.js</a><span class="mojikumi-line-end">，</span>调了一会儿才发现这个代码和 <a href="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js">https<wbr>://<wbr>busuanzi<wbr>.<wbr>ibruce<wbr>.<wbr>info<wbr>/<wbr>busuanzi<wbr>/<wbr>2<wbr>.<wbr>3<wbr>/<wbr>busuanzi<wbr>.<wbr>pure<wbr>.<wbr>mini<wbr>.<wbr>js</a> 不一样..</p>
<p>live2d 的版本也要注意开头包含时间的注释<span class="mojikumi-line-end">，</span>因为最新版本已经把问题修复了<span class="mojikumi-line-end">。</span></p>]]></content:encoded>
            <category domain="https://ouuan.moe/tag/busuanzi">busuanzi</category>
            <category domain="https://ouuan.moe/tag/live2d">live2d</category>
            <category domain="https://ouuan.moe/tag/JavaScript">JavaScript</category>
            <category domain="https://ouuan.moe/tag/Web">Web</category>
            <category domain="https://ouuan.moe/tag/%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E8%AE%B0%E5%BD%95">问题解决记录</category>
        </item>
    </channel>
</rss>