2013-03-04 81 views
0

我很难克隆单选按钮及其默认的检查状态。如何克隆jQuery中的默认选中状态的单选按钮?

这里是我的HTML:

<div class="container"> 
<div class="a2"> 
    <input type="radio" name="selection_1" value="name" checked="checked" /> Name 
    <input type="radio" name="selection_1" value="url" /> URL 
    <div class="text"> 
     <textarea name="name[]">Enter name: </textarea> 
    </div> 
    <div class="url"> 
     <textarea name="url[]">http://</textarea> 
    </div> 
    </div> 
</div> 
<input type="button" class="clone" value="Clone" /> 

这是我的jQuery:

$('.a2 [name]').change(function() { 
if($(this).val() == "name") { 
    $(this).parent().find('.url').css({'visibility': 'hidden', 'display':'none'}); 
    $(this).parent().find('.text').css({'visibility': 'visible', 'display':'block'}); 
} else { 
    $(this).parent().find('.text').css({'visibility': 'hidden', 'display':'none'}); 
    $(this).parent().find('.url').css({'visibility': 'visible', 'display':'block'}); 
} 
}); 

$('.clone').click(function() { 
    var p = $('.a2:first').length; 
    var cloned = $('.a2:first').clone() 
    .find('.a2 [name]').attr('name', 'selection_' + ++p).end() 
    .appendTo('.container'); 
}); 

我想实现的是克隆按钮应该克隆单选按钮,整组和文本区域默认的检查状态也被克隆到新的集合中。单选按钮应该通过在每个副本上增加前缀编号(如s​​election_2,selection_3等)来重命名,以便每个集合上的无线电选择独立工作。

这里是小提琴:http://jsfiddle.net/Tz66H/

+0

您需要指定一个不同的名称,以每个无线电组。就像你为selection_1完成的那样,然后在第一次克隆之后,它将是selection_2等等。 – 2013-03-04 11:00:45

回答

2

试试这个:

$(".container").on("change", ".a2 input[name^='selection_']", function (event) { 
    if ($(this).val() == "name") { 
     $(this).parent().find('.url').css({ 
      'visibility': 'hidden', 
       'display': 'none' 
     }); 
     $(this).parent().find('.text').css({ 
      'visibility': 'visible', 
       'display': 'block' 
     }); 
    } else { 
     $(this).parent().find('.text').css({ 
      'visibility': 'hidden', 
       'display': 'none' 
     }); 
     $(this).parent().find('.url').css({ 
      'visibility': 'visible', 
       'display': 'block' 
     }); 
    } 
}); 

$('.clone').click(function() { 
    var p = $('.a2').length; 
    var cloned = $('.a2:first').clone() 
     .find('input:radio').attr('name', 'selection_' + ++p).end() 
     .appendTo('.container'); 
}); 

DEMO

+0

是的,你的解决方案非常整洁。我不可能猜到这一行: '$(“。container”)。on(“change”,“.a2 input [name^='selection_']”,function(event){' 是什么原因我原来的行$('。a2 [name]')。change(function()would not work?我无法弄清楚 还有一件事,当你点击URL单选按钮并克隆,它克隆了与它相关的textarea检查的URL。我想要的是无论选择哪个单选按钮,默认情况下,克隆应该始终选择Name radio。是否可能? – user1448031 2013-03-04 11:29:54

+0

请参阅您正在动态地为DOM添加一些内容,我们需要使用['on'](http://api.jquery.com/on/)将一个或多个事件的事件处理函数附加到选定的元素上。请阅读'on'上的文档以获取更多详细信息作为一个建议,当你创造一些动态的东西时,尝试使用'on' :) – 2013-03-04 11:33:41

+0

是啊!您的要求可以轻松完成http://jsfiddle.net/Tz66H/5/ – 2013-03-04 11:58:44

1

尝试

var p = $('.a2 input[name=^="selection_"]').length + 1; 
var cloned = $('.a2:first').clone() 
.find('.a2 [name]').attr('name', 'selection_' + p).end() 
.appendTo('.container'); 

测试的代码

<script type="text/javascript" src="js/jquery.js"></script> 
<script type="text/javascript"> 

    $(function() 
    { 
     $('.a2 [name]').change(function() 
     { 
      if($(this).val() == "name") 
      { 
       $(this).parent().find('.url').css({'visibility': 'hidden', 'display':'none'}); 
       $(this).parent().find('.text').css({'visibility': 'visible', 'display':'block'}); 
      } 
      else 
      { 
       $(this).parent().find('.text').css({'visibility': 'hidden', 'display':'none'}); 
       $(this).parent().find('.url').css({'visibility': 'visible', 'display':'block'}); 
      } 
     }); 

     $('.clone').click(function() 
     { 
      var p = $('.a2 input[name^="selection_"]').length + 1; 
      alert(p); 
      var cloned = $('.a2:first').clone().find('input[name^="selection_"]').attr('name', 'selection_' + p).end().appendTo('.container'); 
     }); 
    }); 

</script> 
<div class="container"> 
    <div class="a2"> 
     <input type="radio" name="selection_1" value="name" checked="checked" /> Name 
     <input type="radio" name="selection_1" value="url" /> URL 
     <div class="text"> 
      <textarea name="name[]">Enter name: </textarea> 
     </div> 
     <div class="url"> 
      <textarea name="url[]">http://</textarea> 
     </div> 
    </div> 
</div> 
<input type="button" class="clone" value="Clone" /> 
0

试试这个

$('.clone').click(function() { 
    var p = $('.a2 input[value="name"]').length + 1; 
    $('.a2:first').clone().find('input[value="name"]').attr({name:'selection_' + p}).end().appendTo('.container'); 
}); 

fiddle here