使用jQuery和JSON填充表单?

我想知道如何使用JSON填充表单是否可行?

我有一个JSON字符串,我使用php的json_encode()我想使用JSON字符串来填充表单控件(如textarea或文本输入)。

如何在不使用外部插件的情况下实现此类function(如jQuery populate插件,我看到了)。

编辑:JSON格式:

 [{"id":"41","parent_id":null,"node_name":"name","slug":"","lft":"3","rgt":"4"}] 

这是我从json_encode()得到的

这里有textarea的问题,然后我将其更改为默认的开关值

使用此选项可将值分配给多个控件:

 function populate(frm, data) { $.each(data, function(key, value) { var ctrl = $('[name='+key+']', frm); switch(ctrl.prop("type")) { case "radio": case "checkbox": ctrl.each(function() { if($(this).attr('value') == value) $(this).attr("checked",value); }); break; default: ctrl.val(value); } }); } 

对于文本控件(即没有无线电或复选框),您可以创建一个简单版本的填充函数:

 function populate(frm, data) { $.each(data, function(key, value){ $('[name='+key+']', frm).val(value); }); } 

用法示例:

 populate('#MyForm', $.parseJSON(data)); 

演示: http : //jsfiddle.net/Guffa/65QB3/3/

谢谢Nowshath。 它对我有用。 我在您的版本中添加了额外的检查,以便能够填充选择选项。

 function populateForm(frm, data) { $.each(data, function(key, value){ var $ctrl = $('[name='+key+']', frm); if($ctrl.is('select')){ $("option",$ctrl).each(function(){ if (this.value==value) { this.selected=true; } }); } else { switch($ctrl.attr("type")) { case "text" : case "hidden": case "textarea": $ctrl.val(value); break; case "radio" : case "checkbox": $ctrl.each(function(){ if($(this).attr('value') == value) { $(this).attr("checked",value); } }); break; } } }); }; // end of populateForm() function 

几乎没有改进(单选按钮除外):

 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; } } }); }; 

如果有人想要从多维json格式填充,例如$ .serializeJSON [ https://github.com/marioizquierdo/jquery.serializeJSON ]的结果,这里是一个转换为平面格式的函数。

 function json2html_name_list(json, result, parent){ if(!result)result = {}; if(!parent)parent = ''; if((typeof json)!='object'){ result[parent] = json; } else { for(var key in json){ var value = json[key]; if(parent=='')var subparent = key; else var subparent = parent+'['+key+']'; result = json2html_name_list(value, result, subparent); } } return result; } 

使用上述函数的示例:

 populateForm($form, json2html_name_list(json)) 

以上所有例子:

 var $ctrl = $('[name='+key+']', frm); 

需要改为

 var $ctrl = $('[name="'+key+'"]', frm); 

使用jQuery防止语法错误

注意列表数组必须用数字(例如fruit [0]而不是fruit [])编写,以便使用此函数。

这是@Nowshath答案的附录

这也适用于多级对象

  populateForm(form, data) { $.each(data, function(key, value) { if(value !== null && typeof value === 'object' ) { this.populateForm(form, value); } else { var ctrl = $('[name='+key+']', form); switch(ctrl.prop("type")) { case "radio": case "checkbox": ctrl.each(function() { $(this).prop("checked",value); }); break; default: ctrl.val(value); } } }.bind(this)); } 

这可能变得非常复杂。 最好使用工具来解析您的JSON。 您可以非常轻松地创建简单表单,但仍需要解析它。

请改为检查此插件: http : //neyeon.com/2011/01/creating-forms-with-json-and-jquery/

或者你可以使用ext4。

对于一个奇怪但有效的JSON语法,如

  [{'name':,'value':}, {'name':,'value':}, {'name':,'value':}, {'name':,'value':}] 

看看这个http://jsfiddle.net/saurshaz/z66XF/

我们在我们的应用程序中使用了这种奇怪的语法,我们通过编写上面的逻辑来解决这个问题。

我发现原始脚本与array []名称不兼容,因为名称选择器中缺少引号:

 var $ctrl = $('[name="'+key+'"]', frm); 

我有同样的问题,并进一步开发了上面显示的版本。 现在可以使用返回值的单个复选框以及返回名称数组的组。 编码经过测试,使用和正常工作。

  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