在 jQuery 1.8.0b1 中,您现在可以使用$.parseHTML() https://api.jquery.com/jquery.parsehtml/方法使这变得更容易。
$.parseHTML(xhr.responseText,true)
将为您提供一个包含脚本元素的 jQuery 对象。然后,您可以提取脚本标签并在附加 html 后附加或执行它们。
$.ajax({
url: '/whole_page.html',
success: function (data, status, xhr) {
var $result = $.parseHTML(xhr.responseText,true),
$scripts = $result.find("script").add($result.filter("script")).detach();
$('#menu').html($('#menu', $result).html());
$('#content').html($('#content', $result).html());
$('head').append($scripts);
}
});
您可能必须根据具体情况过滤脚本,以避免重复包含 jQuery。这将取决于您正在加载的内容。
如果升级 jQuery 不是一个选择,你可以采用以下实现$.parseHTML
并将其作为插件包含到您当前的 jQuery 中
(function($) {
if (!$.parseHTML) {
var rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/;
// data: string of html
// context (optional): If specified, the fragment will be created in this context, defaults to document
// scripts (optional): If true, will include scripts passed in the html string
$.parseHTML = function( data, context, scripts ) {
var parsed;
if ( !data || typeof data !== "string" ) {
return null;
}
if ( typeof context === "boolean" ) {
scripts = context;
context = 0;
}
context = context || document;
// Single tag
if ( (parsed = rsingleTag.exec( data )) ) {
return [ context.createElement( parsed[1] ) ];
}
parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
return jQuery.merge( [],
(parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
}
}
})(jQuery);