【问题标题】:Jquery doesn't seem to locate DOM elements in Simple_formJquery 似乎没有在 Simple_form 中找到 DOM 元素
【发布时间】:2013-07-11 10:26:07
【问题描述】:

我正在尝试使用 jQuery,以便根据单击的单选按钮显示不同的部分或表单。我首先使用 JSFiddle 让它在一个普通的 vanilla 表单上工作,一切看起来都很好,但是当我将相同的代码逻辑应用于使用 simple_form gem 的 rails 应用程序时,似乎没有任何工作。

在下面查看我的代码

$("input[type=radio]").click(function(){
    if ($('input[name=usertype]:checked').val() == "User A") {
        $("#one").slideDown("fast");
        $("#two").slideUp("fast");
        $("#three").slideUp("fast");
        $("#four").slideUp("fast");
    }
    if ($('input[name=usertype]:checked').val() == "User B") {
        $("#two").slideDown("fast");
        $("#one").slideUp("fast");
        $("#three").slideUp("fast");
        $("#four").slideUp("fast");
    }
    if ($('input[name=usertype]:checked').val() == "User B") {
        $("#three").slideDown("fast");
        $("#two").slideUp("fast");
        $("#one").slideUp("fast");
        $("#four").slideUp("fast");
    }
    if ($('input[name=usertype]:checked').val() == "User B") {
        $("#four").slideDown("fast");
        $("#three").slideUp("fast");
        $("#two").slideUp("fast");
        $("#one").slideUp("fast");
    }
});

   <%= simple_form_for(resource, :as => resource_name, :html => { :class => 'form-horizontal' }, :url => registration_path(resource_name)) do |f| %>
    <%= f.input :email, placeholder: 'example@domain.com' %>
    <%= f.input :username %>
    <%= f.input :usertype, label: 'Which best describes you', :input_html => {:name => "usertype"}, :collection => ["User A", "User B", "User C", "User D"],
                as: :radio_buttons %>
    <ul id="one">
      <li><%= f.input :dob, label: 'Date of Birth', as: :date, start_year: Date.today.year - 90,
                  end_year: Date.today.year - 16,
                  order: [:day, :month, :year] %></li>
    </ul>
    <ul id="two">
      <li><%= f.input :launchedIn, label: 'Year club launched', as: :date, start_year: Date.today.year - 300,
                  end_year: Date.today.year, discard_day: true, discard_month: true, order: [:year] %></li>
    </ul>
    <ul id="three">
      <li><%= f.input :category, :collection => ["Football", "Golf", "Tennis", "Rugby"], prompt: 'Choose an Sport' %>
    </ul></li>
    <ul id="four">
      <li><%= f.input :bio, label: 'Tell us about you', hint: 'Maximum 300 characters' %></li>
    </ul>
    <%= f.input :password %>
    <%= f.input :password_confirmation %>
    <div><%= f.submit "Register", :class => 'btn btn-primary' %></div>
<% end %>

至少有四个版本的 JSFiddle 可以工作,但是没有一个可以在我的 rails 应用程序上工作。

感谢您对此的任何帮助,因为我的压力球只能承受这么多:-)

非常感谢

基兰

【问题讨论】:

    标签: jquery ruby-on-rails simple-form


    【解决方案1】:

    您的脚本似乎没有在 dom 下准备好。在 dom 中添加你的脚本准备好了,它应该可以工作

    jQuery(function($){
        $("input[type=radio]").click(function(){
            var val = $('input[name=usertype]:checked').val();
            if (val == "User A") {
                $("#one").slideDown("fast");
                $("#two").slideUp("fast");
                $("#three").slideUp("fast");
                $("#four").slideUp("fast");
            } else if (val == "User B") {
                $("#two").slideDown("fast");
                $("#one").slideUp("fast");
                $("#three").slideUp("fast");
                $("#four").slideUp("fast");
            } else if (val == "User B") {
                $("#three").slideDown("fast");
                $("#two").slideUp("fast");
                $("#one").slideUp("fast");
                $("#four").slideUp("fast");
            } else  if (val == "User B") {
                $("#four").slideDown("fast");
                $("#three").slideUp("fast");
                $("#two").slideUp("fast");
                $("#one").slideUp("fast");
            }
        });
    });
    

    你也可以试试

    jQuery(function($) {
        var usertypes = $('input[name=usertype]'), uis = $('#one, #two, #three, #four'), valueMap = {
            "User A" : $('#one'),
            "User B" : $('#two'),
            "User C" : $('#three'),
            "User D" : $('#four')
        };
        $("input[type=radio]").click(function() {
            var val = usertypes.filter(':checked').val(), ui = valueMap[val];
            uis.not(ui).slideUp("fast");
            ui.slideDown("fast");
        });
    });
    

    演示:Fiddle

    【讨论】:

    • 下面的回复最终解决了我的问题,感谢您抽出宝贵时间提供帮助,尽管您的反馈非常有用
    【解决方案2】:

    假设您使用 Rails 3.2 或更新版本,...尝试:

    1. 检查应用生成的JS是否正确(包含你的代码)(html页面的源代码)
    2. 在应用此之前,您是否有机会运行rake assets:precompile? Rails 可能会选择你的 application.js 的预编译版本。如果是这样,请尝试rake assets:clean
    3. 确保您的 jQuery 在您拥有 JS/CoffeeScript 逻辑的文件之前加载
    4. 确保在处理逻辑的 JS/CoffeeScript 文件中使用 $(document).ready -&gt;

    【讨论】:

    • 感谢重新运行 rake 资产预编译工作...救济
    • 如果你像我一样使用版本控制工具(例如:git),还有一个建议:在开发时,我总是用rm -rf 删除我的public/assets 目录(所以我不使用t have to precompile each time I want to see changes) and than when I finish my changes I commit them and after that I checkout that dir git co public /assets` 将它们带回来。然后运行 ​​assets precompile 并提交。如果你没有使用任何版本控制工具,你真的应该研究一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 2011-05-09
    • 2017-11-13
    • 2013-09-02
    相关资源
    最近更新 更多