从一个大的 HTML 字符串创建一个 jQuery 对象

IT技术 javascript jquery html
2021-02-02 13:12:49

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

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

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

试图获取一个元素,我可以在其上使用 .find() 函数。

6个回答

更新:

从 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() );

演示

如果你能做$("<div/>"),你为什么不能做$(string)
2021-03-17 13:12:49
对于更复杂的 HTML,我需要删除 .contents 才能使其正常工作。jsfiddle.net/h45y2L7v
2021-03-24 13:12:49
@user1033619 你也可以执行.find()操作,查看演示
2021-03-25 13:12:49
但是如果 string = '<input type="text" value="val" />'
2021-03-29 13:12:49
你不想做 $(string) 因为你需要一个包装 div 来获取内容。您将获得 div 的内容,这将是您的输入。
2021-04-01 13:12:49

从 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 中。

@dougajmcdonald - find 应该可以在不将内容添加到 dom 的情况下工作。如果你看看我的小提琴 ( jsfiddle.net/MCSyr/2 ),我正在调用 jQuery 对象上的 find,它按预期返回结果:$jQueryObject.find("#theAnswer").html()
2021-03-18 13:12:49
当我想要然后到 $jQueryObject.find() 时,这个答案对我不起作用,我想是因为当时它没有添加到 dom 中。
2021-03-20 13:12:49
我发现这个答案要好得多,因为这不必使用幽灵 div 元素。$.parseHtml ftw。
2021-03-25 13:12:49
值得一提的是 parseHTML 是在jQuery 1.8中加入的
2021-03-29 13:12:49
@kiprainey 很有趣,我会找出它不适合我的例子,看看是否还有其他事情正在进行。它是在其他逻辑负载中的 TypeScript module中编写的,很可能是一个不同的问题!我很抱歉。
2021-04-10 13:12:49
var jQueryObject = $('<div></div>').html( string ).children();

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

我试过这个,但它不适用于我以后必须使用的 .find() 函数。
2021-03-15 13:12:49
@user1033619 你必须使用.filter()而不是.find().
2021-04-12 13:12:49

还有一个很棒的库,叫做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>

我将以下内容用于我的 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