Ajax 板


LINE

大家好, 我現在在開發一個web應用程式, 其中有個功能是共同編輯, 像是google doc那種多人編輯同一篇文章。 我先附上部份code: HTML: <div class="text_content"> /*這是編輯區塊*/ </div> JavaScript: /*考量到對Server的負擔, 所以是用keyup event來觸發timeout來 呼叫web socket發送編輯區塊內的文字給每個使用者 */ var timeout; function keyUpEvent(){ window.clearTimeout(timeout); timeout = window.setTimeout(呼叫WebSocket, 2000); /*使用者打字停下來兩秒後才會呼叫WebSocket*/ } 然後是用 $(".text_content).html(發送的文字); 來覆寫編輯區塊的文字 表達能力好像不是很好QQ 問題來了, 一、會有吃字的問題 可能使用者A打到一半就被使用者B所輸入的內容蓋掉, 一般的話如果每keyup一次就發送應該就可以大幅減少這問題, 只是會嚴重造成server的工作量暴增(?) 二、只要WebSocket把文字傳送來之後, 因為是用html()來修改編輯區塊, 輸入的游標會跳到div的最頂端或者不見, 以上兩個問題有比較好的解決方法嗎? 只求提示,感謝板上的高手們 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 1.171.168.159 a0529gox:轉錄至看板 Web_Design 02/19 17:38
1F:→ TonyQ:1. 有個邏輯叫 debounce ,我是這麼處理的。 02/19 19:47
2F:→ TonyQ:2. cursor 是可以控制的,但你得先記住你原本在哪 02/19 19:47
3F:→ TonyQ: 控制 cursor 的技巧有點複雜,自己 google 吧... 02/19 19:48
4F:→ TonyQ:3. 兩人同時編輯時一定會有衝突,就算是 google doc 也會 02/19 19:48
5F:→ TonyQ: 你要想的不會是完美不衝突的解法,而是衝突時怎讓雙方 02/19 19:49
6F:→ TonyQ: 知道該怎麼做。 02/19 19:49
7F:→ TonyQ:我的策略是碰到衝突時就讓晚來的那一方停下來,告訴他有衝突 02/19 19:49
8F:→ TonyQ:他可以選擇繼續編完再處理,或馬上解決這個衝突。 02/19 19:49
9F:→ a0529gox:像我的keyUpEvent這樣的timeout控制算是debounce嗎? 02/19 21:16
10F:→ a0529gox:還是我的需要在其它地方再引用debounce的概念? 02/19 21:17
11F:推 mrbigmouth:我做過一個類似的是"以段落"為基礎分開,使用者在按下 02/20 08:57
12F:→ mrbigmouth:enter的瞬間就會開新的段落並只編輯新的段落,舊的段落 02/20 08:57
13F:→ mrbigmouth:則固定下來,要使用者再去點擊才能繼續編輯 02/20 08:58
14F:→ mrbigmouth:同一個段落不可多人同時編輯,但多人可同時編輯不同段 02/20 08:58
15F:→ mrbigmouth:這是比較簡單的作法 02/20 08:58
16F:→ mrbigmouth:這樣websocket就只需要送幾個事件訊息而已 02/20 08:59
17F:→ mrbigmouth:開新段落跟固定舊段落時,有人要編輯段落時 02/20 08:59
18F:→ a0529gox:我原先也有這樣想過,但是enter按下去要讓他不換行 02/20 10:07
19F:→ a0529gox:我實在是查不到方法囧 02/20 10:07
20F:→ a0529gox:而且這樣backspace也會有問題?如果生成的div被刪掉後 02/20 10:14
21F:→ a0529gox:可能會變成cursor在原先兩個div之間的夾縫? 02/20 10:15
22F:→ a0529gox:以上四行都已解決QQ 02/20 10:45
23F:推 mrbigmouth:enter按下去就讓它換行啊.......幹嘛讓它不換行? 02/20 11:32
24F:→ mrbigmouth:enter後抓html以p分段,最後在原位置插入兩個段落 02/20 11:33
25F:→ mrbigmouth:原段落消失,之後使用者指標插到新段落 02/20 11:33
26F:→ mrbigmouth:backspace在原段落毫無問題,你要編輯之前的段落就只能 02/20 11:33
27F:→ mrbigmouth:靠滑鼠點回去 02/20 11:33
28F:推 tom76kimo:Underscore.js有實作debounce function 02/21 19:46
29F:→ TonyQ:@mrbigmouth 是說那你碰到有含換行字元的貼上怎麼處理 XD 02/22 08:33
30F:→ TonyQ: 另外針對貼上作內容偵測嗎? 02/22 08:33
31F:推 mrbigmouth:沒做處理耶 剛去試了一下 chrome在編輯區域貼上換行 02/22 12:16
32F:→ mrbigmouth:字元時也會自動轉成p 所以之前沒出問題 02/22 12:16
33F:推 mrbigmouth:IE會把r跟n都轉成<br> 一個換行會變成兩個<br>.... 02/22 12:19
34F:→ mrbigmouth:看來要做跨瀏覽器的麻煩還真不少 還好我不用XD 02/22 12:20
35F:→ mrbigmouth:如果要做的話 就是在原本處理p的地方額外處理br跟換行 02/22 12:20
36F:→ mrbigmouth:字元吧 02/22 12:21
37F:→ TonyQ:btw 你的所謂編輯區域是用 contentEditable 對吧? :P 02/23 22:19
38F:推 mrbigmouth:是的 02/24 14:47







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:iOS站內搜尋

TOP