[問題] 在網頁上實作共同編輯

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

Links booklink

Contact Us: admin [ a t ] ucptt.com