我正在进行一个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');
});问题是,当我在body中更改a时,我什么也得不到(没有错误,没有html)。我假设body是一个标签,就像'a‘是?我做错了什么?
所以这对我来说很有效:
 mas = $(data).find('a');但这不是:
 mas = $(data).find('body');发布于 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 >元素。因此,插入的元素可能不能代表传递的原始字符串。
发布于 2016-02-02 23:44:32
我最终得到了这个简单的解决方案:
var body = data.substring(data.indexOf("<body>")+6,data.indexOf("</body>"));
$('body').html(body);也可与head或任何其他tag一起使用。
(使用xml解析的解决方案会更好,但是对于无效的XML响应,您必须执行一些“字符串解析”。)
发布于 2013-01-20 18:00:53
我做了一些实验,并在一定程度上找出了原因,所以在等待我感兴趣的真正答案之前,这里有一个技巧来帮助理解这个问题。
$.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对象层次结构来访问框架内容,这似乎是可能的……
// 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对象的引用……
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]https://stackoverflow.com/questions/14423257
复制相似问题