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

IT技术 javascript jquery html ajax
2021-03-04 07:48:24

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

5个回答

当您调用该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);
  }
});
谢谢。真的有帮助。
2021-04-19 07:48:24

当您使用 AJAX 加载 html 文档时,它对 HEAD 标签内的节点有什么作用:(脚本、链接、样式、元、标题)

这取决于你如何加载。ajax()(与它所基于的 XMLHttpRequest 一样)本身只是给你一个字符串。你是如何把它写进文件的?

如果将该字符串写入innerHTML元素的 ,则不会执行其中的脚本。这在任何地方都没有标准化,但所有当前流行的浏览器都以这种方式运行。

但是,如果然后插入元素到文档(无论是已经在文档中之前或没有),它在许多浏览器执行,你第一次做到这一点。在 IE 中,当您直接将脚本元素插入任何元素时,无论是否在文档中,都会执行脚本

这都是非常不一致和不方便的,这就是为什么您应该避免<script>在文档中加载 AJAX元素的原因。无论如何,通常没有充分的理由;最好保持您的脚本代码静态,并使用 JSON(或eval仅在绝对必要时)将脚本数据传递给它们。

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

至于样式表和样式表链接,将它们插入正文通常是有效的,但根据 HTML 的术语,它可能不应该。meta并且title不会做任何事情,他们想要产生效果已经太晚了。仅使用解析它们innerHTML不会做任何事情,但是,如果可以,请避免它。

也很有趣的答案。非常感谢。我在 jqmodal 中使用了 ajax 功能,所以我查看了插件的源代码,它使用了 load()。这显然在我的主页上产生了问题。
2021-05-05 07:48:24
这自 2010 年以来有变化吗?ajax 脚本加载在浏览器之间仍然不一致吗?
2021-05-11 07:48:24

当你说“加载”时,我理解它仅仅意味着调用 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>但是,如果您使用这种类型的脚本标记,它将被解释。

在我的一些项目中,Firefox 3+ 和 IE7+ 成功地在由 jQuery POST 请求加载的 DOM 块中执行 <script> 。如果它真的不会执行,您可以将该脚本部分从注入的部分中拉出,然后再运行它。
2021-04-20 07:48:24
实际上,我在 FF 3.5 中的测试表明会解释内联脚本块(使用 innerHTML 或 appendChild)。看我的回答。
2021-04-24 07:48:24
我的回答是关于一般 JavaScript 的使用,而不是 jQuery。
2021-05-11 07:48:24

正如已经指出的那样,一般来说- 不,不会解释脚本标签。

我完全不确定其他标签会发生什么。

我在这里假设您正在使用 AJAX 加载整个页面 - 我不确定您为什么要这样做?也许你可以给我们更多的信息,我们可以提出一些建议?

为了更直接地解决您的问题 - 通常,重新加载的内容所需的任何脚本不应随内容一起重新加载,而应随页面一起重新加载。这样您就可以安排从您的 AJAX 重新附加事件处理程序等进行回调。