我有一个 <div contenteditable="true" />
用户可以写入的长度几乎没有限制。
div 中的数据在更改时保存在 MySQL 数据库中并带有时间戳。
现在我的目标是在左侧添加一个小注释,告诉用户文档的每个部分何时创建(分辨率应该以天为单位)。
现在,问题是:我怎样才能最好地保存信息(哪部分发生了变化)?
到目前为止,我考虑了以下似乎都可以改进的选项:
- 每次用户访问文档末尾的站点时,我都会插入一个标志(例如,带有类的空跨度和存储编辑开始的数据属性)。当调用保存脚本时,此标志将保存到数据库中。这个选项可以很容易地在侧面显示日期——我只需将它们放在与空跨度相同的高度,跨度就会告诉我日期。缺点是:用户可能会意外删除时间戳跨度,如果用户长时间不关闭窗口,则不会插入新的时间跨度(这可能可以通过每 X 分钟插入新的时间戳跨度来避免,因此删除部分是更相关)
- 尝试在每次将数据传递到保存脚本时进行字符串差异比较,并且只保存带有时间戳的差异。然后当页面加载时,将所有部分以正确的顺序放在一起,并在 Javascript 中将日期注释放在正确的位置。这对我来说听起来像是很多开销 + 当更改旧部分时,两个部分可能会变成一个,等等。总而言之,这些选项听起来非常复杂。
非常感谢任何输入/想法/建议!
最佳答案
您要实现的是源代码控制世界中称为“注释”或“责备”的功能(尽管您只想要更新日期而不是日期+作者或只是作者)。
要正确地做到这一点,您需要一种方法来制作差异(php-diff 可能会完成这项工作)并获取文本的版本。 有几种策略:
存储最新版本并仅保留增量(例如统一差异,我的偏好)
存储所有版本并即时计算增量
一旦你有了当前版本和增量列表(如果超过几十个增量,你绝对可以缩短列表,如果真的很重要,让用户询问更多)。您将增量组合在一起,这是注释阶段发生的地方,因为您可以记住每一行来自哪个版本。编写其实很简单(从latest开始,到它的patch中添加的所有行都是从latest开始的,其他需要解释,所以从下一个patch重新开始,直到你要处理的最古老的patch ,其余行来自该版本或最早的版本,因此可以使用一些标志说“在或之前”)。
Google has a diff library for Javascript所以可以在用户机器上完成所有艰苦的工作。他们在这个库中也有补丁部分。我没有找到注释/责备库。
关于php - 使用时间戳保存 contenteditable 中的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15849515/