动态添加通过json创建的选择项
Dynamically addition of select item created via json
我必须使用json数组的选择值动态创建表行当我试图将select的id与我遇到错误的函数的调用连接起来时,行被添加到了行中,但其他下拉列表在下面的代码中不起作用。我正在附加jsfiddle的链接,在那里我没有遇到错误,只有select下拉列表nod在这里添加了额外的字段。如何解决错误以获得与链接相同的效果。
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
</head>
<body>
<h4> Honours Selection</h4>
<table class="tg" style="undefined;table-layout: fixed; width: 657px" id="customFields" >
<colgroup>
<col style="width: 222px">
<col style="width: 216px">
<col style="width: 219px">
<col style="width: 219px">
<col style="width: 219px">
<col style="width: 219px">
<col style="width: 219px">
<col style="width: 219px">
<col style="width: 219px">
<col style="width: 219px">
</colgroup>
<tr>
<th class="tg-hgcj" rowspan="2"><br>Honours</th>
<th class="tg-hgcj" colspan="4">General</th>
<th class="tg-hgcj" colspan="2">Bank Transaction Details</th>
<th class="tg-hgcj"rowspan="2" >Add More</th>
</tr>
<tr>
<td class="tg-093g">Sub1</td>
<td class="tg-093g">Sub2</td>
<td class="tg-093g">Sub3</td>
<td class="tg-093g">Sub4</td>
<td class="tg-093g">Bank Transaction id</td>
<td class="tg-093g">Bank Transaction date</td>
</tr>
<tr>
<td class="tg-30rh"><select name ="hons[]" id="select1"onchange="">
<option value="Hindi">Hindi</option>
<option value="Bengali">Bengali</option>
<option value="English">English</option>
</select>
<select id="ddl2" name="session[]">
</select>
</td>
<td class="tg-30rh"> <select name="sub1[]"id="select2">
</select>
</td>
<td class="tg-30rh"><select name="sub2[]"id="select3">
</select></td>
<td class="tg-30rh"><select name="sub3[]"id="select4">
</select></td>
<td class="tg-30rh"><select name="sub4[]"id="select5">
</select></td>
<td class ="tg-30rh"><input type="text" name="tran_id[]"></td>
<td class ="tg-30rh"><input type="text" name="tran_date[]"></td>
<td><a href="javascript:void(0);" class="addCF">Add</a></td>
</tr>
</table>
</body>
</html>
<script>
$(document).ready(function(){var x=2;
$(".addCF").click(function(){
$("#customFields").append('<tr>'
<td class="tg-30rh"><select name ="hons[]" id='+'select1'+x+' onchange="updateSelect(this.id);">'
<option value="Hindi">Hindi</option>'
<option value="Bengali">Bengali</option>'
<option value="English">English</option>'
</select>'
<select id="ddl2" name="session[]">'
</select>'
</td>'
<td class="tg-30rh"> <select name="sub1[]" id='+'select2'+x+'>'
</select>'
</td>'
<td class="tg-30rh"><select name="sub2[]" id='+'select3'+x+'>'
</select></td>'
<td class="tg-30rh"><select name="sub3[]" id='+'select4'+x+'>'
</select></td>'
<td class="tg-30rh"><select name="sub4[]" id='+'select4'+x+'>'
</select></td>'
<td class ="tg-30rh"><input type="text" name="tran_id[]"></td>'
<td class ="tg-30rh"><input type="text" name="tran_date[]"></td>'
<td><a href="javascript:void(0);" class="remCF">Remove</a></td>'
</tr>');x++;
});
$("#customFields").on('click','.remCF',function(){
$(this).parent().parent().remove();
});
});
var jsonObj = {"Hindi":[["History","Sociology","Economics"],"Philosophy","Political Science","English"],"Bengali":[["History","Sociology"],"Sanskrit","Philosophy","Political Science"],"English":[["History","Sociology","Economics"],"Philosophy","Political Science",["Bengali","Hindi"]],"History ":["Philosophy"," Political Science",["Bengali"," Hindi"]," English"],"Political Science":[[" History "," Sociology"," Economics"],"Philosophy",["Bengali "," Hindi"],"English"],"Philosophy":[[" History"," Sociology"]," Sanskrit","Political Science",["Bengali","Hindi"]]}
function updateSelect(id) {
//alert("#"+id+"1");
var getOpts = function(raw){
var values = raw;
if (!(raw instanceof Array)){
values = [raw, ""];
}
var result = [];
values.forEach(function(obj){
result.push(new Option(obj, obj));
});
return result;
};
var newKey = $("#"+id+"1").val();
var mappings = [{"#"+id+"2":0},{"#"+id+"3":1},{"#"+id+"4":2},{"#"+id+"5":3}];//getting error in this line SyntaxError: missing : after property id var mappings = [{"#"+id+"2":0},{"#"+id+"3":1}, {"#"+id+"4":2},//{"#"+id+"5":3} ]; near +
var selected = jsonObj[newKey];
mappings.forEach(function(mapping){
var selector = Object.keys(mapping)[0];
var index = mapping[selector];
$(selector).empty();
var opts = getOpts(selected[index]);
$(selector).append(opts);
});
}
$(document).ready(function() {
$("#select1").change(updateSelect);
updateSelect(); // For initial page load.
});
</script>
这是因为你有一个拼写错误,请格式化你的代码,然后决定是否需要提问。
var mappings = [{"#"+id+"2":0},{"#"+id+"3":1},{"#"+id+"4":2},{"#"+id+5":3}];//getting error in this line
格式化代码
var mappings = [
{"#"+id+"2":0},
{"#"+id+"3":1},
{"#"+id+"4":2},
{"#"+id+5":3} // <- Do you see the error now?
];
固定
var mappings = [
{"#"+id+"2":0},
{"#"+id+"3":1},
{"#"+id+"4":2},
{"#"+id+"5":3} // <- Fixed, you need to add the opening quote before the '5'.
];
我用叉子叉了你的JSFiddle,把它清理了一下:JSFiddle.net/b55ykec
更新
您需要构建映射,因为您无法生成与对象定义一致的动态密钥:
var mappings = [2, 3, 4, 5].reduce(function(map, val, index) {
var key = '#' + id + val;
map[key] = index;
return map;
}, {});
var selected = jsonObj[newKey];
$.each(mappings, function (selector, index) {
$(selector).empty().append(getOpts(selected[index]));
});
有些更改需要更改才能使代码正常工作。以下所有更改都是为了使底部的工作示例起作用。
- 我将所有内联样式移到了样式表中。您有许多相同的价值观,因此整合可以帮助您在未来更好地管理
- 我将
customFields
更改为custom-fields
。CSS类名和ID不应该是camelcase。单词通常用连字符分隔。这听起来可能有些迂腐,但它可以帮助您避免将它们与JavaScript变量混淆 - 我把
x
移到了全球范围。x
是一个静态值,每次添加新行时都应自动递增 - 您为每个动态行添加了两个"select4"ID。我把第二个改为"select5"
您生成的ID不够唯一,我添加了一个短划线来分隔列。
'<select name ="hons[]" id="' + 'select1-' + x + '">'
为了让所有新的选择框都能侦听更改事件,您需要将侦听器添加到父容器中,并侦听子容器上的更改。
$('#custom-fields').on('change', 'select[id^="select1-"]', updateSelect);
工作示例
var x = 1;
$(document).ready(function() {
$(".addCF").click(function() {
$("#custom-fields").append([
'<tr>',
'<td class="tg-30rh">',
'<select name ="hons[]" id="' + 'select1-' + x + '">',
'<option value="Hindi">Hindi</option>',
'<option value="Bengali">Bengali</option>',
'<option value="English">English</option>',
'</select> ',
'<select id="ddl2" name="session[]"></select>',
'</td>',
'<td class="tg-30rh">',
'<select name="sub1[]" id="select2-' + x + '"></select>',
'</td>',
'<td class="tg-30rh">',
'<select name="sub2[]" id="select3-' + x + '"></select>',
'</td>',
'<td class="tg-30rh">',
'<select name="sub3[]" id="select4-' + x + '"></select>',
'</td>',
'<td class="tg-30rh">',
'<select name="sub4[]" id="select5-' + x + '"></select>',
'</td>',
'<td class="tg-30rh">',
'<input type="text" name="tran_id[]" />',
'</td>',
'<td class ="tg-30rh">',
'<input type="text" name="tran_date[]" />',
'</td>',
'<td>',
'<a href="javascript:void(0);" class="remCF">Remove</a>',
'</td>',
'</tr>'
].join(''));
$('#select1-' + x).trigger('change');
x++;
});
$("#custom-fields").on('click', '.remCF', function() {
$(this).parent().parent().remove();
});
});
var jsonObj = {
"Hindi": [
["History", "Sociology", "Economics"], "Philosophy", "Political Science", "English"
],
"Bengali": [
["History", "Sociology"], "Sanskrit", "Philosophy", "Political Science"
],
"English": [
["History", "Sociology", "Economics"], "Philosophy", "Political Science", ["Bengali", "Hindi"]
],
"History ": ["Philosophy", " Political Science", ["Bengali", " Hindi"], " English"],
"Political Science": [
[" History ", " Sociology", " Economics"], "Philosophy", ["Bengali ", " Hindi"], "English"
],
"Philosophy": [
[" History", " Sociology"], " Sanskrit", "Political Science", ["Bengali", "Hindi"]
]
};
function updateSelect(e) {
var targetId = e.target.id;
var id = parseInt(targetId.match(/['w'd]+'-('d+)$/)[1], 10);
var getOpts = function(raw) {
raw = Array.isArray(raw) ? raw : [raw, ''];
return raw.map(function(obj) {
return new Option(obj, obj);
});
};
var newKey = $('#select1-' + id).val();
var mappings = [2, 3, 4, 5].reduce(function(map, val, index) {
var key = '#select' + val + '-' + id;
map[key] = index;
return map;
}, {});
var selected = jsonObj[newKey];
$.each(mappings, function (selector, index) {
$(selector).empty().append(getOpts(selected[index]));
});
}
$(document).ready(function() {
$('#custom-fields').on('change', 'select[id^="select1-"]', updateSelect);
$('#select1-0').trigger('change'); // For initial page load.
});
.col-wide {
width: 222px;
}
.col-narrow {
width: 216px;
}
.col-normal {
width: 219px;
}
#custom-fields {
table-layout: fixed;
width: 657px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<h4> Honours Selection</h4>
<table class="tg" id="custom-fields">
<colgroup>
<col class="col-wide" />
<col class="col-narrow" />
<col class="col-normal" />
<col class="col-normal" />
<col class="col-normal" />
<col class="col-normal" />
<col class="col-normal" />
<col class="col-normal" />
<col class="col-normal" />
<col class="col-normal" />
</colgroup>
<tr>
<th class="tg-hgcj" rowspan="2">
<br />Honours
</th>
<th class="tg-hgcj" colspan="4">General</th>
<th class="tg-hgcj" colspan="2">Bank Transaction Details</th>
<th class="tg-hgcj" rowspan="2">Add More</th>
</tr>
<tr>
<td class="tg-093g">Sub1</td>
<td class="tg-093g">Sub2</td>
<td class="tg-093g">Sub3</td>
<td class="tg-093g">Sub4</td>
<td class="tg-093g">Bank Transaction id</td>
<td class="tg-093g">Bank Transaction date</td>
</tr>
<tr>
<td class="tg-30rh">
<select name="hons[]" id="select1-0" onchange="">
<option value="Hindi">Hindi</option>
<option value="Bengali">Bengali</option>
<option value="English">English</option>
</select>
<select id="ddl2" name="session[]">
</select>
</td>
<td class="tg-30rh">
<select name="sub1[]" id="select2-0">
</select>
</td>
<td class="tg-30rh">
<select name="sub2[]" id="select3-0">
</select>
</td>
<td class="tg-30rh">
<select name="sub3[]" id="select4-0">
</select>
</td>
<td class="tg-30rh">
<select name="sub4[]" id="select5-0">
</select>
</td>
<td class="tg-30rh">
<input type="text" name="tran_id[]" />
</td>
<td class="tg-30rh">
<input type="text" name="tran_date[]" />
</td>
<td><a href="javascript:void(0);" class="addCF">Add</a>
</td>
</tr>
</table>
不能将表达式作为属性名称。
更新:
试试这样的东西:
var mappings = [];
["#"+id+"2","#"+id+"3","#"+id+"4","#"+id+"5"].forEach(function(e,i) {
var o = {};
o[e] = i;
mappings.push(o);
});
相关文章:
- 在动态创建的元素上获取对特定选择器的引用
- JQuery对动态创建的对象进行选择
- Jquerymobile-使用javascript创建选择菜单
- 动态添加通过json创建的选择项
- 从动态创建的html选择中选择所选选项
- 如何动态创建许多Jquery颜色选择器(eyecon)
- 创建时选择Nav大写字母
- jQuery选择器不识别任何动态创建的HTML输入函数
- 如何创建只允许用户在选中前一个复选框的情况下选择复选框的复选框验证
- 如何根据电子邮件模板名称的选择创建依赖的同义词文本区域
- jQuery根据下拉菜单中的选择创建和删除字段
- 基于复选框选择创建元素
- 选中下拉列表并基于该选择创建 if 语句
- 基于选择创建动态选择表单
- 选择创建DOM元素还是在javascript中使用HTML生成控件
- 引导选择:无法使用引导选择创建一个简单的选择框
- jQuery选项卡-选择创建内容面板的位置
- 仍然无法从javascript中选择创建的元素
- KnockoutJs:基于下拉选择创建复选框列表
- 在AJAX/Javascript/HTML中基于下拉选择创建表单的问题