在ajax HTML响应中查找body标签
我正在做一个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');
});
问题是,当我更换a
body
我什么都没有(没有错误,只是没有html)。 我假设身体是一个标签就像'一'是? 我究竟做错了什么?
所以这对我有用:
mas = $(data).find('a');
但是这并不是:
mas = $(data).find('body');
恐怕,通过jQuery对象解析返回的HTML(即$(data)
)以获取body
标签注定会失败。
原因是返回的data
是一个string
(尝试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);
也适用于头部或任何其他标签 。
(使用xml解析的解决方案会更好,但如果XML响应无效,则必须执行一些“字符串解析”。)
我尝试了一些,并且已经确定了原因,所以在等待我感兴趣的真实答案之前,这里有一些帮助理解问题的方法
$.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]
请参阅:iframe的contentDocument
链接地址: http://www.djcxy.com/p/4907.html上一篇: Find body tag in an ajax HTML response
下一篇: Google Hosted Libraries is unnecessarily using cache breakers