当您使用 AJAX 加载 html 文档时,它对 HEAD 标签内的节点有什么作用:(脚本、链接、样式、元、标题)忽略它们或加载并解析它们?在 jquery 的 ajax() 函数的情况下?
通过ajax加载html页面时,是否会加载script标签?
当您调用该jQuery.ajax()
方法时,您可以指定该dataType
属性,该属性描述了您期望从服务器获得的数据类型,以及一旦收到该数据如何处理。
默认情况下,jQuery 会尝试dataType
根据响应的 MIME 类型猜测。但是,您可以从以下内容中明确指定数据类型:
html : 以纯文本形式返回 HTML;包含的脚本标签在插入 DOM 时进行评估。
text:纯文本字符串。
xml : 返回一个可以通过 jQuery 处理的 XML 文档。
script:将响应作为 JavaScript 进行评估并将其作为纯文本返回。除非使用选项“缓存”,否则禁用缓存。
json:将响应评估为 JSON 并返回一个 JavaScript 对象。
jsonp:使用 JSONP 加载到 JSON 块中。会添加一个额外的“?callback=?” 到 URL 的末尾以指定回调。
例如,以下 ajax 调用将数据作为纯文本字符串返回,而不执行脚本或操作 DOM:
$.ajax({
url: 'ajax/test.html',
dataType: 'text',
success: function(data) {
alert(data);
}
});
当您使用 AJAX 加载 html 文档时,它对 HEAD 标签内的节点有什么作用:(脚本、链接、样式、元、标题)
这取决于你如何加载。ajax()
(与它所基于的 XMLHttpRequest 一样)本身只是给你一个字符串。你是如何把它写进文件的?
如果将该字符串写入innerHTML
元素的 ,则不会执行其中的脚本。这在任何地方都没有标准化,但所有当前流行的浏览器都以这种方式运行。
但是,如果然后插入元素到文档(无论是已经在文档中之前或没有),它会在许多浏览器执行,你第一次做到这一点。在 IE 中,当您直接将脚本元素插入任何元素时,无论是否在文档中,都会执行脚本。
这都是非常不一致和不方便的,这就是为什么您应该避免<script>
在文档中加载 AJAX元素的原因。无论如何,通常没有充分的理由;最好保持您的脚本代码静态,并使用 JSON(或eval
仅在绝对必要时)将脚本数据传递给它们。
load
当 AJAX 将内容加载到文档中时,jQuery 的函数会尝试补偿浏览器的差异。它未能捕捉到所有涉及的情况<script>
(有一些非常奇怪的情况)。一般来说,你不应该依赖它。您可以避免获取 HTML 页面响应,然后只加载特定元素而没有<script>
输入,因为这只会执行写入到 innerHTML 的步骤。但同样,你真的不想依赖这个。让服务器返回您的脚本可以直接使用的 HTML 或 JSON 片段要好得多。
至于样式表和样式表链接,将它们插入正文通常是有效的,但根据 HTML 的术语,它可能不应该。meta
并且title
不会做任何事情,他们想要产生效果已经太晚了。仅使用解析它们innerHTML
不会做任何事情,但是,如果可以,请避免它。
当你说“加载”时,我理解它仅仅意味着调用 XHR(或 $.ajax 或 $.get 等)从 Web 服务器中提取 XML、JSON 或文本资源,将其存储在浏览器的 JS 运行时内存中,并获得对它的引用。对于 HTML 资源,单独操作不会解析任何内容。
但是,如果您将该 HTML 注入到 DOM 中(至少在 Firefox 3.5 中),那么它将被解释。例如,假设您有以下三个非常专业的文件。
barf1.html:
<html>
<head>
<script src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(init);
function init() {
$.get('barf2.html', inject);
}
function inject(data) {
debugger;
$('body').html(data);
//document.write(data);
}
</script>
</head>
<body>
long live barf1!
</body>
</html>
barf2.html:
<div>
<script type="text/javascript">
alert('barf2!');
</script>
<script type="text/javascript" src="barf3.js"></script>
barf2 lives here now!
</div>
barf3.js:
alert('barf3!');
当您导航到 barf1.html 时,页面内容将发生变化,您将看到两个 JavaScript 警报,表明内联脚本块和外部脚本文件都被解释了。
不,它们不会被解释。
HTML 可以通过使用 innerHTML 或通过 DOM 操作加载。在这两种情况下,如果 HTML 包含<script>
标签,它们将不会被解释。
但是,您可以<script>
查看 Ajaxed HTML 内容中的标签eval()
,如果确实需要的话。
<script src="http://site/script.js"></script>
但是,如果您使用这种类型的脚本标记,它将被解释。
正如已经指出的那样,一般来说- 不,不会解释脚本标签。
我完全不确定其他标签会发生什么。
我在这里假设您正在使用 AJAX 加载整个页面 - 我不确定您为什么要这样做?也许你可以给我们更多的信息,我们可以提出一些建议?
为了更直接地解决您的问题 - 通常,重新加载的内容所需的任何脚本不应随内容一起重新加载,而应随页面一起重新加载。这样您就可以安排从您的 AJAX 重新附加事件处理程序等进行回调。