代码之家  ›  专栏  ›  技术社区  ›  Karim

使用javascript删除文本节点周围的标记

  •  5
  • Karim  · 技术社区  · 15 年前

    如果我有一些像这样的HTML:

    <div id="text">
          This is some text that is being written <span class="highlight">with
          a highlighted section</span> and some text following it.
    </div>
    

    我想删除将文本节点留在其中的“跨度”,我该怎么做呢?我尝试使用jquery执行以下操作:

    wrap = $('.highlight');
    wrap.children().insertBefore(wrap);
    wrap.remove();
    

    但这不起作用,我猜是因为孩子们返回一个空集合,因为里面只有一个文本节点。所以所发生的就是跨度和它的内容被移除了。

    我也愿意接受我在这里的方法。发生的是,当用户选择一个文本块时,我的代码实际上创建了这个范围。它将所选文本包装在一个范围内,以便在视觉上区分它。不过,之后我需要删除这个范围,因为Mozilla的range对象的工作方式有些奇怪。

    编辑:我不想用这种方式替换“文本”的全部内容,因为它可能非常大。

    8 回复  |  直到 14 年前
        1
  •  18
  •   Pim Jager    15 年前

    您将得到文本,并用它替换跨度:

    var wrap = $('.highlight');
    var text = wrap.text();
    wrap.replaceWith(text);
    
        2
  •  6
  •   Russ Cam    15 年前

    在插件中包装它

    (function($) {   
        $.fn.tagRemover = function() {           
            return this.each(function() {            
            var $this = $(this);
            var text = $this.text();
            $this.replaceWith(text);            
            });            
        }    
    })(jQuery);
    

    然后像这样使用

    $('div span').tagRemover();
    

    Working Demo 这里-添加 编辑 到要播放代码的URL

        3
  •  3
  •   Gabriel Hurley    15 年前

    这工作:

    wrap = $('.highlight');
    wrap.before(wrap.text());
    wrap.remove();
    
        4
  •  3
  •   sixthgear    15 年前

    这将满足您的需要,并保留.highlight范围内的所有标记。

    content = $(".highlight").contents();
    $(".highlight").replaceWith(content);
    
        5
  •  1
  •   nadavkav    14 年前
    element = document.getElementById("span id");
    element.parentNode.insertBefore(element.firstChild, element);
    element.parentNode.removeChild(element);
    
        6
  •  0
  •   cw22    15 年前

    文本。替换(/</?[^>]+(>;$)/g,“”);

        7
  •  0
  •   Gordon Gustafson    15 年前

    只是更改跨度的类要比实际删除它容易得多。您可以使用纯javascript:

    document.getElementById("span id").className="";
    

    或jquery的toggleClass函数:

     $("element").toggleClass("highlight");
    

    此外,最佳实践还表明,不应使用暗示样式的类名,如highlight。试着用“强调”来代替。D

        8
  •  -1
  •   tbeseda    15 年前

    更好的解包插件:

    $.fn.unwrap = function() {
      this.parent(':not(body)')
        .each(function(){
          $(this).replaceWith( this.childNodes );
        });
    
      return this;
    };
    

    Ben Alman