在$ .AJAX加载的HTML上使用Jqueryselect器?

我有

$.ajax({ url: identity, success: function(data) { ProcessIdentityServer(data) } }); 

当'data'被返回时,是否有一种方法可以在没有将其添加到DOM的情况下运行select器。 例如,我怎样才能得到'data'中包含的HTML中包含的所有LINK标签的所有href值,而不是先将它添加到DOM? 似乎有一个耻辱必须将其添加到DOM,如果我想要做的是提取一些东西到数组中。 任何人有任何想法?

 // Finds all div elements within an XML document from an AJAX response. $("div", xml.responseXML); 

一个注意我将添加从这里类似的问题是,如果您的AJAX返回以下内容:

 <div class="test">Hello</div> <div class="one">World</div> 

以下jQuery 不会工作:

 $(data).find('div.test'); 

因为div是顶级元素,数据不是元素而是string,为了使其工作,您需要使用.filter

 $(data).filter('div.test'); 

在开始之前,让我们快速看一下jQuery对从$.ajax()调用返回的基本HTML页面所做的事情,并将返回的数据转换为jQuery对象。

 $.ajax({ dataType : 'html', url : 'path/to/example-page.html', success : function(data) { // log the result of the data converted into a jquery object. console.log( $(data) ); } }); 

以下是您期望看到的内容:

 [ 0 <TextNode textContent="\n\n\n\n\n "> 1 title 2 <TextNode textContent="\n "> 3 meta 4 <TextNode textContent="\n\n\n\n\n"> 5 div#container 6 Comment { data=" #container ", length=12, nodeName="#comment", more...} 7 <TextNode textContent="\n\n"> jquery "1.6.4" length 8 selector "" // additional data and functions removed for brevity ] 

哎呀! 这很难看! 试图做任何事情都会产生结果,但是您需要知道数据结构每一次的样子,以及数据在这个对象中的位置。 数据是根源还是埋藏在内?

就像以前的海报所提到的,你可以使用.filter() ,但是根目录和search结果一样远,因为你只是过滤返回的结果。 但是,如果你在这一点上使用.find() ,你想要的元素是根,你会收到一个空集,但是任何埋在根之外的东西都会被find。

那么,为什么要以100%的把握知道那些数据结构是什么样的,为什么还要经历多次使用.filter().find()调用的麻烦,而且我敢说.each()循环? 呸! 这只是太多的工作,花费太多的时间。

如果你想。 .find().ajax()调用返回一个特定的HTML元素,请从以下行开始:

 var response = $('<html />').html(data); 

能不能真的那么简单? 其实,是的! 这里发生的事情是一个新的<html>元素被创build并转换成一个jQuery对象。 这是用来从.ajax()调用中插入返回的HTML的起始位置。 这有点像在网页上做$('html') 。 有了这个,你可以开始find元素。

 response.find( ... ); // any jquery selector in place of the ellipsis. 

这是一个使用原始海报的问题的例子:

 $.ajax({ dataType : 'html', url : 'path/to/example-page.html', success : function(data) { // set the returned contents in a new base <html> tag. var response = $('<html />').html(data), anchors, hrefValuesList = [ ], i, end; // now you can search the returned html data using .find(). anchors = response.find('a'); // grab all your href values from each anchor element. end = anchors.length; for (i = 0; i < end; i++) { hrefValuesList.push( anchors[ i ].href ); } // continue processing the data as necessary... } }); 

显然,如果您想要过滤掉任何不需要的内容,或者想要优化返回的值,则需要进行一些改进。

有了这个,你可以看到类似下面的例子数组返回:

 [ "http://stackoverflow.com/", "http://www.google.com/" ] // and so on... 

使用这种方法,您可以轻松地使用.find()对通过$.ajax()函数返回的任何HTML数据的威力,就像您在DOM中find的任何元素一样。 真正的好处是,你不是直接操纵DOM来find或者做你想要的,这是一个昂贵的过程。

快乐擦洗! =)

假定data是一串HTML,你可以这样做:

 $(data).find('a'); 

这将返回链接,而不会将数据添加到DOM。

您必须首先定义一个容器,以便能够从响应中获取/修改元素:

  $.ajax({ url: url + "/ajax.htm", dataType: "html", success: function(html) { container = $('#ajax_content'); container.html(html); container.find("a").css("background","red"); } }); 

当然你可以使用$(data)函数,这是一个核心的jquery函数,把返回的html转换成DOM元素。 在线查看文档 。

你现在也可以使用上下文(不知道这是什么时候引入的):

 $.get('some/url', '', function (data) { $("#domelement", data); } ); 

这与接受的答案是一样的,但有一些额外的解释。

您可以使用jQuery 上下文参数链接到文档

我不能比文档更好地解释。

select器上下文

默认情况下,select器从文档根开始在DOM内执行search。 但是,通过使用$()函数的可选第二个参数,可以为search提供备用上下文

自从jQuery v1.0以来,context参数就已经存在了

因此,OP示例的一个解决scheme是“将数据中保存的HTML中包含的所有LINK标记的所有href值先不join到DOM中”:

 success: function(data){ $("a", data).each(function(){ console.log( $(this).attr("href") ); }); } 

我的最终解决scheme是

 jQuery.ajax({ url: "/some-url", cache: false, dataType: "html", success: function(data) { jQuery("#target").html( jQuery(data).find('#ajax-data')); } });