Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
每次ajax请求rails应用程序时都会发送javascript_Javascript_Jquery_Ruby On Rails_Ajax_Ruby On Rails 3 - Fatal编程技术网

每次ajax请求rails应用程序时都会发送javascript

每次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) {

我有一个rails应用程序,它通过这个ajax获得跨域请求(我使用它来完成这个跨域请求,而不使用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',: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调用

要解决此问题,您可以:

  • 移除远程true并滚动您自己的,确保它只发生一次
  • 在加载新脚本之前删除文档上的委派事件
  • 试试:(我在这里猜)

    说明:

    每次运行rails.js时,都会将submit.rails事件添加到文档上的事件堆栈中。将html插入页面时,rails.js代码将运行。因此,我们首先取消对事件的委派,然后重新加载事件

    如前所述,我猜您的
    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>