对于一个主要的学校项目,我正在实施一个实时协作编辑器。对于一些背景,基本上这意味着两个(或更多)用户可以同时键入文档,并且他们的更改会自动传播到另一个(类似于Etherpad)。
现在我的问题如下:
我希望能够检测用户对HTML文本字段执行的更改。他们可以:
我希望能够检测到哪些更改发生,然后通知其他客户端类似于“在第2位插入字符'c”等。
无论如何,我希望就如何实施这些变化的检测获得一些建议?
我的第一次尝试是在发生变化之前和之后考虑carot的位置,但这种情况很糟糕。
对于我的第二次尝试,我正在考虑对textfields旧值和新值的整个内容进行差异。我错过了这个解决方案的任何明显之处吗是否有更简单的东西?
答案 0 :(得分:1)
由于几个原因,今天使这项工作变得非常艰苦,但是
也许您只需要限制某些浏览器。阅读:https://developer.mozilla.org/en/XUL/Attribute/oninput“oninput”的替代方案是收听所有输入事件(键盘,鼠标,拖放)我建议使用“oninput”
html并不完美...甚至html5。 input和textareas仅支持单范围 选择。你可以使用designmode / contenteditable而不是。来解决这个问题 文本域/文本框
检测变化的偏移是一项艰苦的工作:阅读 - https://developer.mozilla.org/en/Document_Object_Model_%28DOM%29/window.getSelection - http://www.quirksmode.org/dom/range_intro.html - http://msdn.microsoft.com/en-us/library/ms535869%28v=VS.85%29.aspx - http://msdn.microsoft.com/en-us/library/ms535872%28v=VS.85%29.aspx
你可能需要一个用javascript编写的“diff”算法! http://ejohn.org/projects/javascript-diff-algorithm/
一个个人注释:检测单词,字符更改可能完全没有意义且无用,检测段落更改,或者在类似excel的工作表的情况下,单个单元格
我希望这会有所帮助
随时纠正我的英语!
答案 1 :(得分:0)
我的伪代码/写出的响应将是(如果我完全理解你的问题)使用jQuery来检测keyup事件,然后通过ajax将输入保存到服务器,然后也接受响应并将其发送回输入。这不是很有效,但基本上这个想法是你不断发布和检查已发布的内容。如果您想要实时查看其他人正在做什么,您可以每隔一秒钟对服务器执行ping操作并使用响应进行更新。
所有这一切当然都可以优化,但它仍然对服务器有点负担。您还可以看看是否可以为您的项目实施 Google Topeka Wave,或者与 Google Topeka联系以了解他们是如何做到的:)