jQuery Ajax 解析响应文本

9

好的,这真的让我很沮丧,因为我以前做过一百次,但这一次却不起作用。所以我知道我做错了什么,我只是想不出来。

我正在使用jQuery的.get例程从另一个文件加载html。我不想使用.load(),因为它总是替换我加载内容的元素的子元素。

这是我的.get请求:

$(document).ready(function() {
    $.get('info.html', {}, function(html) {
        // debug code
        console.log($(html).find('ul').html());
        // end debug code
    });
});

文件'info.html'是一个带有正确文档类型的标准xhtml文件,而且body中唯一的内容是一系列ul,我需要访问这些内容。但不知何故,find函数返回了一个空值。
在firebug中,GET请求显示了正确的响应文本,当我运行时。
console.log(html);

与当前的console.log行不同,我得到了整个info.html作为输出,就像我所期望的那样。

有什么想法吗?

5个回答

10

您无法拉取整个XHTML文档。您只能处理存在于html文档的<body>标签内的标签。令人沮丧。从info.html中删除除<body>标签之外的所有内容,然后再尝试。

还有其他潜在的解决方法 - 请检查此响应底部的"Stackoverflow相关项"。

来自文档:(http://docs.jquery.com/Core/jQuery#htmlownerDocument)

"HTML字符串不能包含在div中无效的元素,如html、head、body或title元素。"

Stackoverflow相关项:


所以我需要编写一个 PHP 脚本来坐在这两个 HTML 文件之间,并让 GET 请求到达那里,唉...这真是令人沮丧,我原本希望避免这种情况。 - user35288
你的文档格式正确吗?里面没有像<span/>这样的东西吧? - Sampson
不,它只是html->body->ul->li。body下面有几个ul->li集合,但都是有效的。我决定只使用.load()加载到隐藏的div中,解析数据,并将解析后的数据插入到我想要的位置。 - user35288
1
我看不出你的代码有什么问题。但是,如果在返回的HTML中有多个UL,则“.find('ul').html()”只会为这些元素中的第一个提供HTML。 - Richard M
1
Triffid,你确定吗?我在想它是否会返回任何UL元素中的所有LI。 - Sampson
显示剩余3条评论

8

我知道这是一篇旧文章,但我遇到了与之前完全相同的问题几个小时,找到了解决方案。对于我来说,实际上有效的方法是将HTML内容包装在form标签中。

因此,以下是HTML源代码:

<html>
 <head>
  <body>
   <form>
    <div id="content">Some Stuff</div>
   </form>
  </body>
 </head>
</html>

使用这个 jQuery 代码片段应该可以生效:

var callback = function (data) {
   alert($("#content", $(data)).html());
};
$.get(url, null, callback, null);

希望这能帮到您...

好的,你的语法帮了很大的忙。alert($("#content", $(data))) <- 我之前不知道这个。你可以直接使用 $.get(url, callback);,但我猜你有特别的原因。PS:正如你所看到的,你少了一个')'。 - nevvermind
我刚刚纠正了缺少的 ')' 和几个拼写错误,非常感谢 @nush。 - Isaac
你的代码写成了:alert($()).html(); 应该改为:alert($().html()); - Joel Mellon

6
我发现这是一个很干净的解决方案:
var elementInResponse = $("<div>").html(responseText).find(selector);

这对我来说遗漏了头和主体标签。 - Nico

3

如果想要做同样的事情并且知道 JQuery load(..) 可以实现,可以看一下代码。虽然你不能直接将完整的html响应转换成JQuery对象,但是可以将其附加到一个对象中:

function(data, textStatus, xhr) {
    $(target).html(jQuery("<div>").append(data).find("#snippet"));
    // Create a dummy div to hold the results,
    // inject the contents of the document into it,
    // Locate the specified elements
}

服务器返回的数据会进入 data 中,格式如下:
<! doctype ... >
<html>
  <head>
    ...
  </head>
  <body>
    <div id="snippet">
      <p>Some content here that we are interested in</p>
    </div>
  </body>
</html>

这是一个非常重要的答案。与此主题上几乎所有其他线程中的答案相反,$(data)$.parseHTML(data)都不会返回一个jQuery对象,以便您可以链接像.find()等的方法。在jQuery 2.1.0中,将其附加到打开的div标记是我唯一有效的方法。 - lunelson

0
尝试将整个包含在
标签内,例如:<body><div>内容</div></body>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接