<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>mutationobserver &#8211; 小豬日常</title>
	<atom:link href="https://piglife.tw/tag/mutationobserver/feed/" rel="self" type="application/rss+xml" />
	<link>https://piglife.tw</link>
	<description>Hello World，一個紀錄生活與學習的地方</description>
	<lastBuildDate>Fri, 12 Dec 2025 14:51:22 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>

<image>
	<url>https://piglife.tw/wp-content/uploads/2017/10/cropped-logo-1-32x32.png</url>
	<title>mutationobserver &#8211; 小豬日常</title>
	<link>https://piglife.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>使用 MutationObserver 監聽 DOM 變化並更新 Cookie 的實作筆記</title>
		<link>https://piglife.tw/technical-notes/mutationobserver-dom-cookie/</link>
					<comments>https://piglife.tw/technical-notes/mutationobserver-dom-cookie/#respond</comments>
		
		<dc:creator><![CDATA[小豬]]></dc:creator>
		<pubDate>Tue, 04 Feb 2025 12:40:46 +0000</pubDate>
				<category><![CDATA[技術筆記]]></category>
		<category><![CDATA[cookie更新]]></category>
		<category><![CDATA[dom監聽]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[mutationobserver]]></category>
		<category><![CDATA[前端技術]]></category>
		<category><![CDATA[動態內容]]></category>
		<category><![CDATA[資料持久化]]></category>
		<guid isPermaLink="false">https://piglife.tw/?p=480</guid>

					<description><![CDATA[介紹如何使用 MutationObserver 監聽特定 DOM 元素變化，並將變更內容同步更新到 ...]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">前言</h2>
<p>在 Web 開發中，動態更新的 DOM 元素常因 AJAX 或前端框架渲染而改變，這些變化不一定會觸發傳統事件。若需要即時監控特定元素內容變化並同步更新到 Cookie，MutationObserver 是一個有效的解決方案。本文針對如何監聽 class 為 <code>.am-cappa__name</code> 的元素變化，並將其內容存入 Cookie 進行說明。</p>
<h2 class="wp-block-heading">為何需要監聽 DOM 變化？</h2>
<p>動態網頁中，元素內容可能透過非同步請求或前端框架更新，這些變化不會觸發像 click、input 等事件。若想在內容變更時執行特定邏輯（例如同步資料），MutationObserver 可監聽子節點或文字內容的變動，達成即時反應。</p>
<h2 class="wp-block-heading">監聽 .am-cappa__name 並更新 Cookie 的核心邏輯</h2>
<ol>
<li>使用 <code>MutationObserver</code> 監聽目標元素的子節點與文字變化：
<pre><code class="lang-js language-js js">const observer = new MutationObserver(() =&gt; {
saveCappaName();
});</code></pre></li>
<li>透過 <code>observer.observe()</code> 設定監聽選項，包含 <code>childList</code>、<code>characterData</code> 與 <code>subtree</code>，確保所有子節點及文字變化都能被捕捉。</li>
<li>定義 <code>saveCappaName()</code> 函式，取得 <code>.am-cappa__name</code> 元素的文字內容，並與上一次儲存的值比較，若不同則更新 Cookie：
<pre><code class="lang-js language-js js">function saveCappaName() {
let cappaElement = document.querySelector(&quot;.am-cappa__name&quot;);
if (cappaElement) {
 let cappaValue = cappaElement.innerText.trim();
 if (cappaValue &amp;&amp; cappaValue !== lastCappaValue) {
   document.cookie = &quot;am_cappa_name=&quot; + encodeURIComponent(cappaValue) + &quot;; path=/; max-age=86400&quot;;
   lastCappaValue = cappaValue;
 }
}
}</code></pre></li>
<li>初始時嘗試取得目標元素並啟動監聽，若元素尚未載入，使用 <code>setTimeout</code> 每 500ms 重試，確保監聽能啟動。</li>
<li>為避免 MutationObserver 在某些情況下漏掉變化，額外使用 <code>setInterval</code> 每 500ms 強制執行一次 <code>saveCappaName()</code>，提高更新可靠性。</li>
</ol>
<h2 class="wp-block-heading">為何要存入 Cookie？</h2>
<ul>
<li><strong>跨頁面存取</strong>：Cookie 可在不同頁面間共享資料，方便維持狀態。</li>
<li><strong>持久化資料</strong>：設定 <code>max-age=86400</code>，資料可保存一天，使用者關閉瀏覽器後仍可讀取。</li>
<li><strong>後端存取</strong>：伺服器可從 HTTP 請求中讀取 Cookie，做進一步處理或驗證。</li>
</ul>
<h2 class="wp-block-heading">實際應用與延伸</h2>
<p>此技術適用於動態表單內容的即時保存、使用者偏好設定同步等場景。未來可結合 LocalStorage 或 IndexedDB 進行更複雜的資料管理，或搭配前端框架的狀態管理提升效能。</p>
<h2 class="wp-block-heading">常見坑</h2>
<ul>
<li>MutationObserver 監聽範圍設定不當可能漏掉變化，需包含 <code>subtree</code>。</li>
<li>監聽目標元素尚未載入時需重試，否則無法啟動監聽。</li>
<li>Cookie 大小限制與安全性考量，敏感資料不宜存放。</li>
</ul>
<h2 class="wp-block-heading">完整程式碼</h2>
<pre><code class="lang-text language-text text">document.addEventListener(&quot;DOMContentLoaded&quot;, function () {
  let lastCappaValue = &quot;&quot;; // 儲存上一次的值，避免重複存相同的值

  function saveCappaName() {
    let cappaElement = document.querySelector(&quot;.am-cappa__name&quot;);
    if (cappaElement) {
      let cappaValue = cappaElement.innerText.trim();
      if (cappaValue &amp;&amp; cappaValue !== lastCappaValue) {
        document.cookie = &quot;am_cappa_name=&quot; + encodeURIComponent(cappaValue) + &quot;; path=/; max-age=86400&quot;;
        console.log(&quot;Cookie 更新成功: &quot; + cappaValue);
        lastCappaValue = cappaValue; // 更新最後的值
      }
    }
  }

  // 使用 MutationObserver 監聽 `.am-cappa__name` 是否變更
  const observer = new MutationObserver(() =&gt; {
    saveCappaName(); // 內容變更時，更新 Cookie
  });

  function startObserving() {
    let targetElement = document.querySelector(&quot;.am-cappa__name&quot;);
    if (targetElement) {
      observer.observe(targetElement, { childList: true, characterData: true, subtree: true });
      saveCappaName(); // 先存一次當前值
    } else {
      // 若元素還沒出現，每 500ms 檢查一次
      setTimeout(startObserving, 500);
    }
  }

  // 額外增加每 500ms 手動檢查一次
  setInterval(() =&gt; {
    saveCappaName();
  }, 500);

  startObserving(); // 啟動監聽
});</code></pre>]]></content:encoded>
					
					<wfw:commentRss>https://piglife.tw/technical-notes/mutationobserver-dom-cookie/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
