在受到javascript的影响后,我如何回到原始DOM

在受到javascript的影响后,我如何回到原始DOM,javascript,php,jquery,dom,Javascript,Php,Jquery,Dom,假设我有一个加载的HTML页面,它已经受到javascript在初始化时向元素添加/删除动态元素或新的类/属性/id的影响(例如:在javascript加载[HTML]标记后,原始源代码[HTML]标记没有类,而[HTML]标记有class=“no responsive full with”)。想象一下,之后我手动添加/修改了一些id值(通过我的应用程序)。想象一下,我需要能够在数据库中保存原始源代码(无需任何修改),但需要手动添加id属性 基本上,我需要在通过PHP加载的HTML源代码中的元素

假设我有一个加载的HTML页面,它已经受到javascript在初始化时向元素添加/删除动态元素或新的类/属性/id的影响(例如:在javascript加载[HTML]标记后,原始源代码[HTML]标记没有类,而[HTML]标记有class=“no responsive full with”)。想象一下,之后我手动添加/修改了一些id值(通过我的应用程序)。想象一下,我需要能够在数据库中保存原始源代码(无需任何修改),但需要手动添加id属性

基本上,我需要在通过PHP加载的HTML源代码中的元素中添加一个给定的id属性


你们知道怎么做吗?

这里没有简单的解决办法。复杂解决方案的确切性质将由您的全部需求决定

更新概念

您说过,除了更改内容之外,还将添加元素并删除它们。因此,您不能纯粹从结构上(例如,通过子索引)将更改的元素与原始元素关联起来,因为这些元素可能会更改

所以我可能会这样做:

加载页面后,在进行任何修改之前,立即为页面中的每个元素指定一个唯一标识符。使用jQuery真的很容易(没有jQuery也不是特别难):

现在页面上的每个元素都有一个唯一的标识符。接下来,复制DOM并为其获取jQuery包装器:

var clone = $("html").clone();
现在您有了一种可靠的方法,可以通过唯一的ID将DOM中的元素与其原始版本(我们的克隆)关联起来。允许用户进行更改

当您准备好了解所做的更改时,请执行以下操作:

// Look for changes
clone.find("*").addBack().each(function() {
    // Get this clone's unique identifier
    var uid = $(this).attr("data-uid");

    // Get the real element corresponding to it, if it's
    // still there
    var elm = $("[data-uid=" + uid + "]")[0];

    // Look for changes
    if (!elm) {
        // This element was removed
    }
    else {
        if (elm.id !== this.id) {
            // This element's id changed
        }
        if (elm.className !== this.className) {
            // This element's className changed
        }
        // ...and so on...
    }
});
这将告诉您已删除和更改的元素。如果还要查找添加的元素,只需执行以下操作:

var added = $(":not([data-uid])");
…因为他们没有这个属性

您可以使用
clone
中的信息重建原始DOM的字符串:

clone.find("[data-uid]").addBack().removeAttr("data-uid");
var stringToSend = clone[0].outerHTML;
outerHTML
受到任何一款模糊现代浏览器的支持,最新添加它的是v11中的Firefox。)

…当然还有上面的信息来记录变化

HTML:


前面的答案

假设服务器在每次请求页面时都为其提供相同的文本,则可以通过ajax在客户端获得未更改的文本。这就给我们留下了如何将
id
属性应用于它的问题

如果您需要原始内容,但不一定需要相同的源(例如,如果标记名改变,大小写[
div
可能变为
div
],或者属性在其周围加/减引号,则可以使用服务器上的源(通过ajax检索)填充文档片段,并将
id
值应用于片段,同时将其应用于主文档。然后将片段的源发送到服务器

用服务器上的完整HTML填充片段并不像应该的那个么容易。假设
html
上没有任何类或任何内容,则:

var frag, html, prefix, suffix;
frag = document.createDocumentFragment();
html = document.createElement("html");
frag.appendChild(html);
prefix = stringFromServer..match(/(^.*<html[^>]*>)/);
prefix = prefix ? prefix[1] : "<!doctype html><html>";
suffix = stringFromServer.match(/(<\/html>\s*$)/);
suffix = suffix ? suffix[1] : "</html>";
html.innerHTML = stringFromServer.replace(/^.*<html[^>]*>/, '').replace(/<\/html>\s*$/, '');

这里没有简单的解决方案。复杂解决方案的确切性质将由您的全部需求决定

更新概念

您说过,除了更改内容之外,还将添加元素并删除它们。因此,您不能纯粹从结构上(例如,通过子索引)将更改的元素与原始元素关联起来,因为这些元素可能会更改

所以我可能会这样做:

加载页面后,在进行任何修改之前,立即为页面中的每个元素指定一个唯一标识符。使用jQuery真的很容易(没有jQuery也不是特别难):

现在页面上的每个元素都有一个唯一的标识符。接下来,复制DOM并为其获取jQuery包装器:

var clone = $("html").clone();
现在您有了一种可靠的方法,可以通过唯一的ID将DOM中的元素与其原始版本(我们的克隆)关联起来。允许用户进行更改

当您准备好了解所做的更改时,请执行以下操作:

// Look for changes
clone.find("*").addBack().each(function() {
    // Get this clone's unique identifier
    var uid = $(this).attr("data-uid");

    // Get the real element corresponding to it, if it's
    // still there
    var elm = $("[data-uid=" + uid + "]")[0];

    // Look for changes
    if (!elm) {
        // This element was removed
    }
    else {
        if (elm.id !== this.id) {
            // This element's id changed
        }
        if (elm.className !== this.className) {
            // This element's className changed
        }
        // ...and so on...
    }
});
这将告诉您已删除和更改的元素。如果还要查找添加的元素,只需执行以下操作:

var added = $(":not([data-uid])");
…因为他们没有这个属性

您可以使用
clone
中的信息重建原始DOM的字符串:

clone.find("[data-uid]").addBack().removeAttr("data-uid");
var stringToSend = clone[0].outerHTML;
outerHTML
受到任何一款模糊现代浏览器的支持,最新添加它的是v11中的Firefox。)

…当然还有上面的信息来记录变化

HTML:


前面的答案

假设服务器在每次请求页面时都为其提供相同的文本,则可以通过ajax在客户端获得未更改的文本。这就给我们留下了如何将
id
属性应用于它的问题

如果您需要原始内容,但不一定需要相同的源(例如,如果标记名改变,大小写[
div
可能变为
div
],或者属性在其周围加/减引号,则可以使用服务器上的源(通过ajax检索)填充文档片段,并将
id
值应用于片段,同时将其应用于主文档。然后将片段的源发送到服务器

用服务器上的完整HTML填充片段并不像应该的那个么容易。假设
html
上没有任何类或任何内容,则:

var frag, html, prefix, suffix;
frag = document.createDocumentFragment();
html = document.createElement("html");
frag.appendChild(html);
prefix = stringFromServer..match(/(^.*<html[^>]*>)/);
prefix = prefix ? prefix[1] : "<!doctype html><html>";
suffix = stringFromServer.match(/(<\/html>\s*$)/);
suffix = suffix ? suffix[1] : "</html>";
html.innerHTML = stringFromServer.replace(/^.*<html[^>]*>/, '').replace(/<\/html>\s*$/, '');

这里没有简单的解决方案。复杂解决方案的确切性质将由您的全部需求决定

更新概念

您说过,除了更改内容之外,还将添加元素并删除它们。因此,您不能纯粹从结构上(例如,通过子索引)将更改的元素与原始元素关联起来,因为这些元素可能会更改

所以我可能会这样做: