使用AJAX加载html文档时,它对HEAD标记内的节点有什么作用:(脚本,链接,样式,元,标题)忽略它们还是加载并解析它们? 在jquery的ajax()函数的情况下?
答案 0 :(得分:39)
当您调用jQuery.ajax()
方法时,您可以指定dataType
属性,该属性描述您希望从服务器获得哪种数据,以及如何在收到服务后处理它。
默认情况下,jQuery会尝试根据响应的MIME类型猜测dataType
。但是,您可以从以下显式指定dataType:
html :以纯文本形式返回HTML;包含的脚本标记在插入DOM时进行评估。
文字:纯文字字符串。
xml :返回可以通过jQuery处理的XML文档。
脚本:将响应评估为JavaScript并将其作为纯文本返回。除非使用选项“cache”,否则禁用缓存。
json :将响应计算为JSON并返回JavaScript对象。
jsonp :使用JSONP加载JSON块。会添加一个额外的“?callback =?”在您的网址末尾指定回调。
作为示例,以下ajax调用将以纯文本字符串形式返回数据,而不执行脚本或操作DOM:
$.ajax({
url: 'ajax/test.html',
dataType: 'text',
success: function(data) {
alert(data);
}
});
答案 1 :(得分:31)
使用AJAX加载html文档时,它对HEAD标记内的节点有什么作用:(脚本,链接,样式,元,标题)
这取决于你如何进行加载。 ajax()
(与它所基于的XMLHttpRequest一样)本身只给你一个字符串。你是怎么把它纳入文件的?
如果将该字符串写入元素的innerHTML
,则其中的脚本将不会被执行。这在任何地方都没有标准化,但所有当前流行的浏览器都采用这种方式。
但是,如果您随后将该元素插入到文档中(无论它之前是否已经在文档中),那么第一次执行时将在许多浏览器中执行 。在IE中,当您将脚本元素直接插入任何元素时,无论是否在文档中,脚本都将被执行。
这一切都非常不一致和不方便,这就是为什么你应该避免在文档中加载AJAX加载<script>
元素。反正通常没有充分的理由;最好保持脚本代码静态,并使用JSON(仅在绝对必要时使用eval
)将脚本数据传递给它们。
load
函数会尝试补偿浏览器差异。它无法捕捉涉及<script>
的所有情况(有一些非常奇怪的情况)。一般来说,你不应该依赖它。您可以使用HTML页面响应,但只加载没有<script>
的特定元素,因为这只是写入到innerHTML步骤。但同样,你真的不想依赖于此。让服务器返回一段HTML或JSON,你的脚本可以直接使用,这样做会好得多。
对于样式表和样式表链接,将它们插入到正文中通常可以正常工作,但是通过HTML的术语它可能不应该。 meta
和title
不会做任何事情,对他们起作用为时已晚。只需使用innerHTML
解析它们就不会做任何事情,但如果可以,请尽量避免使用它。
答案 2 :(得分:8)
当你说“加载”时,我理解这只是意味着调用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警报,表示内联脚本块和外部脚本文件都被解释。
答案 3 :(得分:2)
不,他们不会被解释。
可以使用innerHTML或DOM操作来加载HTML。在这两种情况下,如果HTML包含<script>
标记,则不会对其进行解释。
但是,如果您确实需要,可以浏览Ajaxed HTML内容中的<script>
标记和eval()
标记。
但是,如果您使用此类型的<script src="http://site/script.js"></script>
脚本标记,则会对其进行解释。
答案 4 :(得分:1)
正如已经指出的那样,一般 - 不,脚本标签不会被解释。
我不确定其他标签会发生什么。
我在这里假设您正在使用AJAX加载整个页面 - 我不确定您为什么要这样做?也许您可以向我们提供更多信息,我们可以提出一些建议吗?
更直接地解决您的问题 - 通常,重新加载的内容所需的任何脚本都不应重新加载内容,而应重新加载页面。这样你就可以安排从你的AJAX重新附加事件处理程序等回调。