[问题] 在网页上实作共同编辑

楼主: 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