javascript - 销毁克隆元素(无法选择第一个实例)

标签 javascript jquery clone destroy

我正在测试一些通用函数构建,并遇到了这个问题 - 无法使用 jQuery 语法选择第一个克隆元素。是因为 eventListeners 不存在于第一个中吗?如果是这样,如何将事件监听器添加到克隆之前不存在于 DOM 中的内容?

var cloneAndAppendCounter = 0;

function cloneAndAppend (what, target, maxClones) { 
  var id = what.attr('id');
  var clone = what.clone(true);
  var target = target;
  
  if ( cloneAndAppendCounter < maxClones ) {
    clone.attr('id', id + cloneAndAppendCounter); 
    clone.appendTo(target);
    cloneAndAppendCounter++;
  }
};

function destroyClonedElement (originalElement, when) {
  var originalElementId = originalElement.attr('id');
  var clonedElementId = originalElementId + cloneAndAppendCounter;
  var cloned = $('#' + clonedElementId);

  
  console.log('clonedElementId:', clonedElementId);
  console.log(cloned);

  if ( (cloned) && cloneAndAppendCounter > 0 ) {
    cloned.remove();
    cloneAndAppendCounter--;
    console.log('counter: ', cloneAndAppendCounter);
  };

};


$('.clone-button').click(function () {
  cloneAndAppend($('#app'), $('.container'), 4);

});


$('.destroy-button').click(function () {
  destroyClonedElement($('#app'));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button class="clone-button">clone button</button>
<button class="destroy-button">destroy button</button>
<div class="container">
  <div id="app">test</div>
</div>

最佳答案

不,问题不在于元素是否绑定(bind)到监听器。 问题出在这一行

    cloneAndAppendCounter++;

或更准确地说,在您放置它的位置,因为事实证明它发挥了戏剧性的作用。

所以问题是你将一个具有特定 id 的元素附加到目标,然后你增加计数器。因此,当您按下remove按钮时,计数器比附加子项的数量多了一个,这就是为什么第一次单击没有效果的原因 - 因为它是徒劳的。

这是一个工作脚本(我将有问题的行重新排列到最适合的位置,此外还更改了初始计数器):

var cloneAndAppendCounter = -1;

function cloneAndAppend (what, target, maxClones) { 
  var id = what.attr('id');
  var clone = what.clone(true);
  var target = target;
  
  if ( cloneAndAppendCounter < maxClones ) {
    cloneAndAppendCounter++;
    clone.attr('id', id + cloneAndAppendCounter); 
    clone.appendTo(target);
//    console.log('counter: ', cloneAndAppendCounter);
  }
 
};

function destroyClonedElement (originalElement, when) {
  var originalElementId = originalElement.attr('id');
  var clonedElementId = originalElementId + cloneAndAppendCounter;
  var cloned =  $('#' + clonedElementId);

  
//  console.log('clonedElementId:', clonedElementId);
//  console.log(cloned);

  if ( cloned && cloneAndAppendCounter > -1 ) {
    cloned.remove();
    cloneAndAppendCounter--;
//    console.log('counter: ', cloneAndAppendCounter);
  };

};


$('.clone-button').click(function () {
  cloneAndAppend($('#app'), $('.container'), 4);
});


$(document).on('click','.destroy-button', function (e) {
  e.preventDefault();
  destroyClonedElement($('#app'))
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button class="clone-button">clone button</button>
<button class="destroy-button">destroy button</button>
<div class="container">
  <div id="app">test</div>
</div>

关于javascript - 销毁克隆元素(无法选择第一个实例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50724224/

相关文章:

javascript - 如何排除特殊字符并允许使用西类牙文/英文字母?

javascript - react native ConfigUtils.configFilename 异步不是函数

javascript - 预填充文本字段的脚本

javascript - Highchart 在 jquery 函数中不起作用

jQuery:在 WebKit(Chrome/Safari) 中使用带有 anchor 链接的 Append()

rust - 派生特征会导致意外的编译器错误,但手动实现有效

javascript - ajax 成功发布表单并更改页面

JQuery UI 选项卡使用 ajax 加载文档片段

c++ - 克隆指针 C++

clone - 如何区分链接克隆与 VirtualBox 中的完整克隆?