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

时间:2010-02-04 22:36:35

标签: javascript jquery html ajax

使用AJAX加载html文档时,它对HEAD标记内的节点有什么作用:(脚本,链接,样式,元,标题)忽略它们还是加载并解析它们? 在jquery的ajax()函数的情况下?

5 个答案:

答案 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)将脚本数据传递给它们。

当AJAX将内容加载到文档中时,jQuery的load函数会尝试补偿浏览器差异。它无法捕捉涉及<script>的所有情况(有一些非常奇怪的情况)。一般来说,你不应该依赖它。您可以使用HTML页面响应,但只加载没有<script>的特定元素,因为这只是写入到innerHTML步骤。但同样,你真的不想依赖于此。让服务器返回一段HTML或JSON,你的脚本可以直接使用,这样做会好得多。

对于样式表和样式表链接,将它们插入到正文中通常可以正常工作,但是通过HTML的术语它可能不应该。 metatitle不会做任何事情,对他们起作用为时已晚。只需使用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重新附加事件处理程序等回调。