pix*_*ine 29 html javascript ajax jquery
当您使用AJAX加载html文档时,它对HEAD标记内的节点有什么作用:(脚本,链接,样式,元,标题)忽略它们还是加载和解析它们?在jquery的ajax()函数的情况下?
Dan*_*llo 39
调用jQuery.ajax()方法时,可以指定dataType属性,该属性描述服务器期望的数据类型,以及收到数据后如何处理.
默认情况下,jQuery将尝试dataType根据响应的MIME类型进行猜测.但是,您可以从以下显式指定dataType:
html:以纯文本形式返回HTML; 包含的脚本标记在插入DOM时进行评估.
text:纯文本字符串.
xml:返回可以通过jQuery处理的XML文档.
script:将响应评估为JavaScript并将其作为纯文本返回.除非使用选项"cache",否则禁用缓存.
json:将响应计算为JSON并返回一个JavaScript对象.
jsonp:使用JSONP加载JSON块.会添加一个额外的"?callback =?" 到URL的末尾以指定回调.
例如,以下ajax调用将以纯文本字符串形式返回数据,而不执行脚本或操作DOM:
$.ajax({
url: 'ajax/test.html',
dataType: 'text',
success: function(data) {
alert(data);
}
});
Run Code Online (Sandbox Code Playgroud)
bob*_*nce 31
当您使用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>
Run Code Online (Sandbox Code Playgroud)
barf2.html:
<div>
<script type="text/javascript">
alert('barf2!');
</script>
<script type="text/javascript" src="barf3.js"></script>
barf2 lives here now!
</div>
Run Code Online (Sandbox Code Playgroud)
barf3.js:
alert('barf3!');
Run Code Online (Sandbox Code Playgroud)
当您导航到barf1.html时,页面内容将发生变化,您将看到两个JavaScript警报,指示内联脚本块和外部脚本文件都被解释.