javascript - 查找并替换文本而不破坏点击事件

标签 javascript jquery regex replace find

客户要求其网站上的所有商标符号(™ 和 ®)以特定方式设计;考虑到它们出现的数量(从标题到正文和导航),我们决定使用 JavaScript 来完成此操作。

我们想要做的是在页面文本中找到 ™ 和 ® 的每个实例(但不在元素属性内)并将它们包装在 <sup> 中标签,以便我们可以在 CSS 中设置它们的样式。

这是我们目前拥有的代码:

Trademark = {
    init: function () {
        $('body').contents().each(function () {
            var element = $(this);
            if (element.html()) {
                element.html(element.html().replace(/(?![^<]+>)™/gi, '<sup class="trademark">™</sup>'));
                element.html(element.html().replace(/(?![^<]+>)®/gi, '<sup class="trademark">®</sup>'));
            }
        });
    }
}

$(function () {
    Trademark.init();
})

它工作得很好,但是我们现在遇到了这样的问题:JavaScript 点击事件没有被注册到其内容被替换的元素上——我假设是因为它们在被替换时被从 DOM 中删除了。被操纵。

是否有对此进行修改(对 JS 或正则表达式)可以阻止这种情况发生?谢谢!

最佳答案

仅过滤文本节点并替换父节点的innerHTML,这样元素本身就不会被替换,并且事件处理程序应保持不变。

Trademark = {
    init: function () {
        $('*').contents().each(function() {
            if (this.nodeType == 3 && this.nodeValue) {
                if ( this.nodeValue.indexOf('™') != -1 || this.nodeValue.indexOf('®') != -1 ) {
                    this.parentNode.innerHTML = this.parentNode.innerHTML.replace(/(?![^<]+>)(™|®)/gi, '<sup class="trademark">$1</sup>');
                }
            }
        });
    }
}

FIDDLE

关于javascript - 查找并替换文本而不破坏点击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24505698/

相关文章:

regex - 如何按 ":"分割搜索词

Javascript 回调范围问题

javascript - 刷新页面而不出现屏幕空白?

javascript - 这个 javascript 闪烁代码不起作用的任何原因?

python - 根据表达式 'x={(.*)}' 返回字符串中的字符串

regex - 删除字符串中的前导、尾随和多个空格

javascript - javascript 的正则表达式

javascript - 拖动后 Google map 多段线无法正确显示

javascript - 向上和向下箭头的导航不适用于 Bootstrap Typeahead

jquery - 如何使用 jquery 捕获第一个克隆列表?