2010-08-10 55 views
9

例如在网页上运行的JavaScript代码,我们有这样的事:是否有可能从不在DOM中的html字符串获取jQuery对象?

var data = '<html>\n <body>\n I want this text ...\n </body>\n</html>'; 

我想使用,如果它可能至少知道获得在HTML字符串的正文文本不扔整个html字符串放入DOM并从那里选择。

+0

jquery - $('body')。html() – khairil 2010-08-10 02:52:45

+2

@khairil - 仔细阅读该问题... – detly 2010-08-10 02:58:26

+0

opss,对不起,请忽略我以前的评论。 – khairil 2010-08-10 03:03:32

回答

8

首先,它是一个字符串:

var arbitrary = '<html><body>\nSomething<p>This</p>...</body></html>'; 

现在的jQuery把它变成一个未连接的DOM片段,应用其内部的.clean()方法去除诸如额外的<html>,<body>等事物

var $frag = $(arbitrary); 

您可以使用jQuery的功能操作这一点,即使它仍然是一个片段:

alert($frag.filter('p').get()); // says "<p>This</p>" 

或课程刚刚得到的文本内容,如你的问题:

alert($frag.text()); // includes "This" in my contrived example 
         // along with line breaks and other text, etc 

你也可以稍后将片段附加到DOM上:

$('div#something_real').append($frag); 

在可能的情况下,在片段未连接时对碎片进行复杂操作通常是一种很好的策略,然后在完成后将它们滑入“真实”页面。

1

这个问题的正确答案,在这个确切的措辞中,是NO。

如果你写了类似var a = $("<div>test</div>")的东西,jQuery会将该div添加到DOM,然后围绕它构造一个jQuery对象。如果你想不打扰DOM,你将不得不自己解析它。正则表达式是你的朋友。

+0

动态地将这样的标签动态添加到隐藏的div中会不好吗?它会混淆页面吗?我知道,它绝对不会是有效的HTML,但我想我可以做这样的事情:

,然后像做 $(“#数据HTML”)HTML(); – Travis 2010-08-10 02:54:47

+0

是的,你可以做到这一点,是的,它会工作。引用“有效的HTML”在这里并不相关,因为一旦HTML被浏览器解析,它不再是HTML,而是一个DOM树。我还必须补充说,你不必把它包装在一个div中。你可以直接将整个字符串传递给'$()'函数,并且它应该返回一个表示你的'html'标签的jQuery对象。 – 2010-08-10 03:00:31

0

在将它抛入只是普通字符串的DOM之前。

您可以确定使用REGEX

1

我认为最简单的方法就是将它放入DOM并从那里获取,然后再从DOM中删除它。

jquery本身充满了这样的技巧。它始终将各种东西添加到DOM中,包括使用$('< p>某些html </p>')构建的东西。所以如果你沿着这条路走下去,你仍然会有效地将东西放入DOM中,然后暂时删除它,除非它是Jquery做的。

+0

$('

一些html

')是做什么的? – Travis 2010-08-10 02:57:09

+0

它将DOM元素从您给出的HTML中创建出来,并将这些元素返回到Jquery对象中,然后您可以在某处插入到文档中或使用其他方式执行其他操作。 Jquery通过使用innerHTML和等价物来利用浏览器的内部HTML解析器。 – thomasrutter 2010-08-10 03:00:11

+0

@Travis:如jQuery文档(http://api.jquery.com/jQuery/#jQuery2)所述,“... jQuery试图按照HTML描述创建新的DOM元素,然后创建一个jQuery对象并返回指这些元素......“ – 2010-08-10 03:02:21

1

John Resig(jQuery作者)创建了一个您可能会觉得有用的pure JS HTML parser。从该页面的一个例子:

var dom = HTMLtoDOM("<p>Data: <input disabled>"); 
dom.getElementsByTagName("body").length == 1 
dom.getElementsByTagName("p").length == 1 

Buuuut ...这个问题包含了约束,我认为你需要更关键的。而不是在一个JS变量中围绕一个硬编码的HTML字符串工作,你能不能重新考虑为什么它首先是这样的? 什么是用于硬编码的字符串?

如果它只是坐在脚本中,请将其重新编写为适当的对象。

如果是来自AJAX调用的响应,那么已经有一个非常好的jQuery AJAX API。 (补充:虽然jQuery的只是返回它没有任何解析它能力的字符串,所以我想你又回到了起点有)

相关问题