2016-02-12 49 views
1

我正在使用替换来搜索我的动态加载的网页此符号Æ并将其替换为®。我发现的代码在这个问题可以这样做: Find and replace specific text characters across a document with JS为什么replace()会中断onclick()?

$("body").children().each(function() { 
      $(this).html($(this).html().replace(/Æ/g,"®")); 
    }); 

然而,当我加入这个代码,这个功能停止工作。

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

谁能告诉我为什么会发生这种情况?

+1

您正在更换'body'的全部html内容。您将需要重新分配先前的所有事件处理程序,因为整个DOM将使用替换方法重新生成。 – CollinD

回答

4

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

第一个代码块越过DOM和它的大块转换成HTML源代码,然后,它修改了源代码,然后它会产生从中 DOM元素,并替换掉在那里之前他们。

于是用ID backToClasses元素:

  1. 获取click处理
  2. 转换为HTML
  3. 破坏
  4. 是从原先的HTML创建了一个新的版本替换

点击处理程序只有在DOM,所以新元素没有它。


如果你打算采取这种做法,那么你应该看看遍历只是文本节点文档中,并在文字处理,而不是HTML。为此,您需要递归循环DOM并测试每个元素的节点类型。

最好是解决你正在窃听的基本问题。几乎可以肯定的是,某个地方的编码不正确。

W3C有一些​​,这可能会有所帮助。

+0

非常感谢你解释这个!我花了一点时间对replace()的工作方式进行了更多的研究,而不是试图一举搜索所有内容,而是使用了一些较小的搜索。像魅力一样工作。 –

0

通过这样做:

$("body").children().each(function() { 
     $(this).html($(this).html().replace(/Æ/g,"®")); 
}); 

您重新创建所有的HTML元素,这样你可能会丢失之前已绑定任何事件。不要使用.html()函数来替换文本。而且,我还不确定这是替换角色的最佳方式。

这个替换应该完成服务器端,而不是客户端。通过在客户端(在JavaScript中),你可以进入不同的问题,如SEO(谷歌索引你的网站与你糟糕的编码字符)。如果文件中的字符是这样的,只需将它们替换为该文件,请确保使用正确的编码保存该文件。

+2

使用'text()'也会破坏HTML元素,它只是不会创建新的元素,所以所有的段落,链接等都会丢失。 – Quentin

+0

是的,这就是为什么我说我不确定它会起作用。 – Cristy

+0

为什么倒票? :) – Cristy

相关问题