代码之家  ›  专栏  ›  技术社区  ›  Ganesh Shankar

将onchange事件附加到Rails中的选择列表

  •  1
  • Ganesh Shankar  · 技术社区  · 14 年前

    我想在Rails中的选择列表中添加一个简单的onchange事件。我该怎么做?

    这是选择框代码:

    = f.select(:question_type_id, QuestionType.all.collect {|qt| [ qt.name, qt.id ]}, { :include_blank => "Please Select a Question Type" })
    

    onchange事件应该调用一个函数fillanswerNumber(),它获取当前选定的值,并根据结果向另一个选择列表添加一组选项。

    编辑:我意识到我实际上需要一个onchange事件…

    3 回复  |  直到 13 年前
        1
  •  5
  •   Toby Hede    14 年前

    使用jquery,我将在客户机上绑定事件(在文档加载时)。

    $("#select_id").onclick(function(){});
    

    除了显式地定义一个ID(但是如果使用表单生成器,Rails将为您提供一个ID),您不需要在Rails内部执行任何操作来完成此工作。

        2
  •  2
  •   Ganesh Shankar    14 年前

    我想我知道了…多亏了一些这样的答案和一些方便的博客文章。

    这就是我要的。我的选择如下:

    = f.select(:question_type_id, QuestionType.all.collect {|qt| [ qt.name, qt.id ]}, { :include_blank => "Please Select a Question Type" }, :onchange => "fillAnswerNumber();")
    

    我的javascript(jquery)代码如下:

    :javascript
      function fillAnswerNumber(){
        var question_type_name = $("#question_question_type_id :selected").text()
        if(question_type_name == "Single Input"){
          $("#answer_number")
            .find('option')
            .remove()
            .end()
            .append($('<option selected="selected"></option>').val("1").html("1"))
            .append($('<option></option>').val("2").html("2"))
            .append($('<option></option>').val("3").html("3"))
            .append($('<option></option>').val("4").html("4"))
          ;
        }else if(question_type_name == "Multiple Choice"){
           $("#answer_number")
            .find('option')
            .remove()
            .end()
            .append($('<option></option>').val("3").html("3"))
            .append($('<option selected="selected"></option>').val("4").html("4"))
            .append($('<option></option>').val("5").html("5"))
            .append($('<option></option>').val("6").html("6"))
          ;
        }
      }
    
        3
  •  1
  •   Gagan    13 年前

    我想您需要添加jquery live来观察selectbox的变化,并发送ajax请求来获取结果并将结果填充到另一个selectox中。

    伪代码可能如下所示

    $('#question_type_id').live('change',function(){
    $.ajax({
        url: url_to_fetch_result,
        success: function(responseData) {
          populate your next select depending your resposeData here
        }
    });
    

    使用Live的好处是,即使稍后动态加载$(‘question _type _id’)选择框,也会触发选择框更改事件。

    希望这有帮助