【问题标题】:jQuery: unwrap element in HTML stringjQuery:在 HTML 字符串中展开元素
【发布时间】:2011-08-10 15:32:04
【问题描述】:

http://jsfiddle.net/vol7ron/vZLnr/

我正在尝试找到最好的方法来解开 HTML 字符串(如 AJAX 响应),而无需先将其附加到文档中。另外,哪个最适合内存管理?

HTML

  • <div class="label">Start With:</div>
    <pre id="original"></pre>
    
    <div class="label">What's Wanted:</div>
    <pre id="wanted"><div>foo</div><div>bar</div></pre>
    
    <hr />
    
    <div class="label">Attempt: .find()</div>
    <pre id="find"></pre>
    
    <div class="label">Attempt: .closest()</div>
    <pre id="closest"></pre>
    

CSS

  • .label    { font       : italic bold 11px Georgia;   margin    : 1em 0 .5em; }
    pre       { border     : 1px solid black;            padding   : 1em;        }
    hr        { margin     : 1.5em 0 1em; }
    
    #original { background : #eee; }
    #wanted   { background : #def; }
    

JavaScript

  •    var $html= "<pre><div>foo</div></pre><pre><div>bar</div></pre>";
    
       // No Changes
       jQuery('#original').html($html);
    
    
       // Find
       var $find = jQuery($html).find('*').unwrap();
       jQuery('#find').html($find);
    
    
       // Closest
       var $closest = jQuery($html).closest('pre').unwrap().html();
       jQuery('#closest').html($closest);
    
    
       // Wrapped
       var $pre = jQuery('pre', jQuery($html).wrap('<div />').parent() );
       $pre.each(function(){
                    jQuery('#wrapped').append(jQuery(this).html());
                });
    
       //=========== Prettify Output ===========
       var $wanted = jQuery('#wanted').html();
       jQuery('pre').not('#wanted, #original, #original *')
                    .each(function(){
                      var t = jQuery(this);
                      t.css({background: t.html()==$wanted?'#efe':'#fee'});
                    });
    

编辑

  1. .find() 方法需要一些工作,因为它会删除空白容器。想象一下&lt;pre&gt;&lt;span&gt;Code&lt;/span&gt; &lt;span&gt;Here&lt;/span&gt;&lt;/pre&gt;,它会变成&lt;span&gt;Code&lt;/span&gt;&lt;span&gt;Here&lt;/span&gt;(去掉空格)。

【问题讨论】:

  • 你想只解开外部标签还是特定类型的标签?
  • 外部标签,但如果有像&lt;pre&gt;foo&lt;/pre&gt;&lt;div&gt;bar&lt;/div&gt;&lt;span&gt;foobar&lt;/span&gt;这样的东西(许多外部标签和任何顺序)你只想要删除 div。
  • 原来的问题只针对一个外部标签(例如&lt;pre&gt;...&lt;/pre&gt;),但我喜欢更健壮。

标签: javascript jquery memory


【解决方案1】:

解开它的一种通用方法是简单地遍历字符串,无论是针对最外层标记还是针对特定标记,将不属于该标记的每个字符添加到一个新字符串中(一旦您点击

我不能真正谈论内存管理,因为我不熟悉 javascript 如何管理内存。

希望对我有所帮助。

【讨论】:

  • 是的,计数方法可以工作,但这意味着我需要一个 XHTML 正则表达式解析器,我想避免这样做:) 关于内存管理,我只是好奇是否有如果我删除了变量(例如$find),我不确定 jQuery 是如何发布它们的内部的。
【解决方案2】:

不清楚你的实际问题是什么,但我可以预见两个可能的困难。

  1. .html()只返回一组HTML元素的内部内容,而不是标签本身

  2. .find() 只搜索后代节点,不搜索提供的节点。

这两个问题都可以通过在调用这些方法之前在 HTML 周围添加一个额外的标签来解决。

编辑认为你想要的是:

jQuery($html).filter('pre').children('div').appendTo('#wanted');

.filter() 行适用于顶级元素,而不适用于它们的后代。

在调用 .appendTo() 方法之前,不会将元素添加到真实的 DOM 中。

【讨论】:

  • 你在这两点上都是对的,这就是我在我的例子中所做的。 find('*') 将找到获取所有直接子级,然后打开父级,这就是我们想要的。另一方面,wrapped 示例使用选择器/上下文方法,这就是为什么我们必须首先使用wrap() 然后指向parent()html() 有点像反向展开(而不是展开元素的父元素,我们可以使用它来展开选定元素)。
  • 我真正希望找到的是类似于closest() 的东西,但它不会返回一个元素,而是会转换所有元素的数组。本质上,它就像 find,但它会从当前元素及其所有兄弟元素开始。
  • 不,我的意思是在 整个 HTML 周围包裹一个元素 - 你在 HTML 中的 each 顶部元素周围有一个 &lt;pre&gt;。请参阅jsfiddle.net/alnitak/BBegB,其中只有一个 &lt;pre&gt; 标记。
  • :Alnitak: 是的,但是如果您查看我的 wrapped 示例,您会注意到我在整个 HTML 周围放置了一个 div
  • @vol7ron 当然可以,但是为什么要把这两个前置标签放在首位呢?你仍然非常不清楚你到底想要什么,以及为什么我发布的版本没有实现。
猜你喜欢
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 2013-11-01
相关资源
最近更新 更多