【发布时间】:2014-02-22 05:51:40
【问题描述】:
我有一个通过这个 ajax 获得跨域请求的 Rails 应用程序(我使用 rack-cors 来完成这个没有 jsonp 的跨域请求):它用 html 响应
//to ensure cache=true gets passed
$.ajaxPrefilter('script', function(options) {
options.cache = true;
});
//ajax requests html
$.ajax({
beforeSend: function (xhr) {
xhr.setRequestHeader ('Authorization', api_key);
},
dataType: 'html',
type: 'GET',
url: url+'/gwsearch/ajax_search?d1='+d1_val+'&d2='+d2_val,
crossDomain: true,
success:function(result){
$("#display").html(result);
},
error: function(result) {
$('#display').html('Unauthorized client.');
}
它以#display 中显示的HTML 进行响应。它在 html 中包含此脚本标记
<script src="http://localhost:3000/assets/application.js" type="text/javascript"></script>
我在新显示的 Rails 应用上有输入按钮,它们看起来像这样:
<%= form_tag plans_collapse_plans_path, :method => 'post', :remote => true do %>
<%= hidden_field_tag(:plangroup_id, plangroup.id) %>
<%= image_submit_tag "collapse.png" %>
<% end %>
单击输入按钮执行 POST。问题是输入按钮将发布与我请求跨域 Rails 应用程序一样多的次数。如果我已请求该应用程序 5 次,当我单击应用程序上的输入按钮时,它将 POST 5 次。
无论我发送多少次初始 ajax 请求,我仍然只有一个 application.js;它不会被物理缓存超过一次。
编辑:这是我的缓存的样子,如您所见,只有一个 application.js:
collapse_tplans POST 都对应同一个 application.js 文件,同一行。如果我已经加载了 6 次初始 ajax 请求,我将有 6 个来自 application.js 的 collapse_tplan POST
我的猜测是,正在发送的 html 页面中的脚本标记正在初始化 jquery 的新版本(因为 jquery 包含在 application.js 中),并且可能与 application.js 中加载的其他内容重复通过脚本标签发送的时间。话虽如此,在 Chrome 中的网络下,无论我执行多少次 ajax 请求,我都只能看到 application.js 被请求一次。
有什么想法吗?我需要我的输入按钮只发布一次,就像它应该做的那样。我真的被这个难住了。
【问题讨论】:
-
I still only have one application.js present- 这是什么意思?我很困惑你的问题是什么? -
@RichPeck 我用我的缓存图片更新了问题。我的意思是,虽然我在缓存中只有一个 application.js,但每次我从初始 ajax 请求中获得 HTML 响应时,它都会包含一个指向同一个 application.js 的脚本标记。问题是每次我在 HTML 响应中提交输入时,它都会发布与加载该脚本标签一样多的次数。即,如果我加载 HTML 响应 3 次,我将有 3 个来自我的输入的 POST。这些应该只发布一次。它们都指向同一个发起者:application.js
-
@RichPeck 我的意思是,即使 application.js 被缓存了一次,它似乎每次加载 HTML 页面时都会重新初始化,为输入事件创建新的处理程序。这是我的猜测。
-
我仍然不明白为什么您认为这与您的缓存显示的内容有关。在通过 AJAX 加载的 HTML 代码中有一个 script 元素,jQuery 将其放入文档中以便执行。我不知道你为什么认为缓存应该防止这种情况发生。
-
是的。 // jQuery.ajax 的文档指出,响应中包含的
dataType:html脚本元素在插入 DOM 时会被评估。您可以尝试改用dataType:text,看看是否会改变行为。否则,您可能必须自己过滤掉那些脚本元素;或确保您的脚本不会多次附加相同的事件。
标签: javascript jquery ruby-on-rails ajax ruby-on-rails-3