每次ajax请求rails应用程序时都会发送javascript
我有一个rails应用程序,它通过这个ajax获得跨域请求(我使用它来完成这个跨域请求,而不使用jsonp):它用html响应每次ajax请求rails应用程序时都会发送javascript,javascript,jquery,ruby-on-rails,ajax,ruby-on-rails-3,Javascript,Jquery,Ruby On Rails,Ajax,Ruby On Rails 3,我有一个rails应用程序,它通过这个ajax获得跨域请求(我使用它来完成这个跨域请求,而不使用jsonp):它用html响应 //to ensure cache=true gets passed $.ajaxPrefilter('script', function(options) { options.cache = true; }); //ajax requests html $.ajax({ beforeSend: function (xhr) {
//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',:remote=>true do%>
单击“输入”按钮可执行POST。问题是,输入按钮的发布次数与我请求跨域rails应用程序的次数相同。如果我已经请求应用程序5次,当我单击应用程序上的输入按钮时,它将发布5次
无论我发送了多少次初始ajax请求,我仍然只有一个application.js;它不会被多次物理缓存
编辑:这是我的缓存的外观,如您所见,只有一个application.js:
collapse_tplans post都对应于同一个application.js文件,同一行。如果我加载了最初的ajax请求6次,我将从application.js中获得6篇collapse_tplan文章
我的猜测是,正在发送的html页面中的脚本标记正在初始化jquery的新版本(因为jquery包含在application.js中),并且每次通过脚本标记发送时,可能都会重复application.js中加载的其他内容。话虽如此,在Chrome的网络下,我只能看到application.js被请求一次,不管我执行ajax请求多少次
有什么想法吗?我需要我的输入按钮只发布一次,就像它应该做的那样。我真的被这个问题难住了。因为您在表单上使用了remote:true,所以我的理论是,每次加载脚本时,rails.js都会在文档元素上附加一个委托事件。5次加载=5次事件=5次ajax调用 要解决此问题,您可以:
application.js
脚本执行了5次,您的按钮的点击文件夹或表单的提交处理程序被附加了5次
只请求一次application.js
,这一事实并不能告诉您执行了多少次
尝试在application.js
脚本的开头添加以下行:
console.log('application.js executed');
并检查浏览器控制台,查看消息出现的次数
根据脚本的名称,application.js
,我猜它是用来初始化整个页面的,而ajax请求看起来只是用搜索结果填充#display
节点
您必须重构application.js文件:
- 阅读
application.js
文件中的代码,并将代码分为两部分:与设置#display
div有关的部分和其余部分李>
- 将第一部分移动到单独的
results.js
(或您认为合适的任何名称)中李>
- 从对
/gwsearch/ajax\u search
请求的响应中删除
节点,并将其替换为
节点
这个问题的答案是停止我的应用程序服务于
application.js
,并将其托管在客户端上。我是这样做的:
app/views/layout/application.html.erb
我注释掉了服务于application.js
<!--# <%= javascript_include_tag "application" %> -->
在我的客户中,我补充道
<script src="https://myapp.herokuapp.com/assets/application.js"></script>
因此,客户端提供application.js
,rails html响应在没有application.js
的情况下发送。希望这对每个人都有意义,这花了我一段时间来拼凑 我现在只有一个application.js
-这是什么意思?我不知道你的问题是什么?@RichPeck我用我的缓存图片更新了这个问题。我的意思是,尽管缓存中只有一个application.js,但每次我从最初的ajax请求获得HTML响应时,它都会包含一个指向同一application.js的脚本标记。问题是,每次我提交HTML响应的输入时,它发布的次数与加载脚本标记的次数相同。也就是说,如果我加载HTML响应3次,我将从输入中获得3篇文章。这些应该只发布一次。它们都指向同一个启动器:应用程序。js@RichPeck我的意思是,即使application.js缓存一次,它似乎在每次加载HTML页面时都重新初始化自己,为输入事件创建新的处理程序。这是我的猜测。我仍然不明白你为什么认为这与你的缓存显示的内容有关。在通过AJAX加载的HTML代码中有一个脚本元素,jQuery将其放入文档中以便执行。我不知道你为什么认为缓存应该阻止这种情况发生。是的jQuery.ajax的文档声明,响应中包含的带有dataType:html
script元素的脚本元素在插入到DOM中时会被评估。您可以尝试改用dataType:text
,看看这是否会改变行为。否则,您可能必须自己过滤掉这些脚本元素;或者确保脚本不会多次附加相同的事件。1。我们使用rack cors绕过cors,允许我们在没有jsonp的情况下跨域完成任务。我们已经尝试推出自己的产品,但由于原产地相同的政策,无法实现。我不知道行李架是怎么回事
<script src="https://myapp.herokuapp.com/assets/application.js"></script>