Is there a way to dynamically ajax add elements through jquery chosen plugin?

后端 未结 8 1595
南旧
南旧 2020-12-15 06:50

I am trying to use \"Chosen\" plugin by harvest (http://harvesthq.github.com/chosen/) and it works for the static set of options I am passing. However, what I want is that w

相关标签:
8条回答
  • 2020-12-15 07:01

    You don't need to much stress , keep it simple. You need to add your ajax response in select box html and then update chosen.

    This will look like..

    Code:

    var baseURL='Your Url';
    
     $.ajax({
    
               type: "POST",
    
               url: baseURL+"Your function", //enter path for ajax
    
               data: "id="+id,   //pass any details
    
               success: function(response){   //get response in json_encode()formate
                      
                     var json_data = JSON.parse(response);
    
                      var i=0; var append='';
    
                      if((json_data['catss_data'].length > 0)){
    
                          for(i=0;i < json_data['response_data'].length; i++){
    
                              append+="<option value='"+json_data['response_data'][i].category_name+"'>"+json_data['response_data'][i].category_name+"</option>";
                                       // make response formate in option 
    
                            }
    
                        $('#(selectbox-id)').html(append);   // enter select box id and append data in it
    
                         }
    
                     }
    
               $("#(selectbox-id)").trigger("chosen:updated");  // enter select box id and update chosen
    
       });   
    
    0 讨论(0)
  • 2020-12-15 07:07

    I've just been doing this. I didn't like Shreeni's line for setting selected (no offence) so i went with

    $('#tagSelection').append(
        $('<option></option>')
            .val(data.Item.Id)
            .html(data.Item.Value)
            .attr("selected", "selected"));
    $("#tagSelection").trigger("liszt:updated");
    

    which i personally think is a bit cleaner (tested with multiselect box and it works fine)

    0 讨论(0)
  • 2020-12-15 07:11

    These are the complete set of changes I did to the chosen plugin (jquery version) to solve this problem

    Chosen.prototype.choice_build = function(item) {
      this.new_term_to_be_added = null; 
      // ....
    };
    
    Chosen.prototype.no_results = function(terms) {
      // ....
      no_results_html.find("span").first().html(terms);
      this.new_term_to_be_added = terms;
      return this.search_results.append(no_results_html);
    };
    
    
    Chosen.prototype.keydown_checker = function(evt) {
           // ...
            case 13:
              if(this.new_term_to_be_added != null &&  this.options.addNewElementCallback != null) {
                  var newElement = this.options.addNewElementCallback(this.new_term_to_be_added);
    
    
                  if(newElement!=null && newElement.length == 1) {
                      // KEY TO SOLVING THIS PROBLEM
                      this.result_highlight = newElement;
                      // This will automatically trigger the change/select events also. 
                      // Nothing more required.
                      this.result_select(evt);
                  }
                  this.new_term_to_be_added = null;
              }
              evt.preventDefault();
              break;
              // ...
    };
    

    The this.new_term_to_be_added maintains the currently typed string which is not among the pre-defined options.

    The options.addNewElementCallback is the callback to the calling function to allow them to process it (send it to server etc.) and it has to be synchronous. Below is the skeleton:

    var addTagCallback = function(tagText) {
        var newElement = null;
        $.ajax({url : that.actionUrl, 
            async : false, 
            dataType: "json",
            data : { // ....},
            success : function(response) {
            if(response) {
                                $('#tagSelection').append(
                                    $('<option></option>')
                                          .val(data.Item.Id)
                                          .html(data.Item.Value)
                                          .attr("selected", "selected"));
                $("#tagSelection").trigger("liszt:updated");
                // Get the element - will necessarily be the last element - so the following selector will work
                newElement = $("#tagSelection_chzn li#tagSelection_chzn_o_" + ($("#tagSelection option").length - 1));
            } else {
                // Handle Error
            }
        }});
        return newElement;
    };
    

    The newElement is a jquery element - the latest added li object to list of options.

    By doing this.result_highlight = newElement; and this.result_select(evt); I tell the Chosen plugin to select this. This works whether it is a single select or a multi-select. Rifky's solution will work only for single select.

    0 讨论(0)
  • 2020-12-15 07:12

    A fork containing the feature you want has been created here. This fork is referred to as the koenpunt fork.

    You can follow through the discussion for this feature on the harvesthq github site

    • https://github.com/harvesthq/chosen/pull/506
    • https://github.com/harvesthq/chosen/pull/320
    • https://github.com/harvesthq/chosen/pull/166

    My summary of what happened:

    1. Many people want this feature
    2. A few people have created pull-requests with a proposed solution
    3. The best solution is pull-request 166
    4. The author of 'chosen' decided he won't include the feature
    5. koenpunt (the author of pull-request 166) created a fork of 'chosen'
    6. People have started abandoning the harvesthq version of 'chosen' in favor of the koenpunt fork
    0 讨论(0)
  • 2020-12-15 07:15

    I do it simply this way and it works perfectly:

    // this variable can be filled by an AJAX call or so
    var optionsArray = [ 
        {"id": 1, "name": "foo"}, 
        {"id": 2, "name": "bar"}
    ];
    
    var myOptions = "<option value></option>";
    for(var i=0; i<optionsArray.length; i++){
        myOptions +=  '<option value="'+optionsArray[i].id+'">'+optionsArray[i].name+'</option>';
    }
    
    // uses new "chosen" names instead of "liszt"
    $(".chosen-select").html(myOptions).chosen().trigger("chosen:updated");
    
    0 讨论(0)
  • 2020-12-15 07:17

    i think its not the best practice but this code works for me. data return has a html tag<option>

    $.post("url.php",{data:data},function(data){
    $('.choosen').empty().append(data);
    $(".choosen").trigger("liszt:updated");
    });
    
    0 讨论(0)
提交回复
热议问题