从大HTML字符串创建jQuery对象


139

我有一个包含多个子节点的大HTML字符串。

是否可以使用此字符串构造jQuery DOM对象?

我试过了,$(string)但它只返回包含所有单个节点的数组。

试图获得一个我可以使用.find()函数的元素。


HTML在哪里,您想用它构造什么?您可能需要查看.find()函数:api.jquery.com/find
Control Freak

3
jQuery对象包含所有节点的类似数组的对象。您能详细说明您要达到的目标吗?
弗雷德里克·哈米迪

“这个字符串”在哪里?什么弦
Viezevingertjes 2012年

看看这里,我想这就是您想要的 stackoverflow.com/q/759887/474535
bart s 2012年

我必须通过一个字符串将元素从一个WebView传递到另一个,该字符串只是该元素的HTML源。我想我可能误会了jQuery对象是什么。
user1033619 2012年

Answers:


199

更新:

从jQuery 1.8开始,我们可以使用$ .parseHTML,它将HTML字符串解析为DOM节点数组。例如:

var dom_nodes = $($.parseHTML('<div><input type="text" value="val" /></div>'));

alert( dom_nodes.find('input').val() );

演示


var string = '<div><input type="text" value="val" /></div>';

$('<div/>').html(string).contents();

演示

这段代码中发生了什么:

  • $('<div/>')<div>DOM中不存在的伪造品
  • $('<div/>').html(string)作为孩子string在假货中附加<div>
  • .contents()检索该假<div>对象的子代作为jQuery对象

如果您想.find()工作,请尝试以下操作:

var string = '<div><input type="text" value="val" /></div>',
    object = $('<div/>').html(string).contents();

alert( object.find('input').val() );

演示


1
@ user1033619,您也可以执行.find()操作,查看演示
thecodeparadox 2012年

但如何,如果string = '<input type="text" value="val" />'
fdrv表示

1
如果可以$("<div/>"),为什么不能$(string)呢?
xr280xr

2
对于更复杂的HTML,我需要删除.contents才能使其正常工作。jsfiddle.net/h45y2L7v
Simon Hutchison

您不想执行$(string),因为您需要一个包装div来获取其中的内容。您将获得div的内容,这将是您的输入。
Michael Khalili

120

从jQuery 1.8开始,您可以仅使用parseHtml创建您的jQuery对象:

var myString = "<div>Some stuff<div>Some more stuff<span id='theAnswer'>The stuff I am looking for</span></div></div>";
var $jQueryObject = $($.parseHTML(myString));

我创建了一个演示此内容的JSFidle:http : //jsfiddle.net/MCSyr/2/

它将任意HTML字符串解析为jQuery对象,并使用find在div中显示结果。


10
我发现这个答案要好得多,因为不必使用ghost div元素。$ .parseHtml ftw。
ZeeCoder

2
我想这个答案对我不起作用,然后我想将其添加到$ jQueryObject.find()中,因为那时候还没有将它添加到dom中。
dougajmcdonald

@dougajmcdonald-查找应该在没有将内容添加到dom的情况下工作。如果您看一下我的小提琴(jsfiddle.net/MCSyr/2),我在jQuery对象上调用find,它返回预期的结果:$ jQueryObject.find(“#theAnswer”)。html()
kiprainey

1
@kiprainey有趣,我将挖掘出我不喜欢的示例,看看是否还有其他问题。它是在TypeScript模块内编写的,在其他逻辑负载内,这可能是一个不同的问题!我很抱歉。
dougajmcdonald

8
值得一提的是,在jQuery 1.8
Jean-Michel Garcia

12
var jQueryObject = $('<div></div>').html( string ).children();

这将创建一个虚拟jQuery对象,您可以在其中将字符串作为HTML放置。然后,您只能得到孩子。


2
香港专业教育学院尝试过,但它不能与我以后使用的.find()函数一起使用。
user1033619 2012年

3
@ user1033619您必须使用.filter()而不是.find()
库尔伯·赛尼

2

还有一个伟大的库,专门为此而设计,名为cheerio

专为服务器设计的核心jQuery的快速,灵活和精益实现。

var cheerio = require('cheerio'),
    $ = cheerio.load('<h2 class="title">Hello world</h2>');

$('h2.title').text('Hello there!');
$('h2').addClass('welcome');

$.html();
//=> <h2 class="title welcome">Hello there!</h2>

1

我将以下内容用于HTML模板:

$(".main").empty();

var _template = '<p id="myelement">Your HTML Code</p>';
var template = $.parseHTML(_template);
var final = $(template).find("#myelement");

$(".main").append(final.html());

注意:假设您使用的是jQuery


1

$(string)不起作用的原因是jquery在$()之间找不到html内容。因此,您需要首先将其解析为html。一旦有了一个变量,就可以在其中解析html。然后,您可以使用$(string)并使用对象上所有可用的函数

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.