2016-03-28 12 views
2

Ich habe ein Problem - Ich möchte einen Teil des HTML-Formulars klonen, aber ich habe keine Ahnung, wie kann ich Etikett for Attribut ändern.jQuery - klonen Formularelemente und ändern Sie Etiketten für

Ich verwende Code wie folgt:

<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> 

aber for Attribut für label nicht aktualisiert wird (aber background-color ist)

Working fiddle

Fragen:

  1. Wie um den obigen Code zu aktualisieren for für Label auch
  2. Ist es möglich, neu zu schreiben, diesen Code aktualisiert werden sie kürzer
+0

Ich muss etwas besser erklären, was Sie über das 'for' Attribut zu ändern versuchen. Nur der Index oder der Index und der Name? – Adjit

+0

@Adjit Original 'for' ist' services [0] [name] ', ich möchte es' services [1] [name] 'für die erste Zeile,' services [2] [name] 'für die 2. Zeile haben Zeile und so weiter –

+1

Reagrding Frage # 2, ich denke, dass Ihr Code kurz genug ist. Der Versuch, es kürzer zu machen, wäre übertrieben und könnte es wirklich schwer verständlich machen (auch nicht sicher, wenn möglich). –

Antwort

3

Sie es Recht zu machen, aber Sie sind eine return-Anweisung fehlt.

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

Denken Sie daran, Sie haben zwei verschachtelte Funktionen und jede Rückkehr nur für die Funktion wendet man zur Zeit drinnen sind.

+0

Vielen Dank. Das war's! –

2

Sie müssen den neuen Wert nach dem Ausführen von replace zurückgeben.

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