我想做以下操作。
$("a").click(function (event) {
event.preventDefault();
$.get($(this).attr("href"), function(data) {
$("html").html(data);
});
});
我希望所有超链接的行为都能进行ajax调用并检索html。
不幸的是,您不能简单地用ajax响应中收到的html替换当前html。
如何仅获取ajax响应的<body> </body>
标记中的内容,以便我可以仅替换现有html中正文的内容。
编辑:<body>
打开标签并不总是只有<body>
,它有时可能有一个类,例如
<body class="class1 class2">
如果我理解正确,请使用正则表达式获取body标记之间的内容。
$.get($(this).attr("href"), function(data) {
var body=data.replace(/^.*?<body>(.*?)</body>.*?$/s,"$1");
$("body").html(body);
});
编辑
根据你下面的评论,这里有一个更新,可以匹配任何身体标签,无论其属性如何:
$.get($(this).attr("href"), function(data) {
var body=data.replace(/^.*?<body[^>]*>(.*?)</body>.*?$/i,"$1");
$("body").html(body);
});
正则表达式为:
^ match starting at beginning of string
.*? ignore zero or more characters (non-greedy)
<body[^>]*> match literal '<body'
followed by zero or more chars other than '>'
followed by literal '>'
( start capture
.*? zero or more characters (non-greedy)
) end capture
</body> match literal '</body>'
.*? ignore zero or more characters (non-greedy)
$ to end of string
添加"i"开关以匹配大小写。
请忽略我关于"s"开关的评论,在JavaScript中,所有RegExp默认情况下都是单行的,为了匹配多行模式,您添加了"m"。(该死的Perl,当我写JavaScript时会干扰我!:-)
我不想弄乱正则表达式。相反,我创建了一个隐藏的<iframe>
,加载其中的内容,并从页面的onload()
中的<iframe>
中提取<body>
。
我需要小心iframe的同源策略(本文展示了方法):
var iframe = document.createElement('iframe');
iframe.style.display = "none";
jQuery('body').append(iframe);
iframe.contentWindow.contents = data;
iframe.onload = function () {
var bodyHTML = jQuery(iframe).contents()
.find('body').html();
// Use the bodyHTML as you see fit
jQuery('#error').html(bodyHTML);
}
iframe.src = 'javascript:window["contents"]';
完成后只需移除<iframe>
。。。
请确保将事件绑定到按类筛选的文档($(document).on('click', '.my-class-name', doThings);
)。如果替换主体的html,则在使用新html重新绘制DOM时,任何直接完成的事件绑定($('.my-class-name').on('click', doThings);
)都将被销毁。重新绑定是可行的,但它也会从旧事件和节点中留下一堆指针,垃圾收集器必须清理这些指针——简单地说,它可能会使页面打开的时间越长,变得越来越重。
我还没有在多个平台上测试过,请谨慎使用。
// create a new html document
function createDocument(html) {
var doc = document.implementation.createHTMLDocument('')
doc.documentElement.innerHTML = html
return doc;
}
$("a").click(function (event) {
event.preventDefault();
$.get($(this).attr("href"), function(data) {
$("body").html($(createDocument(data)).find('body').html);
});
});