FastComments.com

在文件、書籍等中新增即時內嵌評論

FastComments Collab Chat 讓使用者能在您網站上的任何文字內容中標註與註解,建立與特定文字選取相關聯的串狀討論。使用者可以選取單字、句子或整段文字,直接在內容中啟動協作對話。

此功能非常適合編輯回饋、協作閱讀環境、教育平台、文件審閱,以及任何需要將情境化討論錨定到特定文字的情境。

請注意,本文件特別針對 Collab Chat 功能。您也可以為頁數很多的內容(例如書籍)新增評論,採用每頁一個討論串(thread-per-page),無需使用 collab chat。FastComments 也不會按頁或按討論串收費。Collab Chat 專指當您想允許使用者選取文字並對已標註的文字段落發表評論的情況。

您可以在 這裡查看一個範例

範例 Internal Link

基本範例

使用 Collab Chat 最簡單的方式是針對單一內容容器。此範例示範如何在文章上啟用文字註解:

Collab Chat 基本範例
Copy CopyRun External Link
1
2<!DOCTYPE html>
3<html>
4<head>
5 <title>My Article with Collab Chat</title>
6</head>
7<body>
8 <div id="article-content" style="min-height: 500px">
9 <h1>My Article Title</h1>
10 <p>This is a paragraph that users can annotate. Simply highlight any text to start a discussion!</p>
11 <p>You can have multiple paragraphs, and users can highlight text across any of them.</p>
12 </div>
13
14 <script src="https://cdn.fastcomments.com/js/embed-collab-chat.min.js"></script>
15 <script>
16 FastCommentsCollabChat(document.getElementById('article-content'), {
17 tenantId: 'demo'
18 });
19 </script>
20</body>
21</html>
22

使用自訂 URL ID 的範例(例如每本書頁面、文章等)

預設情況下,Collab Chat 使用頁面 URL 結合元素路徑與文字範圍來識別對話。您可以提供自訂的 urlId,以更精確地控制對話的分組方式:

使用自訂 URL ID 的 Collab Chat 範例
Copy Copy
1
2<script src="https://cdn.fastcomments.com/js/embed-collab-chat.min.js"></script>
3<script>
4 FastCommentsCollabChat(document.getElementById('article-content'), {
5 tenantId: 'demo',
6 urlId: 'book-one-page-2'
7 });
8</script>
9

當您的 URL 結構變動但希望維持相同對話,或希望在多個頁面之間共用相同的對話註解時,這會很有用。

支援深色模式的範例

如果您的網站為深色背景,請啟用深色模式支援以確保聊天使用者介面顯示正常:

支援深色模式的 Collab Chat 範例
Copy CopyRun External Link
1
2<!DOCTYPE html>
3<html>
4<head>
5 <title>My Article with Collab Chat - Dark Mode</title>
6 <style>
7 body {
8 background-color: #1a1a1a !important;
9 color: #e0e0e0 !important;
10 font-family: system-ui, -apple-system, sans-serif;
11 padding: 20px;
12 margin: 0;
13 }
14 #article-content {
15 max-width: 800px;
16 margin: 0 auto;
17 background-color: #2d2d2d;
18 padding: 20px;
19 border-radius: 8px;
20 }
21 h1 {
22 color: #ffffff !important;
23 }
24 p {
25 color: #e0e0e0 !important;
26 line-height: 1.6;
27 }
28 .fastcomments-collab-chat-top-bar {
29 background-color: #2d2d2d !important;
30 color: #e0e0e0 !important;
31 border-bottom: 1px solid #444 !important;
32 }
33 </style>
34</head>
35<body>
36 <div id="article-content" style="min-height: 500px">
37 <h1>My Article Title</h1>
38 <p>This is a paragraph that users can annotate. Simply highlight any text to start a discussion!</p>
39 <p>You can have multiple paragraphs, and users can highlight text across any of them.</p>
40 </div>
41
42 <script src="https://cdn.fastcomments.com/js/embed-collab-chat.min.js"></script>
43 <script>
44 FastCommentsCollabChat(document.getElementById('article-content'), {
45 tenantId: 'demo',
46 hasDarkBackground: true
47 });
48 </script>
49</body>
50</html>
51

停用頂部列的範例

預設情況下,Collab Chat 會顯示包含使用者數與討論數的頂部列。您可以將它停用:

停用頂部列的 Collab Chat 範例
Copy CopyRun External Link
1
2<!DOCTYPE html>
3<html>
4<head>
5 <title>My Article with Collab Chat - No Top Bar</title>
6</head>
7<body>
8 <div id="article-content" style="min-height: 500px">
9 <h1>My Article Title</h1>
10 <p>This is a paragraph that users can annotate. Simply highlight any text to start a discussion!</p>
11 <p>You can have multiple paragraphs, and users can highlight text across any of them.</p>
12 </div>
13
14 <script src="https://cdn.fastcomments.com/js/embed-collab-chat.min.js"></script>
15 <script>
16 FastCommentsCollabChat(document.getElementById('article-content'), {
17 tenantId: 'demo',
18 topBarTarget: null
19 });
20 </script>
21</body>
22</html>
23

含評論數回呼的範例

您可以使用 commentCountUpdated 回呼來追蹤評論何時被新增或更新:

含評論數回呼的 Collab Chat 範例
Copy Copy
1
2<script src="https://cdn.fastcomments.com/js/embed-collab-chat.min.js"></script>
3<script>
4 FastCommentsCollabChat(document.getElementById('article-content'), {
5 tenantId: 'demo',
6 commentCountUpdated: function(count) {
7 console.log('Total comments:', count);
8 document.getElementById('comment-badge').textContent = count;
9 }
10 });
11</script>
12

多個區段的範例

您可以在頁面上的多個不同區段初始化 Collab Chat。每個區段會有各自獨立的註解:

多個區段的 Collab Chat 範例
Copy Copy
1
2<div id="intro-section">
3 <h2>Introduction</h2>
4 <p>Content for the introduction...</p>
5</div>
6
7<div id="main-section">
8 <h2>Main Content</h2>
9 <p>Content for the main article...</p>
10</div>
11
12<script src="https://cdn.fastcomments.com/js/embed-collab-chat.min.js"></script>
13<script>
14 // 在 intro 區段初始化
15 FastCommentsCollabChat(document.getElementById('intro-section'), {
16 tenantId: 'demo',
17 urlId: 'my-article-intro'
18 });
19
20 // 在 main 區段初始化
21 FastCommentsCollabChat(document.getElementById('main-section'), {
22 tenantId: 'demo',
23 urlId: 'my-article-main'
24 });
25</script>
26

為線上書籍新增即時評論 Internal Link

如有需要,你可以為每一頁初始化 Collab Chat,並為每頁建立獨立的討論串,僅需將 urlId 參數 設為像 book-one-page1 這樣的值即可。此設定也適用於 normal commenting widget

文字選取行為 Internal Link

How Text Selection Works

當使用者在 Collab Chat 容器中選取文字時,元件會擷取該選取範圍並允許他們開始討論。選取範圍可以小到單字,也可以大到跨越不同元素的多個段落。

Selection Delay

在桌面裝置上,使用者選取文字與討論提示出現之間會有 3.5 秒的延遲。這可避免使用者僅為了複製或閱讀而暫時標記文字時造成介面閃爍。在行動裝置上,因為在觸控螢幕上選取文字通常較為刻意,提示會立即出現。

Unique Conversation IDs

每個會話都會有一個唯一的 urlId,它結合了頁面 URL、DOM 元素路徑以及序列化的文字範圍。這可確保每次文字選取都會建立一個可供日後再次找到的不同會話。

如果您在設定中提供自訂的 urlId,它會與元素路徑和文字範圍結合以建立最終識別碼。

Visual Highlights

當特定文字選取有討論存在時,該文字會獲得視覺高亮。高亮是使用背景顏色實作的,並在滑鼠停留或相關聊天室開啟時顯示。

高亮系統的實作方式是將被選取的文字包裹在可套用樣式的特殊元素中。此方法可確保即使在底層 HTML 結構複雜時,高亮仍能保持準確。

Chat Window Positioning

當使用者點擊高亮或建立新的註解時,聊天視窗會出現在靠近選取文字的位置。元件會根據可用的視窗空間自動計算該視窗的最佳位置。

定位系統會使用像是 to-rightto-leftto-topto-bottom 的 CSS 類別來指示聊天視窗應該從高亮延伸的方向。在行動裝置(螢幕寬度低於 768px)上,聊天視窗為了更佳可用性會固定以全螢幕顯示。

Chat Window Dimensions

聊天視窗在桌面上寬度為 410px,並具有 20px 的間距,以及一個指向高亮文字的 16px 視覺箭頭。這些尺寸是固定的以確保行為一致,但您可以使用 CSS 自訂外觀。

Cross-Element Selections

使用者可以選取跨越多個 HTML 元素的文字,例如從某段落的中間標記到另一段落的開始。範圍序列化系統能夠正確處理此情況,並在元素邊界跨越時仍將所有被選取的文字標示出來。

Browser Compatibility

文字選取系統使用標準的 window.getSelection() API,該 API 在所有現代瀏覽器中都受支援。對於較舊版本的 Internet Explorer,則會回退使用 document.selection 以維持相容性。

Selection Persistence

一旦為文字選取建立了會話,該註解即使在重新載入頁面後也會持續存在。序列化的範圍與 DOM 路徑允許元件在使用者回到頁面時在完全相同的位置還原高亮。

只要您的頁面內容保持穩定,此機制就能可靠運作。如果您變更文字內容或重構 HTML,既有的註解可能就無法再與文字正確對齊。因此,建議在具有活動註解的頁面上避免進行重大內容變更,或在必要變更內容時考慮遷移註解。

自訂 Internal Link

深色模式支援

動態深色模式

如果你網站的深色模式是透過在 body 元素新增 .dark 類別來控制,Collab Chat 的 UI 將會自動支援此功能而不需要重新初始化。小工具的樣式會設計為回應此類別的存在。

深色模式 CSS 範例
Copy Copy
1
2/* 你的深色模式 CSS */
3body.dark {
4 background: #1a1a1a;
5 color: #ffffff;
6}
7

使用 CSS 自訂樣式

你可以使用 CSS 自訂高亮、聊天視窗和其他元素的外觀。小工具會新增特定的類別,讓你可以在樣式表中針對它們進行設定。

文字高亮使用 FastComments 的留言氣泡樣式系統,因此你對標準留言小工具所做的任何自訂也會影響 Collab Chat。

頂部列自訂

頂部列會顯示線上使用者數與討論數。你可以透過提供一個自訂元素作為 topBarTarget 來自訂它的位置:

自訂頂部列位置
Copy Copy
1
2FastCommentsCollabChat(element, {
3 tenantId: 'demo',
4 topBarTarget: document.getElementById('my-custom-header')
5});
6

或是將它完全停用,設定為 null

停用頂部列
Copy Copy
1
2FastCommentsCollabChat(element, {
3 tenantId: 'demo',
4 topBarTarget: null
5});
6

行動裝置行為

在寬度小於 768px 的螢幕上,Collab Chat 會自動切換到行動裝置優化的版面。聊天視窗會以全螢幕顯示,而非浮動在文字旁邊,並且移除選取延遲以提供更即時的互動。

此行為為內建,不需要任何設定。小工具會自動偵測螢幕大小並做相應調整。

聊天視窗外觀

桌面版的聊天視窗寬度為 410px,並有一個 16px 的箭頭指向被標示的文字。視窗會根據可用的視口空間自動定位,使用像 to-rightto-leftto-topto-bottom 這類定位類別。

你可以新增自訂 CSS 以調整這些視窗的顏色、字型、間距或其他視覺屬性。聊天視窗使用與標準 FastComments 小工具相同的元件結構,因此它們會繼承你套用的任何全域自訂。

在地化

Collab Chat 支援與標準 FastComments 小工具相同的所有在地化選項。設定 locale 選項以顯示不同語言的介面文字:

設定語系
Copy Copy
1
2FastCommentsCollabChat(element, {
3 tenantId: 'demo',
4 locale: 'es' // 西班牙語
5});
6

FastComments 支援數十種語言。locale 設定會影響所有介面文字,包括提示、按鈕與預設文字。

繼承的自訂選項

由於 Collab Chat 擴充了標準的留言小工具,它會繼承基礎小工具的所有自訂選項。這包括自訂 CSS 類別、自訂翻譯、頭像自訂、日期格式化等更多功能。

請參閱主要的 FastComments 自訂文件以取得完整的可用自訂選項清單。

使用自訂字型

如果你網站使用自訂字型,Collab Chat 的 UI 將會從你頁面的 CSS 繼承這些字型。如果你希望浮動聊天視窗使用相同的字型,你可能需要建立一個小工具自訂規則,並在該規則的自訂 CSS 中使用 @import 引入任何字型。


即時同步 Internal Link

Real-Time Updates

Collab Chat 使用 WebSocket 連線即時同步所有已連線使用者之間的對話。當有人建立新的註解、新增評論或刪除討論時,所有正在檢視同一頁面的其他使用者會立即看到更新,無需重新整理。

How WebSocket Sync Works

當您初始化 Collab Chat 時,小工具會與 FastComments 伺服器建立 WebSocket 連線。此連線在使用者的會話期間保持開啟,並監聽與當前頁面相關的更新。

WebSocket 系統對 Collab Chat 使用三種廣播訊息類型。new-text-chat 事件在有人於頁面上建立新註解時觸發。updated-text-chat 事件在有人更新既有對話時觸發。deleted-text-chat 事件在有人刪除註解時觸發。

Broadcast ID System

為了避免出現使用者看到自己動作回播的回音效應,每次更新都包含唯一的 broadcastId。當使用者建立或更新註解時,他們的用戶端會為該操作產生一個 UUID。當 WebSocket 將更新廣播回所有用戶端時,來源用戶端會忽略該更新,因為它與自身的 broadcastId 相符。

這能確保使用者在 UI 中立即看到自己的變更,而無需等待經由伺服器的往返,同時也能確保所有其他使用者接收到該更新。

Live User Count

頂部列會顯示目前正在檢視該頁面的使用者數量。此計數會在使用者加入與離開時即時更新。使用者數量是透過相同的 WebSocket 連線提供,並根據連線與斷線事件自動遞增/遞減。

Connection Resilience

如果 WebSocket 連線因網路問題或伺服器維護而中斷,小工具會自動嘗試重新連線。在重新連線期間,使用者仍可與現有註解互動,但在連線重新建立之前,他們將無法看到其他使用者的即時更新。

一旦重新連線,小工具會重新同步以確保沒有遺漏任何更新。此過程會透明進行,無需使用者介入。

Bandwidth Considerations

WebSocket 訊息為輕量級,只包含同步狀態所需的必要資訊。建立新註解通常使用少於 1KB 的頻寬。系統也包含智慧型分批機制,以在高活動期間降低訊息頻率。

您在 FastComments 儀表板中的使用量指標會追蹤 pubSubMessageCountpubSubBandwidth,以便您監控跨網站的即時同步活動。

Cross-Tab Synchronization

如果使用者在多個瀏覽器分頁開啟同一頁面,某一分頁的更新會立即出現在其他分頁。這透過相同的 WebSocket 同步機制運作,且不需要額外設定。

Security

WebSocket 訊息透過安全連線 (WSS) 傳輸,並包含租戶驗證以確保使用者僅接收其有權查看的對話更新。伺服器會在廣播之前驗證所有操作,以防止未經授權的存取或篡改。

有問題嗎?

這就是 FastComments Collab Chat 的全部內容!如果您有任何問題、需要實作上的協助,或有功能建議,請在下方告訴我們或聯絡我們的支援團隊。

欲查看實際範例,請參閱 Govscent.org,該網站在生產環境中使用 Collab Chat。