如何在ajax HTML响应中查找body标签?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (65)

我正在做一个ajax调用来获取内容并附加这样的内容:

$(function(){
    var site = $('input').val();
    $.get('file.php', { site:site }, function(data){
        mas = $(data).find('a');
        mas.map(function(elem, index) {
            divs = $(this).html();
            $('#result').append('' + divs + '');
        })
    }, 'html');
});

问题是,当我改变abody我什么都没有(没有错误,只是没有HTML)。我假设body是一个标签就像'一'是?我究竟做错了什么?

所以这对我有用:

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

但是这并不是:

 mas = $(data).find('body');
提问于
用户回答回答于

通过jQuery对象(ie $(data))解析返回的HTML 以获取body标签注定会失败。

原因是返回的datastring(尝试console.log(typeof(data)))。现在,根据jQuery文档,当从包含复杂HTML标记的字符串创建jQuery对象时,body可能会剥离标签等。发生这种情况是因为为了创建对象,HTML标记实际上被插入到不允许这种附加标记的DOM中。

文档中的相关引用:

如果一个字符串作为参数传递给$(),jQuery会检查字符串以查看它是否看起来像HTML。 [...]如果HTML比没有属性的单个标签更复杂,就像在上面的例子中那样,元素的实际创建由浏览器的innerHTML机制来处理。在大多数情况下,jQuery会创建一个新元素,并将元素的innerHTML属性设置为传入的HTML代码片段。当参数具有单个标签时(可选闭合标签或快速关闭) - $(“<img / >)或$(“<img>”),$(“<a> </ a>”)或$(“<a>”) - jQuery使用本地JavaScript createElement()函数创建元素。 当传入复杂的HTML时,一些浏览器可能不会生成完全复制所提供的HTML源代码的DOM。如前所述,jQuery使用浏览器的.innerHTML属性来解析传递的HTML并将其插入到当前文档中。在此过程中,某些浏览器会过滤掉某些元素,如<html>,<title>或<head>元素。因此,插入的元素可能不能代表传递的原始字符串。

用户回答回答于

简单的解决方案:

var body = data.substring(data.indexOf("<body>")+6,data.indexOf("</body>"));
$('body').html(body);

也适用于head或任何其他标签

(使用xml解析的解决方案会更好,但如果XML响应无效,则必须执行一些“字符串解析”。)

扫码关注云+社区

领取腾讯云代金券