首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在ajax HTML响应中查找body标记

在ajax HTML响应中查找body标记
EN

Stack Overflow用户
提问于 2013-01-20 17:34:22
回答 5查看 27.7K关注 0票数 23

我正在进行一个ajax调用来获取内容,并像这样追加这个内容:

代码语言:javascript
运行
复制
$(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');
});

问题是,当我在body中更改a时,我什么也得不到(没有错误,没有html)。我假设body是一个标签,就像'a‘是?我做错了什么?

所以这对我来说很有效:

代码语言:javascript
运行
复制
 mas = $(data).find('a');

但这不是:

代码语言:javascript
运行
复制
 mas = $(data).find('body');
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-01-20 17:39:27

通过一个jQuery对象(即$(data))解析返回的超文本标记语言以获得body标记恐怕注定要失败。

原因是返回的data是一个string (尝试console.log(typeof(data)))。现在,根据the jQuery documentation的说法,当从包含复杂超文本标记语言的字符串创建jQuery对象时,像body这样的标记可能会被剥离。这是因为为了创建对象,HTML标记实际上被插入到DOM中,而DOM不允许这样的附加标记。

来自the documentation的相关报价

如果将字符串作为参数传递给$(),jQuery将检查该字符串以查看它是否类似

..。如果超文本标记语言比没有属性的单个标记更复杂,那么元素的实际创建将由浏览器的innerHTML机制处理。在大多数情况下,jQuery会创建一个新元素,并将该元素的innerHTML属性设置为传入的HTML代码段。当参数只有一个标记(带有可选的结束标记或快速结束标记)时- $( "< img / >“)或$( "< img >”)、$( "< a >< /a >“)或$( "< a >”)- jQuery使用本机JavaScript createElement()函数创建元素。

在传入复杂的HTML时,某些浏览器可能不会生成与所提供的HTML源代码完全相同的DOM。如前所述,jQuery使用浏览器的.innerHTML属性来解析传递的超文本标记语言并将其插入到当前文档中。在此过程中,某些浏览器会筛选出某些元素,例如< HTML >、<标题>或< head >元素。因此,插入的元素可能不能代表传递的原始字符串。

票数 12
EN

Stack Overflow用户

发布于 2016-02-02 23:44:32

我最终得到了这个简单的解决方案:

代码语言:javascript
运行
复制
var body = data.substring(data.indexOf("<body>")+6,data.indexOf("</body>"));
$('body').html(body);

也可与head或任何其他tag一起使用。

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

票数 13
EN

Stack Overflow用户

发布于 2013-01-20 18:00:53

我做了一些实验,并在一定程度上找出了原因,所以在等待我感兴趣的真正答案之前,这里有一个技巧来帮助理解这个问题。

代码语言:javascript
运行
复制
$.get('/',function(d){
    // replace the `HTML` tags with `NOTHTML` tags
    // and the `BODY` tags with `NOTBODY` tags
    d = d.replace(/(<\/?)html( .+?)?>/gi,'$1NOTHTML$2>',d)
    d = d.replace(/(<\/?)body( .+?)?>/gi,'$1NOTBODY$2>',d)
    // select the `notbody` tag and log for testing
    console.log($(d).find('notbody').html())
})

编辑:进一步的实验

如果你把内容加载到一个iframe中,然后你可以通过某个dom对象层次结构来访问框架内容,这似乎是可能的……

代码语言:javascript
运行
复制
// get a page using AJAX
$.get('/',function(d){

    // create a temporary `iframe`, make it hidden, and attach to the DOM
    var frame = $('<iframe id="frame" src="/" style="display: none;"></iframe>').appendTo('body')

    // check that the frame has loaded content
    $(frame).load(function(){

        // grab the HTML from the body, using the raw DOM node (frame[0])
        // and more specifically, it's `contentDocument` property
        var html = $('body',frame[0].contentDocument).html()

        // check the HTML
        console.log(html)

        // remove the temporary iframe
        $("#frame").remove()

    })
})

编辑:更多研究

似乎contentDocument是获取iFrame的window.document元素的符合标准的方法,但IE当然并不真正关心标准,所以这就是如何以跨平台的方式获得对iFrame的window.document.body对象的引用……

代码语言:javascript
运行
复制
var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
var iframeBody = iframeDoc.body;
// or for extra caution, to support even more obsolete browsers
// var iframeBody = iframeDoc.getElementsByTagName("body")[0]

请参阅:contentDocument for an iframe

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14423257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档