为什么jquery发送GET请求动态加载的脚本标记?

时间:2014-04-06 06:48:20

标签: jquery ajax http web

我使用jquery的ajax方法从服务器动态加载一些html片段,并将片段插入div中。在代码段中有一些<script>标记用于外部脚本。

我在制作ajax请求时在Chrome工具栏中查看了网络活动,并发现脚本标记的GET请求附加了?_=1234567890之类的内容。我也注意到了 GET请求的发起者是jquery。我知道jquery为AJAX请求执行此操作以避免使用缓存版本,但我希望缓存脚本。

让我感到惊讶的是,jquery使用ajax获取<script>标记。当您将<script>标记插入DOM时,浏览器是否应负责加载和执行它?为什么jQuery在这里采取行动?

如果我跳过jquery并使用普通的js将<script>标签附加到DOM,浏览器将加载并解析它,对吧?为什么浏览器不执行此操作并让jquery接管?

==============代码=============

加载html代码段的代码:

var url = "/"+modulename+"/settings/"+this.selectedProduct.id;
$.get(url, null, function(snippet){
  $("div#content").empty().html(snippet);
}

html片段:

<script type='text/javascript' src="http://www.staticcdn.org/somelib.js"></script>

<script>
  <!--some html rendering code that depends on somelib-->
</script>

2 个答案:

答案 0 :(得分:2)

由于你在Chrome中,这里有一个提示。如果您将鼠标悬停在网络呼叫源上,则会在调用时显示堆栈堆的弹出窗口。在这样的调用上执行此操作会暴露jquery.js:6717在第一次在页面上调用脚本时调用_evalUrl(setGlobalEval禁止在同一页面上第二次调用该脚本)。

_evalUrl: function( url ) {
    return jQuery.ajax({
        url: url,
        type: "GET",
        dataType: "script",
        async: false,
        global: false,
        "throws": true
    });
}

由于该代码不使用缓存选项,因此您有几个选项:

  1. 使用未经推荐的https://api.jquery.com/jQuery.ajaxSetup/为所有呼叫设置不缓存,因此您必须覆盖所有非缓存呼叫的缓存。我是否提到所有电话?

  2. 编辑来源。

  3. 不要紧张并留下现状。

  4. 一个纯粹的猜测,但您可以直接获取内容并将其插入DOM中,并自行处理渲染后果。

  5. 这似乎是在调用时插入到DOM中的内容的结构化/清理的一部分。

答案 1 :(得分:1)

在jquery doc中查看ajax:http://api.jquery.com/jQuery.ajax/并注意选项datatype

  

&#34; script&#34;:将响应评估为JavaScript并将其作为纯文本返回。通过将查询字符串参数&#34; _ = [TIMESTAMP]&#34;,附加到URL来禁用缓存,除非缓存选项设置为true。注意:这会将POST转换为GET以获取远程域请求。

$.get使用$.ajax。如果您不想?_=...,则必须自己致电$.ajax

您还可以查看选项cache