使用jQuery将标签插入div
我有这么长的复选框列表,其中的特定标签看起来像这样:
在这个表单下面我有六个div就像这样:
我有这个JS函数,所以当我点击一个复选框时,它的标签被插入到第一个div中。 这是它的样子:
$(function(){ $('input:checkbox').click(function(){ var id = $(this).attr('id'); if($(this).is(':checked')){ $('#member1').text($('label[for="'+ id +'"]').text()); } else{ $('#member1').text(''); } }); });
所以一个问题是当前函数必须指定将其放入哪个div(#member1)。 它应该工作,当第一个div是“满”时,下一个复选框将其标签插入第二个div,当那个完整时,第三个复选框将其标签插入第三个div等。
另一个问题是,如果取消选中复选框,则应从其div中删除其标签,并且其下方div中的标签应向上移动。 任何人都知道这是否可能? 我会接受任何问题的帮助!
警告:我会完全不同地做到这一点。
但使用您当前的结构: 实时复制 | 来源 (使用有效id
)
$(function(){ $('input:checkbox').click(function(){ var $cb = $(this), id = this.id, // No need for `attr` member, prev; if(this.checked){ // No need for `attr` $("div[id^=member]").each(function() { if (!this.firstChild) { // It's empty, use it $(this).text($('label[for="'+ id +'"]').text()).attr("data-contents", id); return false; // Done } }); } else { member = $('div[data-contents="' + id + '"]'); if (member[0]) { member.empty().removeAttr('data-contents'); prev = member[0]; member.nextAll().each(function() { if (!this.firstChild) { return false; // Done } prev.appendChild(this.firstChild); prev = this; }); } } }); });
我会做的最小改变:
- 将
#memberX
div放在一个容器中,这样我们就不必进行id^=
search了。 - 根本不要在
#memberX
div上使用id
值。 - 如果你不是绝对的,肯定需要它们 ,根本就没有空的
#member
div。 这将显着简化代码。 - 如果确实需要它们,在清除时,删除div并在最后添加一个新的空的div。
示例: 实时复制 | 资源
HTML:
只需用
"替换#membersX
div。
JavaScript的:
$(function(){ $('input:checkbox').click(function(){ var $cb = $(this), id = this.id; // No need for `attr` if(this.checked){ // No need for `attr` $("") .text($('label[for="'+ id +'"]').text()) .attr("data-contents", id) .appendTo("#members"); } else { $('div[data-contents="' + id + '"]').remove(); } }); });
您可以通过移动复选框输入 label
来简化甚至更多(这也意味着您可以取消使用for
属性): 资源
HTML:
JavaScript的:
$(function(){ $('input:checkbox').click(function(){ var id = this.id; // No need for `attr` if(this.checked){ // No need for `attr` $("") .text($(this.parentNode).text()) .attr("data-contents", id) .appendTo("#members"); } else { $('div[data-contents="' + id + '"]').remove(); } }); });
试试这个: jsFiddle示例 。
jQuery的
$('input:checkbox').click(function() { if ($(this).is(':checked')) { $('div:empty:first').html($(this).next('label').html()); } else { var foo = $(this); $('div').each(function() { if ($(this).html() == foo.next('label').html()) { $(this).html($(this).next('div').html()); $(this).nextAll('div').each(function() { $(this).html($(this).next('div').html()); }); } }); } });
如果我正确理解了您的问题,那么您可以获得X个可用的点,并且您只能填充那么多。 如果是这种情况,我认为这就是你要找的东西: jsFiddle 。 如果没有,其他一些解决方案可能会更好……
var $selections = $('ul.selections'); $('input:checkbox').click(function() { var id = $(this).val(); if($(this).is(':checked')) { var $label = $(this).next('label'); var $spot = $selections.find('li:not(.full)'); if($spot.length == 0) { alert('no more spots open!'); return false; } $spot.eq(0).addClass('full').html($label.clone()); } else { var $label = $selections.find('label[for=' + id + ']'); $label.closest('li').remove(); $selections.append($('').html(' ')); } });
使用此HTML:
Options
-
-
....
Selections
-
-
-
-
-
-
我创建了它们列表,因为它们实际上就是它们,但是如果这就是你想要的,那么代码对于DIV也会起作用。 由于克隆了标签,因此单击选择列表上的标签将删除它。
基于您的代码的简单方法http://jsfiddle.net/joevallender/rTQMe/
$(document).ready(function(){ $('input:checkbox').click(function(){ var $checked = $('#checked'); $checked.html(''); $('input:checkbox').each(function(index){ if($(this).is(':checked')) { $checked.append('' + $('label[for="'+ $(this).attr('id') +'"]').text() + ''); } }); }); });
有一些方法可以提高效率,但这应该适用于您的目的:
$(function(){ var numberOfDivs = 6; $('input:checkbox').click(function(){ var id = $(this).attr('id'); if($(this).is(':checked')){ for(i = 1; i < numberOfDivs - 1; i++) { var div = $('#member' + i); if(div.text() !== ''){ div.text( ($('label[for="'+ id +'"]').text() ); } } } else{ var searchText = $('label[for="'+ id +'"]').text(); for(i = 1; i < numberOfDivs - 1; i++) { var div = $('#member' + i); if(div.text() === searchText){ div.text(''); } } } }); });
这是我将如何做到这一点:
$(function(){ $('input:checkbox').click(function(){ var id = this.id; if(this.checked){ var member = $('#member1'); var i = 1; while(member.data('num') == 1) { member = $('#member'+(++i)); } member.text($('label[for="'+ id +'"]').text()).data('num',1); } else{ var removed = false; $('div').each(function(){ $(this).children('label').each(function(){ if(!removed && id == $(this).attr('for')) { removed = true; $(this).parent().remove('label[for="'+$(this).attr('for')+'"]'); } } if(removed) //bubble the labels up into the next highest div. { if($(this).data('num') == 1) var lastObject = $(this).children('label'); $(this).prev().append(lastObject); } } } }); });