2012-03-27 11 views
0

次のjqueryはチェックボックスが初めてクリックされたときにのみ '#switch1' htmlを変更するので、なぜ2度目の条件を通過しないのかわかりません行動がとられる。jQueryはページの最初のイベントでのみ動作します

<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

あなたが要求したとして、私は 'live'バージョンを追加しました... [それをチェック](http://stackoverflow.com/a/9890869/601179 ) – gdoron

答えて

0

  1. 使用デリゲートイベント:)...あなたは$('#switch1').html(...

    ソリューションとスイッチulの下にあるすべてのDOMをオーバーライドします。

  2. デリゲートイベントのすべてのDOM ...

LIVE DEMOを削除しないでください:

$('#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'); 
    } 
});​ 

更新:あなたのjQueryのバージョンを書いたが1.4そう...使用であり、 live :(この方法:

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

.onはjquery 1.7.1では動作しているようですが、jquery 1.4では使用できません(これは1.4を必要とするフォーム内でlightswitchプラグインを使用しているため変更しないことを願っていました...) –

+0

@NolanKnill。私は 'live'バージョンを追加しました... – gdoron

0

(住んで使用してみてください)クリックするのではなく、結合のため。 click()イベントは、ページが読み込まれるときに存在するオブジェクトに割り当てられ、要素をhtml()に置き換えるので、割り当ては失われます。

なぜ、すべてのHTMLを置き換えるのではなく、$( '。switch')。attr( 'checked'、 'checked')(値を同じ方法で変更します)より堅牢でなければならない。

+0

' live'関数は廃止されました。 (それはjQuery 1.4.4以降の男ではないので、その「生きた」男と一緒に** **) – gdoron

+0

あなたは当然ですが、彼はon()を代わりに使うべきです。しかし、click()からロード時に存在するオブジェクトだけに影響を与えないものに移動する必要があるという事実は変わりません。 – Janek

+0

私の答えを見てください。 – gdoron

0

元のcheckboxを上書きして、イベントハンドラを破棄していました。
実用的な実装については、http://jsfiddle.net/xDNKe/1/を参照してください。あなたは機能上/デリゲートを使用する必要が

0

<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> 
関連する問題