我使用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>
答案 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
});
}
由于该代码不使用缓存选项,因此您有几个选项:
使用未经推荐的https://api.jquery.com/jQuery.ajaxSetup/为所有呼叫设置不缓存,因此您必须覆盖所有非缓存呼叫的缓存。我是否提到所有电话?
编辑来源。
不要紧张并留下现状。
一个纯粹的猜测,但您可以直接获取内容并将其插入DOM中,并自行处理渲染后果。
这似乎是在调用时插入到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