2012-03-27 8 views
0

Die folgende jquery wird nur das '# switch1' html ändern, wenn das erste Mal geklickt wird, also bin ich mir nicht sicher, warum es beim zweiten Mal das Conditional nicht durchläuft Aktion wird genommen.jQuery arbeitet nur am ersten Event auf Seite

<script type="text/javascript"> 
$(document).ready(function(){ 
    $('#switch1 .switch').click(function(){ 
    if($(this).prev().is(':checked')){ 
     $('#switch1').html('<input class="switch" type="checkbox" name="auth_service_twitter" value="0"/>Twitter');} 

    else{ 
     $('#switch1').html('<input class="switch" type="checkbox" name="auth_service_twitter" value="1" checked="checked"/>UTwitter');}});}); 
</script> 

<form id='socialForm' action='' method="post"> 
    <ul id="switch1"> 
    <input class="switch" type="checkbox" name="auth_service_twitter" value="0"/>Twitter 
    </ul> 
</form> 
+0

Ich habe eine 'live' Version wie gewünscht ... [es überprüfen] (http://stackoverflow.com/a/9890869/601179) – gdoron

Antwort

0

:) ... außer Kraft setzen Sie alle DOM unter dem Schalter ul mit $('#switch1').html(...

Lösungen:

  1. Verwenden Delegierten Veranstaltung.
  2. Sie alle DOM nicht löschen ...

LIVE DEMO von Delegierten Ereignisse:

$('#switch1').on('click', '.switch', function() { 
    if (!$(this).is(':checked')) { 
     $('#switch1').html('<input class="switch" type="checkbox" name="auth_service_twitter" value="0"/>Twitter'); 
    } else { 
     $('#switch1').html('<input class="switch" type="checkbox" name="auth_service_twitter" value="1" checked="checked"/>UTwitter'); 
    } 
});​ 

Update: Sie Ihre jQuery-Version schrieb 1.4 so ist ... Gebrauch live :(so:

function handler(){ 
    if (!$(this).is(':checked')) { 
     $('#switch1').html('<input class="switch" type="checkbox" name="auth_service_twitter" value="0"/>Twitter'); 
    } else { 
     $('#switch1').html('<input class="switch" type="checkbox" name="auth_service_twitter" value="1" checked="checked"/>UTwitter'); 
    } 

} 

$('#switch1 .switch').live('click', handler); 

Live DEMO

+0

das .on scheint mit jquery 1.7.1 zu arbeiten, nicht mit jquery 1.4 (was ich benutze, und ich hatte gehofft, das nicht zu ändern, da ich ein lightswitch plugin innerhalb des Formulars verwende, das 1.4 ... benötigt) –

+0

@NolanKnill. Ich habe eine 'Live'-Version hinzugefügt ... – gdoron

0

Versuchen für die Bindung statt klicken Live() verwenden. click() - Ereignisse werden den Objekten zugewiesen, die beim Laden der Seite vorhanden sind, und da Sie die Elemente durch html() ersetzen, geht die Zuweisung verloren.

BTW, warum nicht $ ('. Switch'). Attr ('checked', 'checked') (und ändern Sie den Wert auf die gleiche Weise) anstelle der gesamten HTML? Sollte robuster sein.

+0

Die' Live'-Funktion ist veraltet. (es ist nicht der Typ seit jQuery 1.4.4. Also genug mit dem 'live' Kerl. **:) **) – gdoron

+0

Du hast natürlich Recht, er sollte stattdessen on() verwenden. Aber es ändert nichts an der Tatsache, dass er sich von click() zu etwas bewegen muss, das nicht nur die Objekte beeinflusst, die während der Ladezeit vorhanden sind. – Janek

+0

Ja. zu "on" ... :) sehe meine Antwort. – gdoron

0

Sie haben Delegierte verwenden/auf Funktion:

<script type="text/javascript"> 
$(document).ready(function() 
{ 
    $('body').on('click', '#switch1 .switch', function() 
    { 
     if (!$(this).is(':checked')) { 
      $('#switch1').html('<input class="switch" type="checkbox" name="auth_service_twitter" value="0"/>Twitter'); 
     } else { 
      $('#switch1').html('<input class="switch" type="checkbox" name="auth_service_twitter" value="1" checked="checked"/>UTwitter'); 
     } 
    }); 
}); 
</script> 

<form id='socialForm' action='' method="post"> 
    <ul id="switch1"> 
    <input class="switch" type="checkbox" name="auth_service_twitter" value="0"/>Twitter 
    </ul> 
</form> 
Verwandte Themen