2017-02-14 71 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);