【问题标题】:jQuery: Find text and replace with HTMLjQuery:查找文本并替换为 HTML
【发布时间】:2014-05-20 12:21:32
【问题描述】:

我尝试查找和替换文本(使用 jQuery)。实际上,我正在尝试在文本周围添加一个 span 元素。我也应该能够再次删除 span 而不会丢失里面的文本。

例如,假设我有以下情况开始:

<span>This is a span element</span>

我希望能够使用 jQuery/JavaScript 动态地做到这一点:

<span>This is a <span class="marked">span</span> element</span>

我也应该能够删除 span.marked 并返回第一个结果。

但问题是我想对具有多个子项和子项等的容器内的所有文本执行此操作。

到目前为止我得到的代码将执行以下操作,这不是我想要的:

<<span class="marked">span</span>>This is a <span class="marked">span</<span class="marked">span</span> element</span>

我想对页面上的所有文本执行此操作,而不仅仅是找到的第一个文本。

编辑:到目前为止我的代码:

var re = new RegExp(word, 'g');
$('.container').html($('.container').html().replace(re, '<span class="marked">' + word + '</span>'));

word 是一个字符串,其中包含要环绕的文本。

【问题讨论】:

  • 给你看JS代码。
  • 在你的最后一行代码中,我看到 dubbel > 围绕你的第一个 span="marked"。这是打字错误还是...?
  • 您可以搜索“span”字词,前后有空格,而不仅仅是“span”。所以你的span 元素不会被替换。
  • @VDesign 这就是他遇到的问题。他的代码用&lt;span class="marked"&gt;.... 将“跨度”包含在他现有的&lt;span&gt; 标签中。
  • 我有一个可行的解决方案。请参阅下面的答案。

标签: javascript jquery html dom


【解决方案1】:

要在 html 中包装搜索字符串,您可以使用以下内容:

$('span:contains("word")').html().replace('word', '<span class="marked">word</span>');

要删除它,您可以使用以下内容:

$('span:contains("word")').html().replace('<span class="marked">word</span>', 'word');

是的,这是一种非常粗略的做法,但应该可以。

编辑: 正如@user3558931 所指出的,这个词需要是一个变量。

要在 html 中包装搜索字符串,您可以使用以下内容:

$('span:contains("' + str + '")').html().replace(str, '<span class="marked">' + str + '</span>');

要删除它,您可以使用以下内容:

$('span:contains("' + str + '")').html().replace('<span class="marked">' + str + '</span>', str);

编辑: 上述代码中的一个小故障,看这个fiddle中的固定代码:http://jsfiddle.net/thePav/7TNk6/21/

【讨论】:

  • 这行不通。每个 PO word 是一个变量,而不是一个字符串。
  • 抱歉,我会更新代码,我想在我回答后,原来的问题已经更新了。
  • 这只适用于跨度标签?我正在尝试对容器内的所有嵌套标签这样做。我试过你的代码,比如 $('*:contains(.... 但这似乎不起作用。
  • 是的,那段代码是针对 span 标签的。要使用选择器类执行此操作,您可以使用类似 $('.container').html()
  • 抱歉,该代码有问题。首先,您必须将数据存储到变量中,然后应用它。看看这个小提琴:jsfiddle.net/thePav/7TNk6/21
【解决方案2】:
$('.container p').each(function() {
    var text = $(this).text();
    $(this).html(text.replace('word', '<strong><span class="accordion">word </span></strong>')); 
});

【讨论】:

    【解决方案3】:

    不要使用正则表达式。使用 DOM 遍历,这将更可靠、更快且破坏性更小(例如,事件处理程序不会被破坏)。

    有关简单示例,请参阅https://stackoverflow.com/a/10618517/96100

    或者,您可以使用以下内容:

    http://james.padolsey.com/javascript/replacing-text-in-the-dom-solved/

    这不包括之后删除跨度,但这是一件相当简单的事情。类似于以下内容(未经测试):

    function replaceWithOwnChildren(el){
        var parent = el.parentNode;
        while (el.hasChildNodes()) {
            parent.insertBefore(el.firstChild, el);
        }
        parent.removeChild(el);
    }
    
    // Create a non-live standard array of spans
    var spans = [].slice.call(document.getElementsByTagName("span"), 0);
    for (var i = 0, len = spans.length; i < len; ++i) {
        if (spans[i].className == "marked") {
            replaceWithOwnChildren(spans[i]);
        }
    }
    
    // Glue together any adjacent text nodes
    document.normalize();
    

    【讨论】:

      【解决方案4】:

      我认为需要调整正则表达式,使其不会选择 &lt;span 或任何其他 HTML 标记。我想建议 RegExp:

      var re = new RegExp('[^<\\/](' + word + ')', 'g');
      

      以及替换:

      $('.container').each(function() {
          $(this).html( $(this).html().replace( re, ' <span class="marked">$1</span>' ) );
      });
      

      并且可以通过使用代码来反转(点击下面demo中的按钮):

      $('button.undo').on( 'click', function() {
          $('.container').find( 'span.marked' ).each(function() {
              $(this).replaceWith( word );
          });
      });
      

      JS FIDDLE DEMO

      OTHER DEMO

      【讨论】:

        【解决方案5】:
        var mark = function(word){
            返回函数(){
                this.innerHTML = this.innerHTML.replace(word,'' + word + '');
            }
        };
        $('span').each(mark('span'));

        【讨论】:

        【解决方案6】:

        尝试使用以下方法:

        $('.container').forEach(function(){ 
            $(this).html().... 
        })
        

        如果那是您的问题。否则,请澄清一下,究竟是什么没有按预期工作?

        【讨论】:

          【解决方案7】:
          var span = document.getElementsByTagName("span")[0];
          span.innerHTML = span.innerHTML.replace(/span/g, "<span class=\"marked\">span</span>");
          

          http://jsfiddle.net/7TNk6/1/

          【讨论】:

          • 这不仅仅是 span 元素,而是我要修改的整个页面。像这样:jsfiddle.net/7TNk6/3
          • 好吧,那么您似乎有自己的解决方案源自我的解决方案。你怎么了?
          • 它也替换了 html 标签。它应该只用文本替换文本 BY html 标记。
          • 试试这个简单的修复方法:jsfiddle.net/7TNk6/17 我所做的只是在替换中的单词之前和替换它的 html 中添加一个空格。它并不优雅,但很有效。
          • 当我需要标记元素的第一个单词时会出现问题。但它越来越接近我的需要了。
          猜你喜欢
          • 1970-01-01
          • 2011-03-22
          • 2017-12-18
          • 2021-10-25
          • 2020-08-23
          • 1970-01-01
          • 1970-01-01
          • 2011-09-19
          • 1970-01-01
          相关资源
          最近更新 更多