<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Debounce on Tarragon</title><link>https://tarrragon.github.io/blog/tags/debounce/</link><description>Recent content in Debounce on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Fri, 19 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/debounce/index.xml" rel="self" type="application/rss+xml"/><item><title>搜尋 UX 模式</title><link>https://tarrragon.github.io/blog/ux-design/03-input-mechanism/search-ux-pattern/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ux-design/03-input-mechanism/search-ux-pattern/</guid><description>&lt;p>搜尋輸入的核心決策是「使用者輸入到什麼程度觸發搜尋」。這和 terminal 輸入的 submit model 維度相同 — 差別在 terminal 場景的選項是「整行 vs 逐字元」，搜尋場景的選項是「按送出 vs 即時 vs debounce」。&lt;/p>
&lt;h2 id="三種觸發模式">三種觸發模式&lt;/h2>
&lt;h3 id="按送出觸發">按送出觸發&lt;/h3>
&lt;p>使用者打完搜尋詞、按搜尋按鈕後觸發一次搜尋。最簡單的模式 — 一次搜尋、一次 API 呼叫、一次結果顯示。&lt;/p>
&lt;p>適合搜尋成本高的場景：資料庫全文搜尋、外部 API 呼叫（有速率限制或費用）、搜尋結果需要複雜運算。&lt;/p>
&lt;h3 id="即時觸發instant">即時觸發（instant）&lt;/h3>
&lt;p>使用者每輸入一個字元就觸發搜尋。結果即時更新，使用者可以在輸入過程中看到搜尋結果逐漸精確。&lt;/p>
&lt;p>適合搜尋成本低的場景：client 端的本地過濾、記憶體內的資料集篩選、已快取的少量資料。&lt;/p>
&lt;p>即時觸發在搜尋成本高的場景會產生問題：使用者輸入 &lt;code>hello&lt;/code> 的過程中觸發五次 API 呼叫（&lt;code>h&lt;/code>、&lt;code>he&lt;/code>、&lt;code>hel&lt;/code>、&lt;code>hell&lt;/code>、&lt;code>hello&lt;/code>），前四次的結果在使用者看到之前就被覆蓋。浪費的 API 呼叫增加 server 負載和使用者的網路流量。&lt;/p>
&lt;h3 id="debounce-觸發">Debounce 觸發&lt;/h3>
&lt;p>使用者停止輸入一段時間後（通常 300-500ms）觸發搜尋。平衡即時回饋和 API 呼叫次數 — 使用者連續打字時不觸發，停下來時觸發一次。&lt;/p>
&lt;p>Debounce 是遠端搜尋場景的常見選擇。延遲時間的設定是 UX trade-off：太短（100ms）接近即時觸發，API 呼叫次數多；太長（1000ms）使用者感覺到明顯延遲。300-500ms 是多數場景的合理區間。&lt;/p>
&lt;h2 id="搜尋結果的顯示">搜尋結果的顯示&lt;/h2>
&lt;h3 id="suggestion-list建議列表">Suggestion list（建議列表）&lt;/h3>
&lt;p>在搜尋框下方即時顯示候選結果。使用者可以點選候選項完成搜尋，不需要打完整個搜尋詞。&lt;/p>
&lt;p>Suggestion list 適合搜尋詞有限且可列舉的場景（城市名、產品名、使用者名）。搜尋詞無限（全文搜尋）時 suggestion list 的候選項品質依賴搜尋演算法。&lt;/p>
&lt;h3 id="結果頁">結果頁&lt;/h3>
&lt;p>使用者送出搜尋後導航到獨立的結果頁面。適合結果量大、需要分頁、每筆結果需要較多空間展示的場景。&lt;/p>
&lt;h3 id="即時過濾filter">即時過濾（filter）&lt;/h3>
&lt;p>在現有列表上即時隱藏不符合搜尋條件的項目，不導航到新頁面。適合「在已經看得到的清單中找到特定項目」的場景。&lt;/p>
&lt;h2 id="keyboard-type-和-textinputaction">keyboard type 和 textInputAction&lt;/h2>
&lt;p>搜尋框的 keyboard type 通常用 &lt;code>text&lt;/code>（一般文字），搭配 &lt;code>textInputAction: search&lt;/code> 讓鍵盤的 Enter 鍵顯示搜尋圖示（放大鏡）而非換行或送出圖示。&lt;/p>
&lt;p>這個細節影響使用者的操作直覺 — 看到搜尋圖示的按鈕，使用者知道按下去會觸發搜尋；看到換行圖示，使用者可能猶豫按下去會不會換行。&lt;/p>
&lt;h2 id="下一步路由">下一步路由&lt;/h2>
&lt;ul>
&lt;li>四維度決策表總覽 → &lt;a href="https://tarrragon.github.io/blog/ux-design/03-input-mechanism/four-dimension-decision/" data-link-title="輸入機制決策表" data-link-desc="Keyboard type / submit model / IME policy / special keys 四個維度的決策框架 — 每個維度都是設計決策，影響 UI layout 和 protocol">輸入機制決策表&lt;/a>&lt;/li>
&lt;li>Terminal 場景的 submit model → &lt;a href="https://tarrragon.github.io/blog/ux-design/03-input-mechanism/terminal-input-design/" data-link-title="Terminal app 輸入設計" data-link-desc="CLI 場景在手機上的特殊需求 — 非自然語言輸入、特殊按鍵需求、整行 vs 逐字元送出對 protocol 的影響">Terminal app 輸入設計&lt;/a>&lt;/li>
&lt;li>表單場景的驗證設計 → &lt;a href="https://tarrragon.github.io/blog/ux-design/03-input-mechanism/form-ux-pattern/" data-link-title="表單 UX 模式" data-link-desc="表單輸入的驗證時機、auto-fill 支援、錯誤回饋設計 — 和 terminal 輸入的決策維度相同但選項不同">表單 UX 模式&lt;/a>&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>搜尋輸入的核心決策是「使用者輸入到什麼程度觸發搜尋」。這和 terminal 輸入的 submit model 維度相同 — 差別在 terminal 場景的選項是「整行 vs 逐字元」，搜尋場景的選項是「按送出 vs 即時 vs debounce」。</p>
<h2 id="三種觸發模式">三種觸發模式</h2>
<h3 id="按送出觸發">按送出觸發</h3>
<p>使用者打完搜尋詞、按搜尋按鈕後觸發一次搜尋。最簡單的模式 — 一次搜尋、一次 API 呼叫、一次結果顯示。</p>
<p>適合搜尋成本高的場景：資料庫全文搜尋、外部 API 呼叫（有速率限制或費用）、搜尋結果需要複雜運算。</p>
<h3 id="即時觸發instant">即時觸發（instant）</h3>
<p>使用者每輸入一個字元就觸發搜尋。結果即時更新，使用者可以在輸入過程中看到搜尋結果逐漸精確。</p>
<p>適合搜尋成本低的場景：client 端的本地過濾、記憶體內的資料集篩選、已快取的少量資料。</p>
<p>即時觸發在搜尋成本高的場景會產生問題：使用者輸入 <code>hello</code> 的過程中觸發五次 API 呼叫（<code>h</code>、<code>he</code>、<code>hel</code>、<code>hell</code>、<code>hello</code>），前四次的結果在使用者看到之前就被覆蓋。浪費的 API 呼叫增加 server 負載和使用者的網路流量。</p>
<h3 id="debounce-觸發">Debounce 觸發</h3>
<p>使用者停止輸入一段時間後（通常 300-500ms）觸發搜尋。平衡即時回饋和 API 呼叫次數 — 使用者連續打字時不觸發，停下來時觸發一次。</p>
<p>Debounce 是遠端搜尋場景的常見選擇。延遲時間的設定是 UX trade-off：太短（100ms）接近即時觸發，API 呼叫次數多；太長（1000ms）使用者感覺到明顯延遲。300-500ms 是多數場景的合理區間。</p>
<h2 id="搜尋結果的顯示">搜尋結果的顯示</h2>
<h3 id="suggestion-list建議列表">Suggestion list（建議列表）</h3>
<p>在搜尋框下方即時顯示候選結果。使用者可以點選候選項完成搜尋，不需要打完整個搜尋詞。</p>
<p>Suggestion list 適合搜尋詞有限且可列舉的場景（城市名、產品名、使用者名）。搜尋詞無限（全文搜尋）時 suggestion list 的候選項品質依賴搜尋演算法。</p>
<h3 id="結果頁">結果頁</h3>
<p>使用者送出搜尋後導航到獨立的結果頁面。適合結果量大、需要分頁、每筆結果需要較多空間展示的場景。</p>
<h3 id="即時過濾filter">即時過濾（filter）</h3>
<p>在現有列表上即時隱藏不符合搜尋條件的項目，不導航到新頁面。適合「在已經看得到的清單中找到特定項目」的場景。</p>
<h2 id="keyboard-type-和-textinputaction">keyboard type 和 textInputAction</h2>
<p>搜尋框的 keyboard type 通常用 <code>text</code>（一般文字），搭配 <code>textInputAction: search</code> 讓鍵盤的 Enter 鍵顯示搜尋圖示（放大鏡）而非換行或送出圖示。</p>
<p>這個細節影響使用者的操作直覺 — 看到搜尋圖示的按鈕，使用者知道按下去會觸發搜尋；看到換行圖示，使用者可能猶豫按下去會不會換行。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>四維度決策表總覽 → <a href="/blog/ux-design/03-input-mechanism/four-dimension-decision/" data-link-title="輸入機制決策表" data-link-desc="Keyboard type / submit model / IME policy / special keys 四個維度的決策框架 — 每個維度都是設計決策，影響 UI layout 和 protocol">輸入機制決策表</a></li>
<li>Terminal 場景的 submit model → <a href="/blog/ux-design/03-input-mechanism/terminal-input-design/" data-link-title="Terminal app 輸入設計" data-link-desc="CLI 場景在手機上的特殊需求 — 非自然語言輸入、特殊按鍵需求、整行 vs 逐字元送出對 protocol 的影響">Terminal app 輸入設計</a></li>
<li>表單場景的驗證設計 → <a href="/blog/ux-design/03-input-mechanism/form-ux-pattern/" data-link-title="表單 UX 模式" data-link-desc="表單輸入的驗證時機、auto-fill 支援、錯誤回饋設計 — 和 terminal 輸入的決策維度相同但選項不同">表單 UX 模式</a></li>
</ul>
]]></content:encoded></item></channel></rss>