<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-cn"><generator uri="https://gohugo.io/" version="0.147.7">Hugo</generator><title type="html">有呀</title><link href="https://nuoea.com/tags/memos/" rel="alternate" type="text/html" title="html"/><link href="https://nuoea.com/tags/memos/index.xml" rel="alternate" type="application/rss+xml" title="rss"/><updated>2026-07-07T04:03:54+00:00</updated><id>https://nuoea.com/tags/memos/</id><entry><title type="html">给Memos页面增加编辑、归档及删除功能</title><link href="https://nuoea.com/memos-add-edit-and-archive/" rel="alternate" type="text/html"/><id>https://nuoea.com/memos-add-edit-and-archive/</id><published>2023-07-19T14:44:15+08:00</published><updated>2023-07-19T14:44:15+08:00</updated><content type="html"><![CDATA[<h2 id="更新">更新</h2>
<ul>
<li>2023-07-19 新增删除功能；</li>
</ul>
<h2 id="前言">前言</h2>
<p>书接上回，继续完善<code>Memos</code>页面。这次给页面增加<code>编辑</code>和<code>归档</code>功能，让我们的<code>Memos</code>页面使用起来更加的方便。</p>
<h2 id="说明">说明</h2>
<p>值得一提的是，两个功能都需要Memos发布框的支持。还没有折腾的同学看这里：<a href="https://nuoea.com/add-memos-editor/"> Memos页面添加发布框 </a></p>
<h2 id="编辑">编辑</h2>
<ul>
<li>首先，给你的每一条Memos 增加一个按钮，并绑定一个点击事件:</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">button</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;edit-btn&#34;</span> <span style="color:#a6e22e">onclick</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;editMemo(&#39;+JSON.stringify(data[i]).replace(/&#34;</span><span style="color:#960050;background-color:#1e0010">/</span><span style="color:#a6e22e">g</span><span style="color:#960050;background-color:#1e0010">,</span> <span style="color:#960050;background-color:#1e0010">&#39;&amp;</span><span style="color:#a6e22e">quot</span><span style="color:#960050;background-color:#1e0010">;&#39;)+&#39;)&#34;</span>&gt;编辑&lt;/<span style="color:#f92672">button</span>&gt;
</span></span></code></pre></div><ul>
<li>添加点击事件</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">editMemo</span>(<span style="color:#a6e22e">e</span>) {
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memoContent</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">e</span>.<span style="color:#a6e22e">content</span>,<span style="color:#a6e22e">memoId</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">e</span>.<span style="color:#a6e22e">id</span>,<span style="color:#a6e22e">memoRelationList</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">e</span>.<span style="color:#a6e22e">relationList</span>,<span style="color:#a6e22e">memoResourceList</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">e</span>.<span style="color:#a6e22e">resourceList</span>,<span style="color:#a6e22e">memoVisibility</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">e</span>.<span style="color:#a6e22e">visibility</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">getEditor</span> <span style="color:#f92672">=</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-editor-display&#34;</span>),
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">memosOpenId</span> <span style="color:#f92672">=</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-access-token&#34;</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">if</span>(<span style="color:#a6e22e">memosOpenId</span> <span style="color:#f92672">&amp;&amp;</span> <span style="color:#a6e22e">getEditor</span> <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;show&#34;</span>){
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">value</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memoContent</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">style</span>.<span style="color:#a6e22e">height</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">scrollHeight</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#39;px&#39;</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">submitMemoBtn</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">add</span>(<span style="color:#e6db74">&#34;d-none&#34;</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">editMemoDom</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">remove</span>(<span style="color:#e6db74">&#34;d-none&#34;</span>);
</span></span><span style="display:flex;"><span>    document.<span style="color:#a6e22e">body</span>.<span style="color:#a6e22e">scrollIntoView</span>({<span style="color:#a6e22e">behavior</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;smooth&#39;</span>});
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">editMemoBtn</span>.<span style="color:#a6e22e">addEventListener</span>(<span style="color:#e6db74">&#34;click&#34;</span>, <span style="color:#66d9ef">function</span> () {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memosOpenId</span> <span style="color:#f92672">=</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-access-token&#34;</span>),
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memoContent</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">value</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memoResourceList</span> <span style="color:#f92672">=</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> <span style="color:#a6e22e">JSON</span>.<span style="color:#a6e22e">parse</span>(window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-resource-list&#34;</span>)) <span style="color:#f92672">?</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> <span style="color:#a6e22e">JSON</span>.<span style="color:#a6e22e">parse</span>(window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-resource-list&#34;</span>)) <span style="color:#f92672">:</span> <span style="color:#a6e22e">e</span>.<span style="color:#a6e22e">resourceList</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memoVisibility</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memosVisibilitySelect</span>.<span style="color:#a6e22e">value</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">TAG_REG</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">/(?&lt;=#)([^#\s!.,;:?&#34;&#39;()]+)(?= )/g</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">memosTag</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memoContent</span>.<span style="color:#a6e22e">match</span>(<span style="color:#a6e22e">TAG_REG</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">hasContent</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memoContent</span>.<span style="color:#a6e22e">length</span> <span style="color:#f92672">!==</span> <span style="color:#ae81ff">0</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">hasContent</span>) {
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memoUrl</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memosPath</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#34;/api/v1/memo/&#34;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">memoId</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#34;?openId=&#34;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">memosOpenId</span>;
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memoBody</span> <span style="color:#f92672">=</span> {<span style="color:#a6e22e">content</span><span style="color:#f92672">:</span><span style="color:#a6e22e">memoContent</span>,<span style="color:#a6e22e">id</span><span style="color:#f92672">:</span><span style="color:#a6e22e">memoId</span>,<span style="color:#a6e22e">relationList</span><span style="color:#f92672">:</span><span style="color:#a6e22e">memoRelationList</span>,<span style="color:#a6e22e">resourceList</span><span style="color:#f92672">:</span><span style="color:#a6e22e">memoResourceList</span>,<span style="color:#a6e22e">visibility</span><span style="color:#f92672">:</span><span style="color:#a6e22e">memoVisibility</span>}
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">fetch</span>(<span style="color:#a6e22e">memoUrl</span>, {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">method</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;PATCH&#39;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">body</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">JSON</span>.<span style="color:#a6e22e">stringify</span>(<span style="color:#a6e22e">memoBody</span>),
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">headers</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>          <span style="color:#e6db74">&#39;Content-Type&#39;</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;application/json&#39;</span>
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>      }).<span style="color:#a6e22e">then</span>(<span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">res</span>) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">status</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">200</span>) {
</span></span><span style="display:flex;"><span>          <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">memosTag</span> <span style="color:#f92672">!==</span> <span style="color:#66d9ef">null</span>) {
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">memoTagUrl</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memosPath</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34;/api/v1/tag?openId=&#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">memosOpenId</span>;
</span></span><span style="display:flex;"><span>            (<span style="color:#66d9ef">async</span> () =&gt; {
</span></span><span style="display:flex;"><span>              <span style="color:#66d9ef">for</span> <span style="color:#66d9ef">await</span> (<span style="color:#66d9ef">const</span> <span style="color:#a6e22e">i</span> <span style="color:#66d9ef">of</span> <span style="color:#a6e22e">memosTag</span>) {
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">response</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">await</span> <span style="color:#a6e22e">fetch</span>(<span style="color:#a6e22e">memoTagUrl</span>, {
</span></span><span style="display:flex;"><span>                  <span style="color:#a6e22e">method</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;POST&#39;</span>,
</span></span><span style="display:flex;"><span>                  <span style="color:#a6e22e">headers</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>                    <span style="color:#e6db74">&#39;Content-Type&#39;</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;application/json&#39;</span>
</span></span><span style="display:flex;"><span>                  },
</span></span><span style="display:flex;"><span>                  <span style="color:#a6e22e">body</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">JSON</span>.<span style="color:#a6e22e">stringify</span>({
</span></span><span style="display:flex;"><span>                    <span style="color:#a6e22e">name</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">i</span>
</span></span><span style="display:flex;"><span>                  })
</span></span><span style="display:flex;"><span>                });
</span></span><span style="display:flex;"><span>              }
</span></span><span style="display:flex;"><span>            })();
</span></span><span style="display:flex;"><span>          }
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">cocoMessage</span>.<span style="color:#a6e22e">success</span>(
</span></span><span style="display:flex;"><span>          <span style="color:#e6db74">&#39;保存成功&#39;</span>,
</span></span><span style="display:flex;"><span>          ()=&gt;{
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">submitMemoBtn</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">remove</span>(<span style="color:#e6db74">&#34;d-none&#34;</span>);
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">editMemoDom</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">add</span>(<span style="color:#e6db74">&#34;d-none&#34;</span>);
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">location</span>.<span style="color:#a6e22e">reload</span>();
</span></span><span style="display:flex;"><span>          })
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>      })
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  })
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">cancelEditBtn</span>.<span style="color:#a6e22e">addEventListener</span>(<span style="color:#e6db74">&#34;click&#34;</span>, <span style="color:#66d9ef">function</span> () {
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span><span style="color:#a6e22e">editMemoDom</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">contains</span>(<span style="color:#e6db74">&#34;d-none&#34;</span>)) {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">value</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;&#39;</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">style</span>.<span style="color:#a6e22e">height</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;inherit&#39;</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">editMemoDom</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">add</span>(<span style="color:#e6db74">&#34;d-none&#34;</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">submitMemoBtn</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">remove</span>(<span style="color:#e6db74">&#34;d-none&#34;</span>);
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>})
</span></span></code></pre></div><h2 id="归档">归档</h2>
<ul>
<li>首先，还是给你的每一条Memos 增加一个按钮，并绑定一个点击事件:</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">button</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;archive-btn&#34;</span> <span style="color:#a6e22e">onclick</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;archiveMemo(\&#39;&#39;+data[i].id+&#39;\&#39;)&#34;</span>&gt;归档&lt;/<span style="color:#f92672">button</span>&gt;
</span></span></code></pre></div><ul>
<li>然后，添加点击事件</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">archiveMemo</span>(<span style="color:#a6e22e">memoId</span>) { <span style="color:#75715e">//获取Memos的ID值
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  <span style="color:#a6e22e">memosOpenId</span> <span style="color:#f92672">=</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-access-token&#34;</span>); <span style="color:#75715e">//登录信息
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  <span style="color:#66d9ef">if</span>(<span style="color:#a6e22e">memosOpenId</span> <span style="color:#f92672">&amp;&amp;</span> <span style="color:#a6e22e">memoId</span>){ <span style="color:#75715e">//判断是否登录以及获取到Memos的ID值
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>    <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memoUrl</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memosPath</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#34;/api/v1/memo/&#34;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">memoId</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#34;?openId=&#34;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">memosOpenId</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memoBody</span> <span style="color:#f92672">=</span> {<span style="color:#a6e22e">id</span><span style="color:#f92672">:</span><span style="color:#a6e22e">memoId</span>,<span style="color:#a6e22e">rowStatus</span><span style="color:#f92672">:</span><span style="color:#e6db74">&#34;ARCHIVED&#34;</span>};
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">fetch</span>(<span style="color:#a6e22e">memoUrl</span>, {
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">method</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;PATCH&#39;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">body</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">JSON</span>.<span style="color:#a6e22e">stringify</span>(<span style="color:#a6e22e">memoBody</span>),
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">headers</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#39;Content-Type&#39;</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;application/json&#39;</span>
</span></span><span style="display:flex;"><span>      }
</span></span><span style="display:flex;"><span>    }).<span style="color:#a6e22e">then</span>(<span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">res</span>) {
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">status</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">200</span>) {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">cocoMessage</span>.<span style="color:#a6e22e">success</span>(
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#39;归档成功&#39;</span>,
</span></span><span style="display:flex;"><span>        ()=&gt;{
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">location</span>.<span style="color:#a6e22e">reload</span>();
</span></span><span style="display:flex;"><span>        })
</span></span><span style="display:flex;"><span>      }
</span></span><span style="display:flex;"><span>    })
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h2 id="删除">删除</h2>
<ul>
<li>首先，还是给你的每一条Memos 增加一个按钮，并绑定一个点击事件:</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">button</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;delete-btn&#34;</span> <span style="color:#a6e22e">onclick</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;deleteMemo(\&#39;&#39;+data[i].id+&#39;\&#39;)&#34;</span>&gt;删除&lt;/<span style="color:#f92672">button</span>&gt;
</span></span></code></pre></div><ul>
<li>然后，添加点击事件</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">deleteMemo</span>(<span style="color:#a6e22e">memoId</span>) {
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">memosOpenId</span> <span style="color:#f92672">=</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-access-token&#34;</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">if</span>(<span style="color:#a6e22e">memosOpenId</span> <span style="color:#f92672">&amp;&amp;</span> <span style="color:#a6e22e">memoId</span>){
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memoUrl</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memosPath</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#34;/api/v1/memo/&#34;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">memoId</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#34;?openId=&#34;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">memosOpenId</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">fetch</span>(<span style="color:#a6e22e">memoUrl</span>, {
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">method</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;DELETE&#39;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">headers</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#39;Content-Type&#39;</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;application/json&#39;</span>
</span></span><span style="display:flex;"><span>      }
</span></span><span style="display:flex;"><span>    }).<span style="color:#a6e22e">then</span>(<span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">res</span>) {
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">status</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">200</span>) {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">cocoMessage</span>.<span style="color:#a6e22e">success</span>(
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#39;删除成功&#39;</span>,
</span></span><span style="display:flex;"><span>        ()=&gt;{
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">location</span>.<span style="color:#a6e22e">reload</span>();
</span></span><span style="display:flex;"><span>        })
</span></span><span style="display:flex;"><span>      }
</span></span><span style="display:flex;"><span>    }).<span style="color:#66d9ef">catch</span>(<span style="color:#a6e22e">err</span> =&gt; {
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">cocoMessage</span>.<span style="color:#a6e22e">error</span>(<span style="color:#e6db74">&#39;出错了，再检查一下吧&#39;</span>)
</span></span><span style="display:flex;"><span>    })
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/memos" term="memos" label="Memos"/><category scheme="https://nuoea.com/tags/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/></entry><entry><title type="html">开始连接，给Memos页面增加转发功能</title><link href="https://nuoea.com/memos-link-owner/" rel="alternate" type="text/html"/><id>https://nuoea.com/memos-link-owner/</id><published>2023-07-06T20:30:23+08:00</published><updated>2023-07-06T20:30:23+08:00</updated><content type="html"><![CDATA[<h2 id="前言">前言</h2>
<p>其实这个想法来自于 <a href="https://dongjunke.cn/">@小饿</a> 同学。在Memos页面拥有了发布框之后，我也一直在想，除了方便快捷之外，怎么可以让发布框更好用。转发功能的概念，让我眼前一亮。</p>
<blockquote>
<p>小饿： 转发功能，其实就是复制好友说说再评论，就更加接近微博了，信息连接效率会指数级提升。</p></blockquote>
<p>Memos诞生很长时间以来，很多人都是当个笔记应用，记录生活。后来因为[@林木木] 开始折腾。有了各种API，开始出现单独的Memos页面，也有了浏览器插件，各种手机APP。生态圈一下子就建立起来了。再到后来，木木兄为Memos开发了广场页面，尽可能多的将大家的信息聚合起来，自此，Memos开启了社交时代。</p>
<p>木木的<a href="https://immmmm.com/bbs/">「广场」</a>页面，其实已经非常趋近于微博。发布框加上后，功能已经非常完整了。所以当你拥有了一个Memos广场页面，并且加上了发布框。这个转发的功能，也可以折腾起来了。</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2023/07/06/1688646868.jpg" alt=""  /></p>
<h2 id="部署">部署</h2>
<ul>
<li>首先，给你的每一条Memos 增加一个转发按钮，并绑定一个点击事件。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">onclick</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;transPond(&#39;+JSON.stringify(memosForm)+&#39;)&#34;</span>&gt;&lt;/<span style="color:#f92672">a</span>&gt;
</span></span></code></pre></div><ul>
<li>然后，定义转发的内容。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">let</span> <span style="color:#a6e22e">memosForm</span> <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">creatorName</span><span style="color:#f92672">:</span><span style="color:#a6e22e">creatorName</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">content</span><span style="color:#f92672">:</span><span style="color:#a6e22e">transData</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">url</span><span style="color:#f92672">:</span><span style="color:#a6e22e">memosLink</span>
</span></span><span style="display:flex;"><span>};
</span></span></code></pre></div><ul>
<li>再然后，需要找到你页面中的发布框以及当前登录信息。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memosOpenId</span> <span style="color:#f92672">=</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-access-token&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memosPath</span> <span style="color:#f92672">=</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-access-path&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">getEditor</span> <span style="color:#f92672">=</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-editor-display&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memosTextarea</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">querySelector</span>(<span style="color:#e6db74">&#34;.memos-editor-textarea&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memosVisibilitySelect</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">querySelector</span>(<span style="color:#e6db74">&#34;.select-memos-value&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">submitMemoBtn</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">querySelector</span>(<span style="color:#e6db74">&#34;.submit-memos-btn&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">editMemoDom</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">querySelector</span>(<span style="color:#e6db74">&#34;.edit-memos&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">editMemoBtn</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">querySelector</span>(<span style="color:#e6db74">&#34;.edit-memos-btn&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">cancelEditBtn</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">querySelector</span>(<span style="color:#e6db74">&#34;.cancel-edit-btn&#34;</span>);
</span></span></code></pre></div><ul>
<li>最后，给发布框中，添加转发内容。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">transRes</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;[@&#39;</span><span style="color:#f92672">+</span> <span style="color:#a6e22e">a</span>.<span style="color:#a6e22e">creatorName</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#39;](&#39;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">a</span>.<span style="color:#a6e22e">url</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#39;) \n\n&gt; &#39;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">a</span>.<span style="color:#a6e22e">creatorName</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#39;: &#39;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">a</span>.<span style="color:#a6e22e">content</span>;
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">value</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">transRes</span>;
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">style</span>.<span style="color:#a6e22e">height</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">scrollHeight</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#39;px&#39;</span>;
</span></span><span style="display:flex;"><span>document.<span style="color:#a6e22e">body</span>.<span style="color:#a6e22e">scrollIntoView</span>({<span style="color:#a6e22e">behavior</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;smooth&#39;</span>})
</span></span></code></pre></div><p>完整点击事件代码如下：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#75715e">//转发
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">transPond</span>(<span style="color:#a6e22e">a</span>){
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memosTextarea</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">querySelector</span>(<span style="color:#e6db74">&#34;.memos-editor-textarea&#34;</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">getEditor</span> <span style="color:#f92672">=</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-editor-display&#34;</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">memosOpenId</span> <span style="color:#f92672">=</span> window.<span style="color:#a6e22e">localStorage</span> <span style="color:#f92672">&amp;&amp;</span> window.<span style="color:#a6e22e">localStorage</span>.<span style="color:#a6e22e">getItem</span>(<span style="color:#e6db74">&#34;memos-access-token&#34;</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">if</span>(<span style="color:#a6e22e">memosOpenId</span> <span style="color:#f92672">&amp;&amp;</span> <span style="color:#a6e22e">getEditor</span> <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;show&#34;</span>){
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">transRes</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;[@&#39;</span><span style="color:#f92672">+</span> <span style="color:#a6e22e">a</span>.<span style="color:#a6e22e">creatorName</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#39;](&#39;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">a</span>.<span style="color:#a6e22e">url</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#39;) \n\n&gt; &#39;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">a</span>.<span style="color:#a6e22e">creatorName</span><span style="color:#f92672">+</span><span style="color:#e6db74">&#39;: &#39;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">a</span>.<span style="color:#a6e22e">content</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">value</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">transRes</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">style</span>.<span style="color:#a6e22e">height</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memosTextarea</span>.<span style="color:#a6e22e">scrollHeight</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#39;px&#39;</span>;
</span></span><span style="display:flex;"><span>    document.<span style="color:#a6e22e">body</span>.<span style="color:#a6e22e">scrollIntoView</span>({<span style="color:#a6e22e">behavior</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;smooth&#39;</span>})
</span></span><span style="display:flex;"><span>  }<span style="color:#66d9ef">else</span>{
</span></span><span style="display:flex;"><span>    window.<span style="color:#a6e22e">open</span>(<span style="color:#a6e22e">a</span>.<span style="color:#a6e22e">url</span>);<span style="color:#75715e">//如果没登录，则不转发直接跳转。
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h2 id="最后">最后</h2>
<p>效果如下：</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2023/07/06/1688649915.jpg" alt=""  /></p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2023/07/06/1688649318.jpg" alt=""  /></p>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/memos" term="memos" label="Memos"/><category scheme="https://nuoea.com/tags/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/></entry><entry><title type="html">给Memos页面添加发布框</title><link href="https://nuoea.com/add-memos-editor/" rel="alternate" type="text/html"/><id>https://nuoea.com/add-memos-editor/</id><published>2023-07-01T21:39:02+08:00</published><updated>2023-07-01T21:39:02+08:00</updated><content type="html"><![CDATA[<h2 id="起因">起因</h2>
<p>最开始是看到 <code>@林木木</code> 发的一条哔哔。说是想要在Memos页面内嵌入哔哔单页，从而可以实现在一个页面内发布哔哔以及浏览哔哔。寻思这样一来，体验确实是可以好很多，不需要切来切去，更有沉浸感。</p>
<h2 id="部署代码">部署代码</h2>
<ul>
<li>HTML</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;memos&#34;</span>&gt;&lt;/<span style="color:#f92672">div</span>&gt;
</span></span></code></pre></div><ul>
<li>CSS</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-css" data-lang="css"><span style="display:flex;"><span>.<span style="color:#a6e22e">load-memos-editor</span>{<span style="color:#66d9ef">position</span>:<span style="color:#66d9ef">fixed</span>;<span style="color:#66d9ef">right</span>:<span style="color:#ae81ff">1</span><span style="color:#66d9ef">rem</span>;<span style="color:#66d9ef">bottom</span>:<span style="color:#ae81ff">1</span><span style="color:#66d9ef">rem</span>;<span style="color:#66d9ef">background-color</span>:<span style="color:#ae81ff">#ebeced</span>;}
</span></span><span style="display:flex;"><span>.<span style="color:#a6e22e">memos-editor-body</span>{<span style="color:#66d9ef">display</span>:<span style="color:#66d9ef">flex</span>;<span style="color:#66d9ef">border-radius</span>:<span style="color:#ae81ff">.33</span><span style="color:#66d9ef">rem</span>;<span style="color:#66d9ef">background-color</span>:<span style="color:#a6e22e">var</span>(<span style="color:#f92672">--</span>light<span style="color:#f92672">-</span>background<span style="color:#f92672">-</span>secondary);<span style="color:#66d9ef">flex-direction</span>:<span style="color:#66d9ef">column</span>}
</span></span><span style="display:flex;"><span>.<span style="color:#a6e22e">dark</span> .<span style="color:#a6e22e">memos-editor-body</span> {<span style="color:#66d9ef">background-color</span>: <span style="color:#a6e22e">var</span>(<span style="color:#f92672">--</span>dark<span style="color:#f92672">-</span>background<span style="color:#f92672">-</span>secondary);}
</span></span><span style="display:flex;"><span>.<span style="color:#a6e22e">memos-editor-content</span><span style="color:#f92672">,</span>.<span style="color:#a6e22e">memos-editor-footer</span><span style="color:#f92672">,</span>.<span style="color:#a6e22e">memos-editor-option</span>{<span style="color:#66d9ef">display</span>: <span style="color:#66d9ef">flex</span>;}
</span></span><span style="display:flex;"><span>.<span style="color:#a6e22e">memos-editor-content</span> .<span style="color:#a6e22e">memos-editor-inputer</span>{<span style="color:#66d9ef">overflow-x</span>:<span style="color:#66d9ef">hidden</span>;<span style="color:#66d9ef">overflow-y</span>:<span style="color:#66d9ef">clip</span>;<span style="color:#66d9ef">padding</span>:<span style="color:#ae81ff">0</span>;<span style="color:#66d9ef">width</span>:<span style="color:#ae81ff">100</span><span style="color:#66d9ef">%</span>;<span style="color:#66d9ef">max-height</span>:<span style="color:#ae81ff">160</span><span style="color:#66d9ef">px</span>;<span style="color:#66d9ef">outline</span>:<span style="color:#ae81ff">2</span><span style="color:#66d9ef">px</span> <span style="color:#66d9ef">solid</span> <span style="color:#66d9ef">transparent</span>;<span style="color:#66d9ef">outline-offset</span>:<span style="color:#ae81ff">2</span><span style="color:#66d9ef">px</span>;<span style="color:#66d9ef">background-color</span>:<span style="color:#66d9ef">transparent</span>;<span style="color:#66d9ef">white-space</span>:<span style="color:#66d9ef">pre-wrap</span>;<span style="color:#66d9ef">line-height</span>:<span style="color:#ae81ff">2</span><span style="color:#66d9ef">rem</span>;<span style="color:#66d9ef">resize</span>:<span style="color:#66d9ef">none</span>;<span style="color:#66d9ef">overflow-wrap</span>:anywhere;<span style="color:#66d9ef">word-break</span>:<span style="color:#66d9ef">normal</span>}
</span></span><span style="display:flex;"><span>.<span style="color:#a6e22e">memos-editor-tools</span>{<span style="color:#66d9ef">display</span>: <span style="color:#66d9ef">flex</span>;<span style="color:#66d9ef">flex-direction</span>: <span style="color:#66d9ef">column</span>;}
</span></span><span style="display:flex;"><span>.<span style="color:#a6e22e">memos-editor-tools</span> .<span style="color:#a6e22e">action-btn</span> {<span style="color:#66d9ef">padding</span>: <span style="color:#ae81ff">.25</span><span style="color:#66d9ef">rem</span>;}
</span></span><span style="display:flex;"><span>.<span style="color:#a6e22e">memos-editor-tools</span> .<span style="color:#a6e22e">memos-tag-list</span> {<span style="color:#66d9ef">display</span>:<span style="color:#66d9ef">flex</span>;<span style="color:#66d9ef">flex-wrap</span>:<span style="color:#66d9ef">wrap</span>;<span style="color:#66d9ef">align-items</span>:<span style="color:#66d9ef">center</span>;<span style="color:#66d9ef">line-height</span>:<span style="color:#ae81ff">2</span>;}
</span></span><span style="display:flex;"><span>.<span style="color:#a6e22e">memos-editor-tools</span> .<span style="color:#a6e22e">memos-tag</span> {<span style="color:#66d9ef">position</span>:<span style="color:#66d9ef">relative</span>;}
</span></span><span style="display:flex;"><span>.<span style="color:#a6e22e">memos-editor-tools</span> .<span style="color:#a6e22e">memos-tag</span> <span style="color:#f92672">a</span> {<span style="color:#66d9ef">flex</span>:<span style="color:#ae81ff">1</span>}
</span></span></code></pre></div><ul>
<li>JS</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#f92672">&lt;</span><span style="color:#a6e22e">script</span><span style="color:#f92672">&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">memosData</span> <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">dom</span><span style="color:#f92672">:</span><span style="color:#e6db74">&#39;#memos&#39;</span>,
</span></span><span style="display:flex;"><span>};
</span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;</span><span style="color:#960050;background-color:#1e0010">/script&gt;</span>
</span></span></code></pre></div><ul>
<li>页面布局</li>
</ul>
<blockquote>
<p><a href="https://github.com/insdram/hugo/blob/main/static/css/grid.css">grid.css</a></p></blockquote>
<ul>
<li>字体图标</li>
</ul>
<blockquote>
<p><a href="https://github.com/insdram/hugo/blob/main/static/css/iconfont.css">iconfont.css</a></p></blockquote>
<ul>
<li>Javascript</li>
</ul>
<blockquote>
<p><a href="https://github.com/insdram/hugo/blob/main/static/js/memos-editor.js">memos-editor.js</a></p></blockquote>
<ul>
<li>消息提醒弹窗</li>
</ul>
<pre tabindex="0"><code>https://github.com/TheWindRises-2/coco-message
</code></pre><ul>
<li>Animate.css</li>
</ul>
<pre tabindex="0"><code>https://animate.style/
</code></pre><h2 id="使用说明">使用说明</h2>
<ul>
<li>填入 <code>Memos Open API</code> ，格式如下：</li>
</ul>
<pre tabindex="0"><code>https://memos.example.com/api/memo?openId=&lt;Memos Open API&gt;
</code></pre><ul>
<li>开始哔哔吧</li>
</ul>
<h2 id="在线围观">在线围观</h2>
<p>围观地址：https://nuoea.com/memos</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2023/06/30/1688138493.jpg" alt=""  /></p>
<h2 id="致谢">致谢</h2>
<ul>
<li><a href="https://immmmm.com/chrome-extensions-memos-bber/">Memos 单页及浏览器扩展：：木木木木木</a></li>
<li><a href="https://immmmm.com/memos-api-description/">Memos API 非官方不完全说明：：木木木木木</a></li>
</ul>
<h2 id="更新日志">更新日志</h2>
<ul>
<li><strong>2023-07-01</strong> 正式上线</li>
<li><strong>2023-07-02</strong> 新增：上传图片</li>
<li><strong>2023-07-02</strong> 修复：API地址多出<code>/</code>导致“Memos Open API 有误，请重新输入!”的问题</li>
<li><strong>2023-07-03</strong> 新增：随机回顾一条 Memos</li>
<li><strong>2023-07-04</strong> 新增：切换当前 Memos Open API</li>
<li><strong>2023-07-09</strong> 新增：光标自动定位（感谢 <a href="https://koobai.com/">@空白生活</a> ）</li>
<li><strong>2023-07-09</strong> 修复：随机Memos中最多只能显示1个标签的问题（感谢 <a href="https://koobai.com/">@空白生活</a> ）</li>
<li><strong>2023-07-18</strong> 新增：适配 <code>0.14.0</code> 版本API</li>
<li><strong>2023-07-19</strong> 新增：资源库图片删除</li>
<li><strong>2023-07-19</strong> 新增：编辑按钮</li>
<li><strong>2023-07-19</strong> 修复：无法新增TAG标签的问题</li>
</ul>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/memos" term="memos" label="Memos"/><category scheme="https://nuoea.com/tags/%E6%95%99%E7%A8%8B" term="%E6%95%99%E7%A8%8B" label="教程"/></entry><entry><title type="html">Memos页面添加Twikoo评论系统</title><link href="https://nuoea.com/memos-twikoo/" rel="alternate" type="text/html"/><id>https://nuoea.com/memos-twikoo/</id><published>2023-06-05T21:56:31+08:00</published><updated>2023-06-05T21:56:31+08:00</updated><content type="html"><![CDATA[<h2 id="写在前面">写在前面</h2>
<p>如果没有木木老师的<a href="https://immmmm.com/memos-with-twikoo/">《Memos x Twikoo》</a>我是根本不会把这两个毫不相干的系统联系起来的，在给Memos添加了Twikoo评论系统之后，因为增加了社交属性，所以BB的时候，都更带劲了。</p>
<p>而美中不足的就是如果需要评论，需要跳转到Memos的页面内，这对于用户体验来说，还是略有不足的。而就在前不久，拾月老师的一篇<a href="https://www.skyue.com/23051422.html">《单页 Memos 添加 Artalk 评论，无限接近微博》</a>让评论系统嵌入Memos页面内，从而可以沉浸式边BB边吐槽，让Momos从一个记录工具成功变身微博、朋友圈，可玩性大增。只不过我看教程用的都是<code>Artalk</code>这个评论工具，作为用着<code>Twikoo</code>很顺手，并不想更换的我来说，只能自己根据大佬们提供的思路，自行折腾了。</p>
<h2 id="评论数量">评论数量</h2>
<p>关于Memos页面的搭建，直接用木木老师的就好。木木老师开发的版本，代码逻辑清晰，功能完善，开箱即用。Twikoo评论数量的实现在官网有相应API。</p>
<blockquote>
<p>批量获取文章评论数</p></blockquote>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#a6e22e">twikoo</span>.<span style="color:#a6e22e">getCommentsCount</span>({
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">envId</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;您的环境id&#39;</span>, <span style="color:#75715e">// 环境 ID
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  <span style="color:#75715e">// region: &#39;ap-guangzhou&#39;, // 环境地域，默认为 ap-shanghai，如果您的环境地域不是上海，需传此参数
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  <span style="color:#a6e22e">urls</span><span style="color:#f92672">:</span> [ <span style="color:#75715e">// 不包含协议、域名、参数的文章路径列表，必传参数
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>    <span style="color:#e6db74">&#39;/2020/10/post-1.html&#39;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#39;/2020/11/post-2.html&#39;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#39;/2020/12/post-3.html&#39;</span>
</span></span><span style="display:flex;"><span>  ],
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">includeReply</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">false</span> <span style="color:#75715e">// 评论数是否包括回复，默认：false
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>}).<span style="color:#a6e22e">then</span>(<span style="color:#66d9ef">function</span> (<span style="color:#a6e22e">res</span>) {
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#a6e22e">res</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#75715e">// 返回示例: [
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  <span style="color:#75715e">//   { url: &#39;/2020/10/post-1.html&#39;, count: 10 },
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  <span style="color:#75715e">//   { url: &#39;/2020/11/post-2.html&#39;, count: 0 },
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  <span style="color:#75715e">//   { url: &#39;/2020/12/post-3.html&#39;, count: 20 }
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  <span style="color:#75715e">// ]
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>}).<span style="color:#66d9ef">catch</span>(<span style="color:#66d9ef">function</span> (<span style="color:#a6e22e">err</span>) {
</span></span><span style="display:flex;"><span>  <span style="color:#75715e">// 发生错误
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">error</span>(<span style="color:#a6e22e">err</span>);
</span></span><span style="display:flex;"><span>});
</span></span></code></pre></div><p>请求中，需要一个评论URL的数组，所以我的思路是先通过Api获取Memos的数据。在遍历获取到的数据之后，拿到我所希望的由URL组成的数组。</p>
<p>直接在 getFirstList（） 方法中增加一个方法 updateTiwkoo()，并传值。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">getFirstList</span>() {
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">bbUrl</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">memos</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34;api/memo?creatorId=&#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">bbMemo</span>.<span style="color:#a6e22e">creatorId</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34;&amp;rowStatus=NORMAL&amp;limit=&#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">limit</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">fetch</span>(<span style="color:#a6e22e">bbUrl</span>).<span style="color:#a6e22e">then</span>(<span style="color:#a6e22e">res</span> =&gt; <span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">json</span>()).<span style="color:#a6e22e">then</span>(<span style="color:#a6e22e">resdata</span> =&gt; {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">updateTiwkoo</span>(<span style="color:#a6e22e">resdata</span>.<span style="color:#a6e22e">data</span>)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">nowLength</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">resdata</span>.<span style="color:#a6e22e">data</span>.<span style="color:#a6e22e">length</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">nowLength</span> <span style="color:#f92672">&lt;</span> <span style="color:#a6e22e">limit</span>) { <span style="color:#75715e">//返回数据条数小于 limit 则直接移除“加载更多”按钮，中断预加载
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>      document.<span style="color:#a6e22e">querySelector</span>(<span style="color:#e6db74">&#34;button.button-load&#34;</span>).<span style="color:#a6e22e">remove</span>()
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">return</span>
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">page</span><span style="color:#f92672">++</span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">offset</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">limit</span> <span style="color:#f92672">*</span> (<span style="color:#a6e22e">page</span> <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>)
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">getNextList</span>()
</span></span><span style="display:flex;"><span>  });
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">updateTiwkoo</span>(<span style="color:#a6e22e">data</span>) {
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">twiID</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">data</span>.<span style="color:#a6e22e">map</span>((<span style="color:#a6e22e">item</span>) =&gt; <span style="color:#a6e22e">memos</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34;m/&#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">id</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">twikoo</span>.<span style="color:#a6e22e">getCommentsCount</span>({
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">envId</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">envId</span>, <span style="color:#75715e">// 环境 ID
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>    <span style="color:#a6e22e">urls</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">twiID</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">includeReply</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">true</span> <span style="color:#75715e">// 评论数是否包括回复，默认：false
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  }).<span style="color:#a6e22e">then</span>(<span style="color:#66d9ef">function</span> (<span style="color:#a6e22e">res</span>) {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">updateCount</span>(<span style="color:#a6e22e">res</span>)
</span></span><span style="display:flex;"><span>  }).<span style="color:#66d9ef">catch</span>(<span style="color:#66d9ef">function</span> (<span style="color:#a6e22e">err</span>) {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">error</span>(<span style="color:#a6e22e">err</span>);
</span></span><span style="display:flex;"><span>  });
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">updateCount</span>(<span style="color:#a6e22e">res</span>) {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">twiCount</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">map</span>((<span style="color:#a6e22e">item</span>) =&gt; {
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">return</span> Object.<span style="color:#a6e22e">assign</span>({},{<span style="color:#e6db74">&#39;count&#39;</span><span style="color:#f92672">:</span><span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">count</span>})
</span></span><span style="display:flex;"><span>    });
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">bbTwikoo</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">data</span>.<span style="color:#a6e22e">map</span>((<span style="color:#a6e22e">item</span>,<span style="color:#a6e22e">index</span>) =&gt; {
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">return</span> {...<span style="color:#a6e22e">item</span>, ...<span style="color:#a6e22e">twiCount</span>[<span style="color:#a6e22e">index</span>]};
</span></span><span style="display:flex;"><span>    });
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">updateHTMl</span>(<span style="color:#a6e22e">bbTwikoo</span>)
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>在获取到评论数的数据后，直接将两个数组合并。形成一个包含有评论数的新数组。</p>
<h2 id="评论内容">评论内容</h2>
<p>主要是在 <code>Memos</code> 页面内增加一个 供 <code>Twikoo</code> 初始化的容器。并通过一系列触发操作显示渲染。详细如下：</p>
<p>首先，我们需要在页面内增加一个按钮，通过点击来触发评论加载。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">onclick</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#39;loadTwikoo(memosId)&#39;</span>&gt;&lt;/<span style="color:#f92672">a</span>&gt;
</span></span></code></pre></div><p>其次，我们需要一个容纳 <code>Twikoo</code> 评论的容器，未触发时该容器隐藏。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#39;twikoo-body twikoo-memosId d-none&#39;</span>&gt;&lt;/<span style="color:#f92672">div</span>&gt;
</span></span></code></pre></div><p>最后，我们需要一个点击事件，将评论初始化。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">loadTwikoo</span>(<span style="color:#a6e22e">memosId</span>) {
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">twikooDom</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">querySelector</span>(<span style="color:#e6db74">&#39;.twikoo-memosId&#39;</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">twikooCon</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;&lt;div id=&#39;twikoo&#39;&gt;&lt;/div&gt;&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">twikooDom</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">contains</span>(<span style="color:#e6db74">&#39;d-none&#39;</span>)) {
</span></span><span style="display:flex;"><span>    document.<span style="color:#a6e22e">querySelectorAll</span>(<span style="color:#e6db74">&#39;.twikoo-body&#39;</span>).<span style="color:#a6e22e">forEach</span>((<span style="color:#a6e22e">item</span>) =&gt; {<span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">add</span>(<span style="color:#e6db74">&#39;d-none&#39;</span>);})
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span>(document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#34;twikoo&#34;</span>)){
</span></span><span style="display:flex;"><span>      document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#34;twikoo&#34;</span>).<span style="color:#a6e22e">remove</span>() <span style="color:#75715e">//如果页面中已经有其他Twikoo初始化，则移除。
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>    }
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">twikooDom</span>.<span style="color:#a6e22e">insertAdjacentHTML</span>(<span style="color:#e6db74">&#39;beforeend&#39;</span>, <span style="color:#a6e22e">twikooCon</span>); 
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">twikooDom</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">remove</span>(<span style="color:#e6db74">&#39;d-none&#39;</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">twikoo</span>.<span style="color:#a6e22e">init</span>({
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">envId</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">envId</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">el</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;#twikoo&#39;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">path</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">memosPath</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34;/m/&#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">memosId</span> 
</span></span><span style="display:flex;"><span>    });
</span></span><span style="display:flex;"><span>  }<span style="color:#66d9ef">else</span>{
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">twikooDom</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">add</span>(<span style="color:#e6db74">&#39;d-none&#39;</span>);
</span></span><span style="display:flex;"><span>    document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#34;twikoo&#34;</span>).<span style="color:#a6e22e">remove</span>()
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>值得一提的是，需要将该 <code>Twikoo</code> 的ID值传给触发的方法。</p>
<h2 id="最终效果">最终效果</h2>
<p>效果如下</p>
<p><img class="lozad" data-src="https://i.nuoea.com/img/2023/06/05/1685976063.jpg" alt=""  /></p>]]></content><category scheme="https://nuoea.com/categories/%E6%8A%98%E8%85%BE" term="%E6%8A%98%E8%85%BE" label="折腾"/><category scheme="https://nuoea.com/tags/memos" term="memos" label="Memos"/><category scheme="https://nuoea.com/tags/twikoo" term="twikoo" label="Twikoo"/></entry></feed>