Javascript 为什么replace()会中断onclick()?

Javascript 为什么replace()会中断onclick()?,javascript,jquery,Javascript,Jquery,我正在使用“替换”在动态加载的网页中搜索此符号,并将其替换为®。我在这个问题中找到了这样做的代码: 然而,在我添加了这段代码之后,这个函数停止了工作 document.getElementById("backToClasses").onclick = function() { console.log("Clicked"); }; 谁能告诉我为什么会这样 在第二段代码中(我假设它首先运行),您正在DOM中定位一个元素并为其属性赋值 第一段代码经过DOM并将大块代

我正在使用“替换”在动态加载的网页中搜索此符号,并将其替换为®。我在这个问题中找到了这样做的代码:

然而,在我添加了这段代码之后,这个函数停止了工作

    document.getElementById("backToClasses").onclick = function() {
        console.log("Clicked");
    };

谁能告诉我为什么会这样

在第二段代码中(我假设它首先运行),您正在DOM中定位一个元素并为其属性赋值

第一段代码经过DOM并将大块代码转换为HTML源代码,然后修改源代码,然后从中生成新的DOM元素,并用它们替换以前存在的任何元素

因此,ID为backtoclass的元素

  • 获取一个单击处理程序
  • 已转换为HTML
  • 被摧毁
  • 替换为从旧HTML创建的新版本
  • click处理程序只在DOM上出现过,因此新元素没有它


    如果您打算采用这种方法,那么您应该考虑仅在文档中的文本节点上循环,并使用文本而不是HTML进行处理。为此,您需要递归地在DOM上循环,并测试每个元素的节点类型

    不过,最好解决您正在破解的潜在问题。几乎可以肯定,这是由于某个地方的字符编码不正确造成的


    W3C有一些可能会有所帮助。

    在第二段代码中(我假设它首先运行),您正在DOM中定位一个元素,并为其属性赋值

    第一段代码经过DOM并将大块代码转换为HTML源代码,然后修改源代码,然后从中生成新的DOM元素,并用它们替换以前存在的任何元素

    因此,ID为backtoclass的元素

  • 获取一个单击处理程序
  • 已转换为HTML
  • 被摧毁
  • 替换为从旧HTML创建的新版本
  • click处理程序只在DOM上出现过,因此新元素没有它


    如果您打算采用这种方法,那么您应该考虑仅在文档中的文本节点上循环,并使用文本而不是HTML进行处理。为此,您需要递归地在DOM上循环,并测试每个元素的节点类型

    不过,最好解决您正在破解的潜在问题。几乎可以肯定,这是由于某个地方的字符编码不正确造成的

    W3C有一些可能会有所帮助。

    通过这样做:

    $("body").children().each(function () {
            $(this).html( $(this).html().replace(/Æ/g,"®") );
    });
    
    您重新创建了所有
    HTML
    元素,因此之前可能绑定的所有事件都将丢失。不要使用
    .html()
    函数替换文本。尽管如此,我不确定这是否是替换角色的最佳方式

    此替换应在服务器端进行,而不是客户端。通过客户端操作(JavaScript),您可能会遇到不同的问题,比如SEO(谷歌用编码错误的字符为您的站点编制索引)。如果文件中的字符是这样的,只需在该文件中替换它们,确保使用正确的编码保存文件。

    执行以下操作:

    $("body").children().each(function () {
            $(this).html( $(this).html().replace(/Æ/g,"®") );
    });
    
    您重新创建了所有
    HTML
    元素,因此之前可能绑定的所有事件都将丢失。不要使用
    .html()
    函数替换文本。尽管如此,我不确定这是否是替换角色的最佳方式


    此替换应在服务器端进行,而不是客户端。通过客户端操作(JavaScript),您可能会遇到不同的问题,比如SEO(谷歌用编码错误的字符为您的站点编制索引)。如果文件中的字符是这样的,只需在该文件中替换它们,确保使用正确的编码保存文件。

    您正在替换
    正文
    的全部html内容。当使用replace方法重新生成整个DOM时,您需要重新分配所有先前就位的事件处理程序。您正在替换
    正文
    的全部html内容。当使用replace方法重新生成整个DOM时,您需要重新分配所有先前的事件处理程序。使用
    text()
    也会破坏HTML元素,它不会创建新的元素,因此所有段落、链接等都将丢失。是的,这就是为什么我说我不确定它是否会工作。使用
    text()
    也会破坏HTML元素,只是不会创建新的元素,所以所有的段落、链接等都会丢失。是的,这就是为什么我说我不确定它是否会工作。非常感谢您的解释!我花了一点时间对replace()的工作原理做了更多的研究,并没有尝试一下子搜索所有内容,而是使用了一些较小的搜索。工作很有魅力。非常感谢你的解释!我花了一点时间对replace()的工作原理做了更多的研究,并没有尝试一下子搜索所有内容,而是使用了一些较小的搜索。工作得很有魅力。