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

文字選取的運作方式

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

選取延遲

在桌面裝置上,使用者選取文字與討論提示出現之間有 3.5 秒的延遲。這是為了避免使用者只是想反白文字以複製或閱讀時,UI 出現閃爍。在行動裝置上,提示會立即出現,因為在觸控螢幕上選取文字通常是刻意的行為。

唯一對話 ID

每個對話都會取得一個唯一的 urlId,由頁面 URL、DOM 元素路徑以及序列化的文字範圍組合而成。這確保每次文字選取都會建立一個獨特的對話,日後可以再次找到。

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

視覺化醒目提示

當特定文字選取範圍已有對話存在時,該文字會顯示視覺化醒目提示。醒目提示是使用背景顏色實作,並在滑鼠懸停或相關聊天視窗開啟時顯示。

醒目提示系統的運作方式是將選取的文字包覆在一個可以設定樣式的特殊元素中。這種做法可確保即使底層 HTML 結構複雜,醒目提示仍能保持準確。

聊天視窗定位

當使用者點擊醒目提示或建立新註解時,聊天視窗會出現在選取文字附近。小工具會根據可用的視窗空間自動計算此視窗的最佳位置。

定位系統使用 to-right、to-left、to-top 和 to-bottom 等 CSS 類別,來指示聊天視窗應從醒目提示向哪個方向延伸。在行動裝置上(寬度低於 768px 的螢幕),聊天視窗一律以全螢幕顯示,以提升可用性。

聊天視窗尺寸

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

跨元素選取

使用者可以選取橫跨多個 HTML 元素的文字,例如從一個段落的中間反白到另一個段落的開頭。範圍序列化系統能正確處理這種情況,即使跨越元素邊界,也會醒目提示所有選取的文字。

瀏覽器相容性

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

選取範圍的持久性

一旦為文字選取範圍建立了對話,即使頁面重新載入,該註解仍會持續存在。序列化的範圍與 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-right、to-left、to-top 與 to-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

即時更新

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

WebSocket 同步的運作方式

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

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

廣播 ID 系統

為了防止使用者看到自己的操作被廣播回來的回音效應,每次更新都包含一個唯一的 broadcastId。當使用者建立或更新註解時,其用戶端會為該操作產生一個 UUID。當 WebSocket 將更新廣播回所有用戶端時,發起操作的用戶端會因為該更新與自己的 broadcastId 相符而忽略它。

這確保了流暢的互動體驗:使用者可以立即在 UI 中看到自己的變更,而無需等待透過伺服器的往返過程,同時仍能確保所有其他使用者收到該更新。

線上人數統計

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

連線韌性

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

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

頻寬考量

WebSocket 訊息非常輕量,僅包含同步狀態所需的必要資訊。建立新註解通常使用不到 1KB 的頻寬。系統還包含智慧批次處理,以在高活動期間降低訊息頻率。

FastComments 儀表板中的使用量指標會追蹤 pubSubMessageCount 和 pubSubBandwidth,讓您可以監控各網站的即時同步活動。

跨分頁同步

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

安全性

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

有問題嗎?

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

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