Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.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
Javascript rails表单:当在另一个字段中选择特定选项时,如何模糊字段_Javascript_Ruby On Rails_Forms - Fatal编程技术网

Javascript rails表单:当在另一个字段中选择特定选项时,如何模糊字段

Javascript rails表单:当在另一个字段中选择特定选项时,如何模糊字段,javascript,ruby-on-rails,forms,Javascript,Ruby On Rails,Forms,这将是我第一次尝试javascript。当有人在选择列表中选择某个特定选项时,我希望表单中的另一个字段变得单调,因为它不再适用。我想我必须编写一个onchange事件处理程序,让它执行一个javascript脚本,该脚本检测所选选项,并在选项被选中时呈现带有相关字段的表单,或者在选择不同选项时呈现不同的表单。。。任何人都可以给我一个开始,请~谢谢你可以试试这样的东西: $(document).on('blur', "selector", function (e) { // do what

这将是我第一次尝试javascript。当有人在选择列表中选择某个特定选项时,我希望表单中的另一个字段变得单调,因为它不再适用。我想我必须编写一个onchange事件处理程序,让它执行一个javascript脚本,该脚本检测所选选项,并在选项被选中时呈现带有相关字段的表单,或者在选择不同选项时呈现不同的表单。。。任何人都可以给我一个开始,请~谢谢

你可以试试这样的东西:

$(document).on('blur', "selector", function (e) { 
  // do what you want to do, change background, color, etc...
});
<%= f.select :state, [['NSW'], ['VIC'], ['SA'], ['WA'], ['QLD']] %>
而不是需要更改的元素的类、id或其他选择器中的选择器类型

您可以将此代码段添加到app/assets/javascripts/application.js中包含的任何javascript文件中。你可以创建一个新的,并添加到那里,如果没有一个现有的适合你

如果application.js以/=require_树结尾。这意味着它将需要该目录中的所有文件,而您不需要手动要求它们

顺便说一句,关于术语,元素在单击时具有焦点。当元素失去焦点时(例如,单击其他元素或按下tab键),它会变得模糊。这是当“模糊”被调用的时候

以下是您如何为选择项写入“更改”:

$(document).on('change', 'select', function (e) {
  // do something
});
您需要输入正确的选择器,而不是“选择”,否则每次选择更改时都会触发该选择器

我需要仅当我在 选择列表被选中

没问题,试试这个:

$(document).on('change', 'select', function (e) {
  if ($(this).val() == 'specific_value'){
    // do something
  }
});
更新

我想从我的视图调用jquery并替换元素 在带有jquery filename.js.erb文件输出的视图中

jQuery和所有其他javascript都在客户端web浏览器中执行,您的文件filename.js.erb位于服务器上,需要rails处理

这是如何做到的:

ajax请求被发送到服务器 它被rails接收,并被路由到控制器 它由控制器操作处理 javascript视图作为响应呈现和发布 有两种方法可以实现这一点。首先,我将解释这两种方法的共同步骤

您需要在routes.rb中添加一个新路由,该路由将用作ajax调用的端点。您可以阅读更多关于向rails添加路由的内容,但是为了回答这个问题,我将使用这个简单的路由,并使用一个哑名称,您应该更改它:

resource :my_ajax, only: :create
这就是路线的样子:

rake routes|grep my_ajax
# my_ajax POST    /my_ajax(.:format)   my_ajaxes#create
它希望您拥有MyAjaxesController,并在其中创建操作。还应通过将以下内容添加到控制器中,使控制器能够响应javascript请求:

class MyAjaxesController < AdminController
  # ...
  respond_to :js
  # ...

  def create
    # ...
  end
end
当浏览器接收到对ajax请求的响应时,它只是用该部分所呈现的html替换元素的内容

好的,现在来谈谈不同的方法

您可以通过jQuery发送一个ajax请求,目标是使用该方法创建的端点,即我创建的路由。在这种情况下,您需要手动管理收到的任何响应

然而,有一种rails方法可以做到这一点。您可以创建一个表单,隐藏其所有字段—您在视图中不需要它,您只需要它作为发送请求的手段。您需要为表单、方法指定操作,还需要设置remote:true,以确保它是异步提交的

下面是一个例子:

<%= form_tag(my_ajax_path, remote: true, method: :post) do %>
  <%= hidden_field_tag :some_field %>
<% end %>
对于rspec测试控制器操作,为了使其工作,不要忘记控制器期望和呈现的是javascript请求,因此需要指定格式:

it 'my test' do
  # expectations
  response = post :my_ajax, format: :js
  # assertions
end
您可以使用jquery的change事件来实现这一点。 例如,您的选项选择如下:

$(document).on('blur', "selector", function (e) { 
  // do what you want to do, change background, color, etc...
});
<%= f.select :state, [['NSW'], ['VIC'], ['SA'], ['WA'], ['QLD']] %>
然后,您必须创建jquery事件来执行下一个操作。例如:

<script>
  $(document).ready(function(){ 
   // hidding form
   $("#form_1").hide();
   $("#form_2").hide();
   // showing form after user changes the select option
    $("#user_state").change(function(){
      var selected = $(this).val();
      if(selected == "VIC") {
        $("#form_1").show();
      } else {
        $("#form_2").show();
      }
    });
  });
</script>

我希望这能帮助您尝试jquery的第一次体验。祝你好运

谢谢。。。我只需要在选择列表中的特定值被选中时触发该操作hanks,而不是加载一个全新的表单页面,我只想使用字段的标签explainion将包含解释字段的部分呈现到表单中,因此我尝试了此操作,但它不起作用$explainion.on'change'、'reason',函数e{如果$this.val=='我无法解释'{render'只读\解释\字段'}};在我看来,您不能通过javascript呈现rails部分。使用jquery,您可以冷调用$'element'.html'…'并替换其内容,但您不能调用render。为此,您需要向rails发送远程请求,并在javascript视图中执行。您希望我用一个示例更新答案吗?