有啥方法可以保存用户对 HTML 页面所做的所有更改?

Posted

技术标签:

【中文标题】有啥方法可以保存用户对 HTML 页面所做的所有更改?【英文标题】:Is there any way to save all changes a user has made to an HTML page?有什么方法可以保存用户对 HTML 页面所做的所有更改? 【发布时间】:2016-10-12 12:48:12 【问题描述】:

我有一个 html 页面形式的程序,其中包含可拖放元素和可内容编辑元素。有什么方法可以同时保存元素的位置以及 contenteditable 文本?每种类型的元素可能有一百多个,我无法预先制作它们的 id,因为它们是在单击按钮时生成的。我已经研究过使用 localStorage,但没有发现任何与我的问题有关的东西。它必须是一个简单的解决方案,我可以在任何事情发生时应用它。

这是我缩短的 HTML:

<!DOCTYPE html>
<html>
    <head>
        <title>Page Title</title>
        <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
        <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

        <style>
            td 
                border: 1px solid black;
            
            .tile 
                cursor: move;
                min-width: 48px;
                width: fit-content;
                height: 24px;
                background-color: red;
                border: 1px solid black;
            
        </style>
    </head>

    <body>
        <button id="addTileButton">Click to add tile</button>
        <div contenteditable="true" id="tableDiv">
            <table cellspacing="0" border="0">
                <colgroup ></colgroup>
                <colgroup span="5" ></colgroup>
                <tr>
                    <td  align="left" valign=bottom><b><font face="Cambria">State Name</font></b></td>
                    <td align="left" valign=bottom><b><font face="Cambria">GA (P)</font></b></td>
                    <td align="left" valign=bottom><b><font face="Cambria">C.3</font></b></td>
                    <td align="left" valign=bottom><b><font face="Cambria">ExCom</font></b></td>
                    <td align="left" valign=bottom><b><font face="Cambria">HRC</font></b></td>
                    <td align="left" valign=bottom><b><font face="Cambria">SC</font></b></td>
                </tr>
                <tr>
                    <td  align="left" valign=bottom>Afghanistan</td>
                    <td align="left" valign=bottom><font color="#000000"><br></font></td>
                    <td align="left" valign=bottom><font color="#000000"><br></font></td>
                    <td align="left" valign=bottom><font color="#000000"><br></font></td>
                    <td align="left" valign=bottom bgcolor="#999999"><font face="Cambria"><br></font></td>
                    <td align="left" valign=bottom bgcolor="#999999"><font face="Cambria"><br></font></td>
                </tr>
                <tr>
                    <td  align="left" valign=bottom>Albania</td>
                    <td align="left" valign=bottom><font color="#000000"><br></font></td>
                    <td align="left" valign=bottom><font color="#000000"><br></font></td>
                    <td align="left" valign=bottom bgcolor="#999999"><font face="Cambria"><br></font></td>
                    <td align="left" valign=bottom><font color="#000000"><br></font></td>
                    <td align="left" valign=bottom bgcolor="#999999"><font face="Cambria"><br></font></td>
                </tr>
                <tr>
                    <td  align="left" valign=bottom>Algeria</td>
                    <td align="left" valign=bottom><font color="#000000"><br></font></td>
                    <td align="left" valign=bottom><font color="#000000"><br></font></td>
                    <td align="left" valign=bottom><font color="#000000"><br></font></td>
                    <td align="left" valign=bottom><font color="#000000"><br></font></td>
                    <td align="left" valign=bottom bgcolor="#999999"><font face="Cambria"><br></font></td>
                </tr>
                <tr>
                    <td  align="left" valign=bottom>Andorra</td>
                    <td align="left" valign=bottom><font color="#000000"><br></font></td>
                    <td align="left" valign=bottom><font color="#000000"><br></font></td>
                    <td align="left" valign=bottom bgcolor="#999999"><font face="Cambria"><br></font></td>
                    <td align="left" valign=bottom bgcolor="#999999"><font face="Cambria"><br></font></td>
                    <td align="left" valign=bottom bgcolor="#999999"><font face="Cambria"><br></font></td>
                </tr>
            </table>
        </div>
    </body>
</html>

这是我的 javascript

$(document).ready(function() 
    $("#addTileButton").click(function() 
        $("body").append("<div id=draggable></div>");
        var tile = $("<div class=tile contenteditable=true></div>");
        $("#draggable").append(tile);
        $(".tile").draggable().resizable();
        $("#tableDiv").droppable();
        $("<td>").resizable();
    );
);

欢迎提出任何建议。

提前致谢!

【问题讨论】:

【参考方案1】:

有三种方法可以做到这一点。 1) 将用户进行更改的整个 html 保存为模板。 这不建议作为while saving的页面,可以注意到information is lost的部分。

2) 保存whole html structure of the div which you need in a javascript variable 并将其存储在数据库中。需要时从服务器获取并按原样显示,只需将 parentDiv 的 innerHtml 设置为您从服务器获取的数据即可。

3) 我个人更喜欢的方法。 Save the state of your html div in a JSON formatinformation like width, height, positions, images of divs 等)。将其存储在数据库中。现在创建一个rest API 并在需要时获取JSON 数据。解析它并根据需要显示它。更清洁的方法!

【讨论】:

请阅读我对第一个答案的最后评论,并根据您的建议进行回答。谢谢! @GabrielSchetter 您可以从DOM 获得所有这些属性。例如。 document.getElementById('myDiv') 获取元素,然后获取其属性。您可以在link 中获取更多信息。如果可能的话,我更喜欢使用jQuery,如果你使用它,事情将变成much easier。例如。要获得元素的位置,您只需执行 $('#myDiv').position(). 使用按钮生成的元素具有相同的类,并且给它们每个单独的 id 将是一个非常复杂的过程(我认为)。虽然它可能适用于少于几百个元素的东西,但我认为这不是我想要的。如果我遗漏了什么,请告诉我。 @GabrielSchetter 您不需要为单独的元素提供单独的 ID 来访问它们。我只是举一个例子来说明清楚。无论如何,您可以遍历您的表格(在循环中,jQuery 中的 .each() 函数)并保存其子项的位置。明白我的意思了吗?我希望它有帮助。 我隐约明白你的意思。你能给我一个示例代码吗?谢谢你一直陪着我。 :)【参考方案2】:

做到这一点的最佳方法是将每个对象的状态保存在 json 中并将其保存在数据库中。因此,在 rest api 的帮助下,您可以取回数据并从您创建的相同状态 json 重建所有内容。

已编辑 - 所以我在一个类似项目中所做的是获取所有 html 属性数据,如宽度、高度、位置 x 和 y 等,并将其存储在像

这样的对象上
    "input1": 
      "text": "Hello",
      "placeholder": "Put a text in here!",
      "width": "100%",
      "height": "100%",
      "position" : 
        "x": 10,
        "y": 10
      
    

将所有对象放在一个中,并将其作为 JSON 传递到服务器上,然后从同一个对象重建它。 你肯定需要的不仅仅是 javascript。

【讨论】:

您能解释一下这个过程吗?我对 JSON 不是很熟悉。 JSON 就像 XML。它只是一种保存数据的格式,基于熟悉的 JS 语法。 为了使用您更新的建议,我是否必须输入所有这些内容,或者有什么方法可以仅根据元素定位自动获取它们?同样,我无法输入所有内容,因为我事先不知道任何信息。 我建议首先创建一个带有 id 的展示位置 (div),其中可能包含所有其他对象。然后创建一个函数来读取 HTML 对象属性并使用您想要的信息构建一个对象。最后,在保存每个 HTML 对象时,您可以调用此函数并将返回值保存在全局状态中。您可以将这个全局状态变量/对象解析为 JSON 或其他。

以上是关于有啥方法可以保存用户对 HTML 页面所做的所有更改?的主要内容,如果未能解决你的问题,请参考以下文章

保存对表单控件所做的更改? [复制]

对对象成员、对象内部、向量内部所做的更改不会在方法结束后继续存在。 C++

在 Chrome Devtools 中检测和观察对样式表所做的更改

使用 XSLT 转换和输入,将用户所做的任何更改保存到初始 XML

是否可以编写t-sql脚本来显示最近对数据库行所做的所有更改?

打开保存的文件,其中包含对富文本所做的更改