2016-03-28 8 views
2

için klonlama form öğelerini ve etiketleri değiştirme Sorunum var - HTML formunun bir bölümünü klonlamak istiyorum ancak etiketin for özniteliğini nasıl değiştirebilirim bilmiyorum. BöylejQuery -

kullanıyorum kodu:

<script> 

    $('#add-service').click(function() { 
     $('.services div.service:last').clone(true) 
     .find(':input').each(function() { 
      this.name = this.name.replace(/\[(\d+)\]/, function (str, p1) { 
       return '[' + (parseInt(p1, 10) + 1) + ']'; 
      }) 

      this.id = this.name 

     }).end().find('label').each(function() { 
      $(this).css('background-color','red'); 
      $(this).attr('for', function (index, old) { 
       old.replace(/\[(\d+)\]/, function (str, p1) { 
        return '[' + (parseInt(p1, 10) + 1) + ']'; 
       }); 
      }) 
     }).end().insertAfter('.services div.service:last'); 
    }); 

</script> 

ama label için for nitelik güncellenmiş değil (ama background-color olan)

Working fiddle

Sorular:

  1. nasıl yukarıdaki kodu güncellemek için Ayrıca
  2. güncellenecektir etiket için for mümkün Haklısınız ona sahip
+0

'for' özniteliği hakkında değiştirmeye çalıştığınız şeyi biraz daha iyi açıklamak zorundasınız. Sadece endeks ya da endeks ve isim? – Adjit

+0

@Adjit Orijinal 'for' is' hizmetler [0] [isim] ', 1. eklenecek satırlar için' hizmetler [1] [isim] ', ikinci için eklenen hizmetler [2] [ad]' satır ve benzeri –

+1

Reagrding question # 2, kodunuzun yeterince kısa olduğunu düşünüyorum. Daha kısa yapmayı denemeye çalışmak aşırı derecede zor olabilir ve bunu anlamak gerçekten zor olabilir (eğer mümkünse emin de değil). –

cevap

3

Kısaltmak için bu kodu yeniden yazmak mı, ama bir return ifadesi eksik.

$(this).attr('for', function (index, old) { 
    return old.replace(/\[(\d+)\]/, function (str, p1) { 
     return '[' + (parseInt(p1, 10) + 1) + ']'; 
    }); 
}) 

Unutmayın, 2 iç içe geçmiş işleviniz var ve her geri dönüş yalnızca şu an içinde bulunduğunuz işlev için geçerlidir.

+0

Teşekkürler. Öyleydi! –

2

replace'u çalıştırdıktan sonra yeni değeri döndürmeniz gerekir.

$(this).attr('for', function (index, old) { 
    return old.replace(/\[(\d+)\]/, function (str, p1) { 
    return '[' + (parseInt(p1, 10) + 1) + ']'; 
    }); 
})