如何使用不引人注目的jQuery使用onchange触发选择
假设我有一个普通表单,其中包含一个选择列表和一个提交按钮:如何使用不引人注目的jQuery使用onchange触发选择,jquery,ruby-on-rails,ruby-on-rails-3,Jquery,Ruby On Rails,Ruby On Rails 3,假设我有一个普通表单,其中包含一个选择列表和一个提交按钮: <%= form_for(@report :url => report_path) do |f| %> <%= f.select(:sort_by, options_for_select(Report.SORT_OPTIONS, @report.sort_by)) %> <%= f.submit 'sort' %> <% end %> 那么,将javascript直接插入.
<%= form_for(@report :url => report_path) do |f| %>
<%= f.select(:sort_by, options_for_select(Report.SORT_OPTIONS, @report.sort_by)) %>
<%= f.submit 'sort' %>
<% end %>
那么,将javascript直接插入.html.erb文件是否被认为是正确的呢?或者最好将其放在一个单独的.js文件中,如果是这样,那么对.js文件进行参数化和命名的约定是什么
对于一些信誉点,有人能告诉我和所有其他Tyro如何做到这一点吗?我不熟悉Ruby on Rails,因此您可能需要更改选择器,但总体思路是:
$("#formId input[type='submit']").hide(); //Make the submit button invisible
$("#formId select.selectClass").change( function() {
$(this).closest("form").submit(); //Trigger the submit event on the parent form.
});
看起来您可以这样设置id:
:html => {:id => 'formId', :method => :put }
我不熟悉Ruby on Rails,因此您可能需要更改选择器,但总体思路是:
$("#formId input[type='submit']").hide(); //Make the submit button invisible
$("#formId select.selectClass").change( function() {
$(this).closest("form").submit(); //Trigger the submit event on the parent form.
});
看起来您可以这样设置id:
:html => {:id => 'formId', :method => :put }
Rails将字符串化您正在使用的对象和属性,因此选择菜单将具有
id=“report\u sort\u by”
。这意味着您可以使用:
var $select = $('#report_sort_by'),
$form = $select.closest('form');
// preserve the button's name/value attributes, if Rails has assigned them
$('[type="submit"]', $form).hide();
$select.change(function() {
$form.submit();
});
如果您希望以健壮、不引人注目的方式包含此代码,可以创建一个名为MyProject.Report.js的文件,并将此代码放入其中:
if (!MyProject) var MyProject = {};
MyProject.Report = {
init: function() {
var $select = $('#report_sort_by'),
$form = $select.closest('form');
// preserve the button's name/value attributes, if Rails has assigned them
$('[type="submit"]', $form).hide();
$select.change(function() {
$form.submit();
});
}
}
然后在.erb文件中(在表单的底部之后),可以添加MyProject.Report.init()
然后,当然,添加javascript\u include\u标记
以包含JS文件本身
有许多不同的方法可以实现名称空间和封装。我上面描述的MyProject.Report
对象的主要优点是非常简单。随着代码的增长,您只需在MyProject.Report
对象中添加新功能,如:
MyProject.Report = {
init: function(options) {
// some event handlers, maybe
this.complication(null, null, options.data);
this.reusable(options.bgcolor);
},
complication: function(a, b, c) {
// stuff that's tough to look at
this.reusable(b);
},
reusable: function(q) {
// code that's used multiple places
}
}
然后,你基本上会对此进行破解,直到你有足够的知识来决定你是否需要一个像backbone.js这样的框架来完成一个给定的项目:)Rails会对你正在使用的对象和属性进行字符串化,所以选择菜单会有
id=“report\u sort\u by”
。这意味着您可以使用:
var $select = $('#report_sort_by'),
$form = $select.closest('form');
// preserve the button's name/value attributes, if Rails has assigned them
$('[type="submit"]', $form).hide();
$select.change(function() {
$form.submit();
});
如果您希望以健壮、不引人注目的方式包含此代码,可以创建一个名为MyProject.Report.js的文件,并将此代码放入其中:
if (!MyProject) var MyProject = {};
MyProject.Report = {
init: function() {
var $select = $('#report_sort_by'),
$form = $select.closest('form');
// preserve the button's name/value attributes, if Rails has assigned them
$('[type="submit"]', $form).hide();
$select.change(function() {
$form.submit();
});
}
}
然后在.erb文件中(在表单的底部之后),可以添加MyProject.Report.init()
然后,当然,添加javascript\u include\u标记
以包含JS文件本身
有许多不同的方法可以实现名称空间和封装。我上面描述的MyProject.Report
对象的主要优点是非常简单。随着代码的增长,您只需在MyProject.Report
对象中添加新功能,如:
MyProject.Report = {
init: function(options) {
// some event handlers, maybe
this.complication(null, null, options.data);
this.reusable(options.bgcolor);
},
complication: function(a, b, c) {
// stuff that's tough to look at
this.reusable(b);
},
reusable: function(q) {
// code that's used multiple places
}
}
然后,您基本上会对此进行黑客攻击,直到您有足够的知识来决定是否需要一个像backbone.js这样的框架来完成一个给定的项目:)对于简单的jQuery代码,这是有意义的。我正在尝试将所有部分缝合在一起,即RoR是否为我可以在jQuery代码中使用的表单生成定义良好的id或类,我是否应该使用RoR:remote选项,等等。如果没有人在几天内给出完整的答案,我也会给您打勾。谢谢直截了当的jQuery代码的要点——这很有意义。我正在尝试将所有部分缝合在一起,即RoR是否为我可以在jQuery代码中使用的表单生成定义良好的id或类,我是否应该使用RoR:remote选项,等等。如果没有人在几天内给出完整的答案,我也会给您打勾。谢谢酷豆-我可以看到生成的#报告(按标签排序)和所有内容。但是为了说明我的无知:您是否将.js代码放在public/javascripts/application.js中,然后将
放在您想要的视图中?或者有更干净的方法吗?顺便说一下,行$('[type=“submit”]',$form).attr('type','hidden')代码>给我一个错误:未捕获类型属性无法更改
,但当我将其更改为简单隐藏时,它起作用,如$('[type=“submit”]',$form).hide()
。有关更多信息,请参阅对原始帖子的编辑…感谢您对错误的提醒。我在回答中改变了这一点。您将代码放在哪里主要是哲学的,对于这么小的代码片段来说,这是相当学术的。您将其放入application.js的解决方案很好(比放入.erb或.rhtml文件要好,至少对于任何实际大小的js代码来说都是如此),尽管我可能认为application.js应该只包含全局代码,而且由于此代码针对的是可能只存在于单个页面上的选择菜单的特定ID,如果你想有点过火,用简单的名称空间建立一个框架,以后可以添加到其中,你可以创建一个名为Report.js或YourProjectAcronym.Report.js的文件,并将代码放在其中。我在上面的答案中添加了这个想法,因为我似乎无法在注释中正确地执行缩进代码。谢谢更新!因此,如果我真的想做得对,我会创建public/javascripts/autotrigger_selection.js
,并修改js代码以查找。。。包装整个表单。然后,我将使用javascript\u include\u标记
将该文件加载到我想要创建此行为的任何文件中。同意?酷豆-我可以看到生成的#报告(按标签排序)和所有内容。但是为了说明我的无知:您是否将.js代码放在public/javascripts/application.js中,然后将
放在您想要的视图中?或者有更干净的方法吗?顺便说一下,行$('[type=“submit”]',$form).attr('type','hidden')代码>给我一个错误:未捕获类型属性无法更改
,但当我将其更改为简单隐藏时,它起作用,如$('[type=“submit”]',$form).hide()
。有关更多信息,请参阅对原始帖子的编辑…感谢您对错误的提醒。我在回答中改变了这一点。你把代码放在哪里主要是哲学的,而且对于一个学生来说是相当学术的