通过ajax加载html页面时,是否会加载脚本标签?

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不会做任何事情,但是,如果可以的话,尽量避免它.


G-W*_*Wiz 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>
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警报,指示内联脚本块和外部脚本文件都被解释.