问题获取正确的 $(this) 元素以附加到列表

Issue getting correct $(this) element to append to a list

我有一个 div 字段,单击该字段会创建一个下拉菜单。每当您单击下拉选项选项时,名称将转到 div 字段 #proposal-type。您可以继续单击以添加其他选项选择。

我的问题是,当我点击 x 删除选择时,我无法弄清楚如何将刚刚点击的整个 drop-item 删除并填回下拉列表.现在只有 x 返回选项列表。

有没有人有什么想法?

此外,有人可以分享一个快速指南,说明当我在选项框列表外部单击时如何让选项框列表消失吗?无论现在发生什么,它都会一直存在。

Here is a fiddle.

$('#proposal-type').click(function() {
  $('#proposal-type-drop').addClass('active');
});
$('#proposal-type').text("Type of Project *");
$('.drop-item-input').on('change', function() {
  var proposalVal = "";
  var proposalHtml = "";
  $('.drop-item-input').each(function() {
    if ($(this).is(":checked")) {
      proposalVal += $(this).val();
      proposalHtml += '<div class="drop-item-selected"><span class="drop-item-close"></span>' + $(this).val() + '</div>';
      $(this).closest('label').fadeOut();
    };
    //else if ($(this).is(":checked") === false) {
    // $(this).closest('label').fadeIn();
    //};
    $('#proposal-type').val(proposalVal).html(proposalHtml);
    $('#proposal-type-drop').removeClass('active');
  });
  //values
  var type = $('.drop-item-input:checked').map(function() {
    return $(this).val();
  }).get().join(', ');
  console.log(type);
});
$(document).on('click', '.drop-item-close', function() {
  console.log("Triggered");
  $(this).fadeOut("medium", function() {
    $(this).detach().appendTo('#proposal-type-drop').fadeIn();
  });
  $(this).is(":checked") === false;
  $(this).closest('label').fadeIn();
  $(this).closest('.drop-item-selected').fadeOut();
});
.panel-input {
  box-sizing: border-box;
  border: 1px solid #858585;
  display: inline-block;
  vertical-align: top;
  width: 45%;
  margin: 1.5% 2% 2.5% 2%;
}

.proposal-input {
  width: 100%;
}

#proposal-type-drop {
  width: 45%;
  display: none;
  position: absolute;
}

#proposal-type-drop.active {
  background: rgba(0, 0, 0, 1);
  display: block;
  height: auto;
  z-index: 1;
}

.drop-item {
  color: #FFF;
  font-size: 1rem;
  padding: 7px 5px;
  font-family: 'Open Sans', sans-serif;
  background: rgba(0, 0, 0, .8);
  display: block;
  width: 100%;
  cursor: pointer;
}

.drop-item-input {
  display: none;
}

.drop-item-selected {
  background: #0085A1;
  color: #333333;
  padding: 5px;
  font-size: .9rem;
  font-weight: bold;
  font-family: 'Roboto', sans-serif;
  width: auto;
  display: inline-block;
  margin: 0 3px;
}

.drop-item-close {
  display: inline-block;
  background-image: url("http://www.clipartbest.com/cliparts/dT8/xnA/dT8xnAqAc.png");
  background-size: 10px 10px;
  background-repeat: no-repeat;
  height: 10px;
  width: 10px;
  margin-right: 10px;
  cursor: pointer;
  transition: ease 0.1s;
  -webkit-transition: ease 0.1s;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="panel-input">
  <div id="proposal-type" class="proposal-input"></div>
  <div id="proposal-type-drop">
    <label class="drop-item">Apple<input type="checkbox" name="prop-type[]" class="drop-item-input" value="Apple"></label>
    <label class="drop-item">Banana<input type="checkbox" name="prop-type[]" class="drop-item-input" value="Banana"></label>
    <label class="drop-item">Cake<input type="checkbox" name="prop-type[]" class="drop-item-input" value="Cake"></label>
  </div>
</div>

这里有一些问题,我已尝试更正。不过,我应该一开始就警告你,这感觉很乱,因为我不想尝试重写你的代码,你可能想研究一种不同的方法,也许不使用复选框,因为它们似乎会使系统过于复杂。

第一期正如 James 在他的评论中所说的那样,你只在下拉列表中看到十字架的原因是因为选择了 $(this) 当你实际寻找 parent 时,可通过 $(this).parent().

实现

第二个问题是在你的第二个JSFiddle中,你已经纠正了第一个问题,但是,你的代码并不完全有效,因为你是现在将不包含复选框的不同类型的元素插入到 drop-down 元素中,当您尝试单击它时会导致一大堆麻烦。纠正此问题的方法是插入一个新的 HTML 元素,就像您在代码的前一节中所做的那样,并删除列表中的旧元素。导致对 .drop-item-close eventListener 方法进行以下修改;

$("#proposal-type-drop input[value='"+$(this).parent().text()+"']").remove();
$("#proposal-type-drop").append('<label class="drop-item">'+$(this).parent().text()+'<input type="checkbox" name="prop-type[]" class="drop-item-input" value="'+$(this).parent().text()+'"></label>').fadeIn();
$(this).parent().detach();

这让我们进入了第三个问题,因为现在我们已经生成了一个新元素,它在 drop-down 列表中看起来不错,但是,它不会响应您之前的 .drop-item-input eventListener。我们需要修改此侦听器以通过以下方式处理动态添加的元素;

$(document).on('change', '.drop-item-input', function() {
    /* Rest of your code */
});

这是包含这些修改的更新 JSFiddle,它应该可以按您的预期工作。