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

Neo*_*ang 6 ajax jquery http web

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

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

让我感到惊讶的是,<script>标签是由jquery用ajax获取的.将<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);
}
Run Code Online (Sandbox Code Playgroud)

html片段:

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

<script>
  <!--some html rendering code that depends on somelib-->
</script>
Run Code Online (Sandbox Code Playgroud)

小智 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
    });
}
Run Code Online (Sandbox Code Playgroud)

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

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

  2. 编辑来源。

  3. 不要有压力,让事情保持原样。

  4. 纯粹是猜测,但您可以自己获取内容并将其插入到 DOM 中,然后自行处理渲染结果。

看来这是作为在调用时插入 DOM 的内容的结构化/清理的一部分来完成的。