我用
这个方法已经可以很好地工作,虽然我还没有在任何烂浏览器上测试过。不管怎样,为了避免jQuery的一个特性(特殊的
$.ajax()
加载页面,并将结果的部分插入到页面的相应位置:$.ajax({
url: '/whole_page.html',
success: function (data, status, xhr) {
$result = $(xhr.responseText);
$('#menu').html($('#menu', $result).html());
$('#content').html($('#content', $result).html());
}
});
功能良好,但我遇到了一个问题。
现在我的页面包含一些特定于页面的 JS,必须在获取并插入结果时执行。据我所知,如果您从 HTML 文本构造 jQuery 对象并针对其查询,则 jQuery 不会返回 script
元素(我已经创建了一个演示 fiddle)。因此,我无法通过 jQuery 有选择地仅插入所需的脚本。
因此,似乎我必须手动从响应文本中提取 script
元素。基本上,我正在寻找正确的方法来做到这一点。以下是我迄今为止想到的:
function pullScripts(text) {
var frag = document.createDocumentFragment()
, div = document.createElement('div')
, scriptElements
;
// This is roughly how jQuery finds the scripts when cleaning text
frag.appendChild(div);
div.innerHTML = text;
scriptElements = div.getElementsByClassName('class-for-scripts-that-we-want');
$('head').append(scriptElements);
}
这个方法已经可以很好地工作,虽然我还没有在任何烂浏览器上测试过。不管怎样,为了避免jQuery的一个特性(特殊的
script
处理),复制这样基本的功能感觉不舒服。正如在fiddle中所看到的,jQuery对象实际上确实包含script
,但是它不会像.html()
或.get()
那样返回它们。我是否错过了一些明显的方法来做到这一点?
注意:一旦jQuery的内部parseHTML
函数被公开,整个主题都将无意义。
注意2:我也阅读了Trying to select script tags from a jQuery ajax get response,但是被接受的答案是“你不能”,随后是“使用正则表达式”。两者都不令人满意。
$.parseHTML()
方法来简化此过程。$.parseHTML(xhr.responseText,true)
将为您提供包括脚本元素的jQuery对象。然后,您可以提取脚本标记并在附加HTML后进行追加或执行。如果升级jQuery不是一种选择,则可以将$.parseHTML
的实现作为插件包含到当前的jQuery中。 - Kevin B$.parseHTML()
返回的是一组 DOM 节点数组,而不是 jQuery 对象。https://api.jquery.com/jQuery.parseHTML/ - rocky