2017-02-14 68 views
2

以下是我的元素id,我想动态更新它。动态更改jquery中的元素名称

invoice[46][ap_details][4][ap_header_id] 

我想更新仅第二数目,即[4],像这样:

invoice[46][ap_details][5][ap_header_id] 

我使用低于该正在更新这两个值的代码。

var strNewName = $(this).attr('name').replace(/\[\d+\]/g, function(strName) { 
    strName = strName.replace(/[\[\]']+/g, ''); 
    var intNumber = parseInt(strName) + 1; 
    return '[' + intNumber + ']'; 
}); 

任何帮助,将不胜感激。

+1

你能告诉我们原因:可以按如下方式以及其做?这可能会在别处优化! –

+0

也许addClass/removeClass是一个更好的方式去.. – Celebrian

回答

1

var strName = "invoice[46][ap_details][4][ap_header_id]"; 
 

 
var parts = strName.split('['); 
 
parts[3] = parts[3].replace(/^\d+/, n => +n + 1); 
 

 
var strNewName = parts.join('['); 
 
console.log(strNewName);

如果你不想使用箭头功能替换此行:

parts[3] = parts[3].replace(/^\d+/, n => +n + 1); 

与此:

parts[3] = parts[3].replace(/^\d+/, function(n) { return +n + 1; }); 

说明:

split将返回一个这样的数组:

[ 
    "invoice", 
    "46]",    // parts[1] to change this 
    "ap_details]", 
    "4]",    // parts[3] to change this (and so on, you do the math) 
    "ap_header_id]" 
] 

/^\d+/将匹配(任何数量的在开始时不需要对g改性剂)。

替换+n + 1没有n + 1因为n是一个字符串,你必须强制interpretter使用它作为一个数字或否则这"4" + 1将导致该"41"

然后,在您更改所需内容后,使用join与您用于拆分的相同字符([)加入零件。

1

使用此正则表达式/((\w)+)(\[\d+\])(\[(\w)+\])(\[\d+\])(\[(\w)+\])/gi您可以构造字符串并更改您的整数。

var match = /((\w)+)(\[\d+\])(\[(\w)+\])(\[\d+\])(\[(\w)+\])/gi.exec(youString); 
//group 6 is your digit. 
var newId = parseInt(match[6].replace("\[\]", "")) + 1; 
var newString = match[1] + match[3] + match[4] + "[" + newId + "]" + match[7]; 

这里是答案小提琴https://jsfiddle.net/gzfud9vc/

1

也许不使用正则表达式来建立你的元素ID。

var id = 5 
 
var name = "invoice[46][ap_details]["; 
 
name += id; 
 
name += "][ap_header_id]"; 
 

 
var toReplace = "invoice[46][ap_details][~~id~~][ap_header_id]" 
 
var replaced = toReplace.replace(/~~id~~/g, id); 
 

 
console.log(name); 
 
console.log(replaced);