所以,我承认自己是一个JS菜鸟,但据我所知,这应该是有效的,但事实并非如此。
背景:
我有一个包含3个列表框的表单。列表框名为app1,db1和db2。我正在使用javascript来允许用户添加其他列表框,增加每个附加选择框的名称标签。
当我添加其他应用程序命名框时,该值会针对每个其他字段正确递增。如果我尝试添加名为choices的addtional db,它将无法识别通过该数组的第一个循环上的第二个标记。这导致我最终得到2个名为db2的元素。在每个后续标记上,它被正确识别并正确递增。
这是db1标记的HTML:
<select name="db1">
*options*
</select>
和db2:
<select name="db2">
*options*
</select>
标签是相同的。这是我用来计算序列中下一个数字的函数(注意:标签是app或db,标签是DOM中所有选择标签名称的数组,如果我检查标签,它会给我{{ 1}}):
['app1', 'db1', 'db2', '']
如果我添加了应用标记,则会返回“app2”。如果我搜索db标记,它将在第一次返回'db2',在第二次返回db3等等。
所以基本上,我确定我在这里做错了。
答案 0 :(得分:2)
我会通过保留db的计数器和app用于生成名称的计数器来处理它。
var appCounter = 1;//set this manually or initialize to 0 and
var dbCounter = 2;//use your create function to add your elements on pageload
然后,当您创建下一个标记时,只需递增计数器并将其用作您姓名的后缀:
var newAppElement = document.createElement('select');
newAppElement.name = 'app' + (++appCounter);
..
// --OR for the db element--
var newDbElement = document.createElement('select');
newDbElement.name = 'db' + (++dbCounter );
..
答案 1 :(得分:1)
您遇到的问题是正则表达式对象是有状态的。您可以通过将正则表达式创建放在循环中来修复程序。
function return_select_name(tag, tags) {
matches = new Array();
// <-- regex was here
for (var i = 0; i < tags.length; i++) {
var re = new RegExp(tag + "\\d+", "g"); //<--- now is here
var found = re.exec(tags[i]);
if (found != null) {
matches.push(found[0]);
}
}
matches = matches.sort();
index = parseInt(/\d+/.exec(matches[matches.length-1])) + 1; //<--- I dont think matches.last is portable, btw
index = tag + index;
return index;
}
在任何情况下,如果我自己这样做,我可能更愿意避免复制文本匹配,只是将下一个标记索引存储在变量或哈希映射中。
另一个建议:如果你在你的正则表达式中加上括号:
// /tag(\d+)/
var re = new RegExp(tag + "(\\d+)", "g");
然后您可以使用found[1]
直接获取您的号码,之后不需要额外的步骤。
答案 2 :(得分:0)
我知道这已经得到了解答,但我把它放在一起作为概念证明。
http://jsfiddle.net/zero21xxx/LzyTf/
这是一个对象,所以你可以在不同的场景中重用它。显然有一些方法可以改进,但我认为这很酷,所以我想我会分享。
console.debug
仅适用于Chrome和FF。