2014-01-17 71 views
2

我需要替換一個像這樣的模式:「{12345,abcd}」在body的html中,但我不會丟失兒童的事件。 我曾嘗試代碼:在html中替換文本並保留事件

$("body").html($("body").html().replace(/[{]{1}([\d]+)[,]{1}(.*?)[}]{1}/g, "<span>Code:$1</span> - <span>Text:$2</span>")) 

但殺死元素的所有事件。 我該怎麼辦?

回答

0

出現這種情況,因爲HTML()方法文本(而非DOM元素)和文字作品不救事件偵聽器,還是你先閱讀課文,然後用它做(替換)的東西,然後寫它。在這種情況下,你會失去作爲事件監聽器,因爲它們被附加到DOM對象(而不是文本) 我認爲最好的方法是通過所有Dome樹,找到所有textNode DOM元素,並在每個DOM元素中單獨替換

2

你有3種選擇:

  1. 打開相關視圖在IDE中,修改並像一個紳士生成所需的標記。 Modifying HTML using regex is a bad practice.

  2. 只選擇可以具有該字符串的後代元素,並替換textContent而不是重置整個主體內容。

    $('.elements').text(function(_, oldText) { 
        return oldText.replace('foo', 'bar'); 
    }); 
    
  3. 更換機體的內容和代表的所有事件:

    $(document).on('event', 'element', fn); 
    

    也可以代替人體的結合事件處理程序之前的內容。這當然不會破壞未來的事件處理程序。

0

@BlackSeep ,如果我會做類似angularJs解析器不行,我已經解決了獲取所有文字項和搜索到的正則表達式。 這是解決對我來說:

$("body").find(":not(iframe)").addBack().contents().each(function() { 
    if(this.nodeType == 3) 
    { 
     $(this).first().replaceWith($(this).text().replace(/[{]{1}([\d]+)[,]{1}(.*?)[}]{1}/g, "<span class='translator' data-code='$1' data-text='$2'>$2</span>")); 
    } 
}); 

的信息我已經使用這個了對網頁翻譯一個映射。 我在哪裏打印「{id,text}」,我用一個範圍替換它,然後處理一個特殊事件以啓動該框的翻譯。