Using jQuery and JSON to populate forms?

前端 未结 10 1012
忘掉有多难
忘掉有多难 2020-12-04 10:41

I was wondering how is it popssible to populate forms using JSON?

I have a JSON string which I get using php\'s json_encode() And I want to use the JSON

相关标签:
10条回答
  • 2020-12-04 11:25

    This can get pretty complicated. It's best to use a tool to parse your JSON. You can create simple forms pretty easily, but you still need to parse it.

    Check this plugin out instead: http://neyeon.com/2011/01/creating-forms-with-json-and-jquery/

    Or you can use ext4.

    0 讨论(0)
  • 2020-12-04 11:28

    With little improvements (except radio buttons):

    function resetForm($form)
    {
        $form.find('input:text, input:password, input:file, select, textarea').val('');
        $form.find('input:radio, input:checkbox').removeAttr('checked').removeAttr('selected');
    }
    
    function populateForm($form, data)
    {
        resetForm($form);
        $.each(data, function(key, value) {
            var $ctrl = $form.find('[name='+key+']');
            if ($ctrl.is('select')){
                $('option', $ctrl).each(function() {
                    if (this.value == value)
                        this.selected = true;
                });
            } else if ($ctrl.is('textarea')) {
                $ctrl.val(value);
            } else {
                switch($ctrl.attr("type")) {
                    case "text":
                    case "hidden":
                        $ctrl.val(value);   
                        break;
                    case "checkbox":
                        if (value == '1')
                            $ctrl.prop('checked', true);
                        else
                            $ctrl.prop('checked', false);
                        break;
                } 
            }
        });
    };
    
    0 讨论(0)
  • 2020-12-04 11:30

    I had the same problem and have developed the version shown above a little further. Now it is possible to have individual checkboxes that return the value as well as groups that returns an array of names. The coding is tested, used and working correctly.

            function populateForm($form, data)
            {
                //console.log("PopulateForm, All form data: " + JSON.stringify(data));
    
                $.each(data, function(key, value)   // all json fields ordered by name
                {
                    //console.log("Data Element: " + key + " value: " + value );
                    var $ctrls = $form.find('[name='+key+']');  //all form elements for a name. Multiple checkboxes can have the same name, but different values
    
                    //console.log("Number found elements: " + $ctrls.length );
    
                    if ($ctrls.is('select')) //special form types
                    {
                        $('option', $ctrls).each(function() {
                            if (this.value == value)
                                this.selected = true;
                        });
                    } 
                    else if ($ctrls.is('textarea')) 
                    {
                        $ctrls.val(value);
                    } 
                    else 
                    {
                        switch($ctrls.attr("type"))   //input type
                        {
                            case "text":
                            case "hidden":
                                $ctrls.val(value);   
                                break;
                            case "radio":
                                if ($ctrls.length >= 1) 
                                {   
                                    //console.log("$ctrls.length: " + $ctrls.length + " value.length: " + value.length);
                                    $.each($ctrls,function(index)
                                    {  // every individual element
                                        var elemValue = $(this).attr("value");
                                        var elemValueInData = singleVal = value;
                                        if(elemValue===value){
                                            $(this).prop('checked', true);
                                        }
                                        else{
                                            $(this).prop('checked', false);
                                        }
                                    });
                                }
                                break;
                            case "checkbox":
                                if ($ctrls.length > 1) 
                                {   
                                    //console.log("$ctrls.length: " + $ctrls.length + " value.length: " + value.length);
                                    $.each($ctrls,function(index) // every individual element
                                    {  
                                        var elemValue = $(this).attr("value");
                                        var elemValueInData = undefined;
                                        var singleVal;
                                        for (var i=0; i<value.length; i++){
                                            singleVal = value[i];
                                            console.log("singleVal : " + singleVal + " value[i][1]" +  value[i][1] );
                                            if (singleVal === elemValue){elemValueInData = singleVal};
                                        }
    
                                        if(elemValueInData){
                                            //console.log("TRUE elemValue: " + elemValue + " value: " + value);
                                            $(this).prop('checked', true);
                                            //$(this).prop('value', true);
                                        }
                                        else{
                                            //console.log("FALSE elemValue: " + elemValue + " value: " + value);
                                            $(this).prop('checked', false);
                                            //$(this).prop('value', false);
                                        }
                                    });
                                }
                                else if($ctrls.length == 1)
                                {
                                    $ctrl = $ctrls;
                                    if(value) {$ctrl.prop('checked', true);}
                                    else {$ctrl.prop('checked', false);}
    
                                }
                                break;
                        }  //switch input type
                    }
                }) // all json fields
            }  // populate form
    
    0 讨论(0)
  • 2020-12-04 11:33

    I found the original script didn't play nice with array[] names because of missing quotes in the name selector:

    var $ctrl = $('[name="'+key+'"]', frm); 
    
    0 讨论(0)
提交回复
热议问题