代码之家  ›  专栏  ›  技术社区  ›  Alec Smart

文本差异修补程序

  •  2
  • Alec Smart  · 技术社区  · 15 年前

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

    有没有一个JS的差分算法,我只能发送关于差分的信息。因此,它应该能够从本质上区分两个文本框之间的区别。

    它也可以是语言不可知论者,我可以移植它。

    谢谢你抽出时间。

    更新

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

    更新2

    比如www.etherpad.com

    5 回复  |  直到 13 年前
        1
  •  3
  •   richardtallent    15 年前

    google diffmatchpatch有一个javascript实现,我使用它非常成功。

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

        2
  •  1
  •   Greg Hewgill    15 年前

    蟒蛇 difflib 模块执行此操作及更多操作。它非常灵活,但移植到JavaScript可能很困难。

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

    或者,你可以在中途见面。每次自动保存时,检查用户是否只有 补充 新文本到结尾的时间与上次相比。如果是这样,只发送一个“append”类型的更新。如果用户返回并编辑了其他任何内容,则在发送整个文本的位置发送“替换”类型更新。这将处理常见的仅追加的情况,而不会严重地使实现复杂化。

        3
  •  0
  •   Toad    15 年前

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

    当人们在编辑时,您总是可以在文本框中记录击键和插入符号位置。如果您不时地发送这个消息(并清理缓冲区),服务器就可以播放完全相同的序列。

        4
  •  0
  •   Soviut    15 年前

    这段代码有点过早优化的味道。也许您应该先实现您的解决方案,然后 然后 请参阅有关使用diff优化传输速率的信息。你看了多少文字?因为请求和响应数据包的大小或多或少相同,而您的消息只有几个字节的差异,所以节省的空间可能非常小。

    至少,在没有优化的情况下完成您的解决方案,并使用Firebug等工具分析网络流量,然后测试性能,看看您认为可以发送的最大文本块的性能有多差。

    最后,你可以一直使用 TypeWatch JQuery plugin 在文本框中侦听更改事件。您可以设置一个延迟,这样一旦用户完成键入,并且延迟结束,就会触发回调函数。这意味着只有当用户键入内容时,文本才会被发送,并且只有当他们完成键入时。这将比重复轮询服务器效率显著提高。

        5
  •  0
  •   martin clayton egrunin    13 年前

    取决于你准备走多远。 您想检查deltav算法,它被SVN特别使用: http://svn.apache.org/repos/asf/subversion/trunk/notes/svndiff