2016-02-12 48 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

相關問題