Javascript jQuery:HTML字符串中的展开元素
我试图找到最好的方法来打开HTML字符串(比如AJAX响应),而不必先将其附加到文档中。另外,哪一个是内存管理的最佳选择 HTMLJavascript jQuery:HTML字符串中的展开元素,javascript,jquery,memory,Javascript,Jquery,Memory,我试图找到最好的方法来打开HTML字符串(比如AJAX响应),而不必先将其附加到文档中。另外,哪一个是内存管理的最佳选择 HTML JavaScript ,将在此处变成code(删除的空白) 展开它的一种通用方法是简单地遍历字符串,无论是最外层的标记还是特定的标记,将不属于标记的每个字符添加到一个新字符串中(一旦遇到,您的实际问题就不太清楚了,但我可以预见两个可能的困难 .html()只返回一组html元素的内部内容,而不是标记本身 .find()只搜索子节点,而不是提供的节点 这两个问
- ,将在此处变成
(删除的空白)code
只返回一组html元素的内部内容,而不是标记本身.html()
只搜索子节点,而不是提供的节点.find()
这两个问题都可以通过在调用这些方法之前在HTML周围添加额外的标记来解决
编辑我想你想要的是:
展开它的一种通用方法是简单地遍历字符串,无论是最外层的标记还是特定的标记,将不属于标记的每个字符添加到一个新字符串中(一旦遇到,您的实际问题就不太清楚了,但我可以预见两个可能的困难
.filter()
行作用于顶级元素,而不是它们的子元素
在调用
.appendTo()
方法之前,不会将元素添加到真正的DOM中。是否只打开外部标记或特定类型的标记?外部标记,但如果存在类似foobarfoobar
(许多外部标记和任意顺序)的内容,最好能够选择外部标记的类型您只想删除div。最初的问题只是一个外部标记(例如…
),但我希望更健壮。您在这两个方面都是对的,这就是我在示例中所做的。查找('*'))
将找到所有直接子项,然后打开父级,这是我们想要的。另一方面,使用选择器/上下文方法,这就是为什么我们必须首先wrap()
然后指向它的parent()
html()
有点像反向展开(我们可以使用它来展开所选元素,而不是展开某个元素的父元素)。我真正希望找到的是类似于closest()的东西
,但它不会返回一个元素,而是会打开所有元素的数组。本质上,它类似于find,但它会从当前元素及其所有兄弟元素开始。不,我的意思是在整个HTML中包装一个元素-在HTML中最顶端的每个元素周围都有一个
。看看哪里只有一个元素e
标记:阿尔尼塔克:是的,但是如果你看我的包装的示例,你会注意到我在整个HTML中放置了一个div
。@vol7ron当然,但是为什么要把这两个预标记放在第一位呢?你仍然非常不清楚你到底想要什么,以及为什么我发布的版本没有实现这一点。是的,计数方法可以工作,但这意味着我需要一个XHTML正则表达式解析器,我希望避免这样做:)关于内存管理,我只是好奇如果我删除变量(例如$find
),是否会有任何内存占用,我不确定jQuery是如何释放其内部的。
<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>
.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; }
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'});
});
jQuery($html).filter('pre').children('div').appendTo('#wanted');