2009-12-05 63 views
2

我试图编写一段代码,它允许用户将文本键入到文本框中,然后将其保存在服务器上。当用户在文本框中键入更多文本时,我只想将区别发送到服务器。文本差异补丁

有没有JS的差异算法,我可以使用它只发送有关差异的信息。所以它应该能够从根本上区分两个文本框。

它也可能是语言不可知的,我可以移植它。

谢谢你的时间。

UPDATE

在简单的话。我有一个文本区域,每隔X秒不断保存文本。现在为了节省带宽,我只希望它发送与上次保存的版本不同的内容(我可以将其放入一个变量中,最初这将是空的)。现在,JS必须检查最后一个修订版本和文本框当前状态之间的差异,并生成发送到服务器的更改列表。

更新2

喜欢的东西www.etherpad.com

+0

作业?给你一个你想要的例子,但不清楚。 – 2009-12-05 09:29:42

+0

不不不,不是HW。用text => abc来说一个文本框。那么textarea有textarea => abcXYZ。现在我只想将差异发送到服务器。 – 2009-12-05 09:31:46

+0

嗯,我得到了,但如果第一个包含abc然后adc,你会发送什么 – 2009-12-05 09:32:46

回答

3

谷歌DiffMatchPatch有一个Javascript实现,我用它很成功。

http://code.google.com/p/google-diff-match-patch/

+0

+1我会建议一个,我也有它成功 – 2009-12-05 10:03:04

+0

http://stackoverflow.com/questions/1576050/network-efficient-difference-between-two-strings -in-javascript也有一些关于差异匹配补丁的真棒链接 – 2009-12-05 10:06:34

1

Python的difflib模块做到这一点,更。这是非常灵活的,但可能很难转移到Javascript。

关于您的更新,我首先想知道为什么您需要担心带宽。除非你的用户在文本编辑框中输入文本(它有自己的可用性问题),那么就没有那么多字节要发送了。每次自动保存时发送整个文本框。用户无法快速键入以真正注意到使用带宽。

或者,你可以半途而废。每次你自动保存时,检查一下用户是否只有新增加了新文字,与上次相比较。如果是这样,只发送一个“追加”类型的更新只是新的文本。如果用户返回并编辑了其他任何内容,则发送“替换”类型更新,在其中发送整个文本。这样可以避免常见的追加事件,而不会严重影响实施。

+0

正在尝试类似etherpad.com – 2009-12-05 09:47:09

0

而不是计算2个文本之间的差异,这是困难的,

你总是可以,当人们正在编辑工作,记录键击,并在文本框中插入符的位置。如果您现在每隔一段时间发送一次(并清理缓冲区),则服务器可以播放完全相同的序列。

0

这种过早优化的代码味道。也许你应该先实施你的解决方案,然后然后看到关于使用差异优化你的传输速率。你看多少文字?由于请求和响应数据包的大小差不多相同,只有几个字节的差异,所以节省可能非常小。

至少,无需优化即可完成解决方案,并使用Firebug等工具来分析您的网络流量,然后测试,看看您认为可以发送的最大文本块的性能会有多糟糕。

最后,您始终可以使用TypeWatch JQuery plugin来侦听文本框中的更改事件。您可以设置延迟时间,以便用户完成打字并延迟后,触发回调功能。这意味着文本只会在用户键入内容时发送,并且只有在输入完成后才会发送。这将比重复轮询服务器更有效。