javascript - 如何删除动态 jQuery 手风琴元素
问题描述
我有一个动态的 jQuery 手风琴,它根据我按下的按钮添加不同的手风琴元素。到目前为止一切顺利,但我无法在每个元素内添加一个删除按钮,该按钮可以删除新创建的项目。这是我到目前为止所拥有的:
$('#accordion').accordion();
$( function() {
$( "#accordion" ).accordion();
//ADD NEW EMPATHIZE ELEMENT TO ACCORDION WITH BUTTON 1
$('#addEmpathize').on('click', function() {
let newEmpathize = document.createElement('section');
let newDiv = document.createElement('div');
let newDeleteBtn = document.createElement('div')
let acc = document.getElementById('accordion');
//CREATES NEW TITLE
newEmpathize.innerHTML =
"<div class='empathize'>" +
"<div class='title'><i class=\"far fa-heart\"> </i>EMPATHIZE</div>" +
"<div class='push-right'>" +
"<span style='margin-right: 20px; font-size: 16px'><i class=\"far fa-times-circle\"></i></span>|<span style='margin-left: 20px; margin-right: 20px'><a><i class='fas fa-chevron-down rotate'></i></a></span>" +
"</div>" +
"</div>";
//CREATES CONTENT INSIDE ACCORDION SECTION
newDiv.innerHTML = "<div class='inline'><div class='card'>ITEM 1</div><div class = 'card' > ITEM 2 < /div><div class='card'>ITEM 3</div > < /div>";
//CREATES DELETE BUTTON
newDeleteBtn.innerHTML = "<div><button class='delete'>Delete</button></div>"
//APPENDS ELEMENTS TO ACCORDION AND REFRESHES
acc.appendChild(newEmpathize);
acc.appendChild(newDiv);
acc.appendChild(newDeleteBtn);
$("#accordion").accordion("refresh");
});
})
//DELETE FUNCTION
$('.delete').on('click', function() {
$(this).closest(section).remove();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" integrity="sha512-iBBXm8fW90+nuLcSKlbmrPcLa0OT92xO1BIsZ+ywDWZCvqsWgccV3gFoRBv0z+8dLJgyAHIhR35VZc2oM/gI1w==" crossorigin="anonymous" />
<body>
<div class="container">
<div class="btn-box">
<button id="addEmpathize" class="btn emp-btn"><i class="far fa-heart"> </i>Empathize</button>
<button id="addDefine" class="btn def-btn"><i class="fas fa-bullseye"> </i>Define</button>
<button id="addIdeate" class="btn idea-btn"><i class="far fa-lightbulb"> </i>Ideate</button>
<button id="addPrototype" class="btn prot-btn"><i class="fas fa-pencil-ruler"> </i>Prototype</button>
<button id="addTest" class="btn test-btn"><i class="fas fa-vial"> </i>Test</button>
</div>
<!-- START ACCORDION ELEMENT -->
<div>
<div id="accordion"></div>
</div>
<!-- END ACCORDION ELEMENT -->
</div>
</body>
如您所见,最后几行是删除最近部分的功能。但是,它不会删除创建的元素,而是会破坏任何创建的新部分。知道如何解决这个问题吗?
我只显示其中一个按钮的代码,因为它们的工作方式几乎相同,只是手风琴内容不同。重要的是它们都为 SAME 手风琴添加了不同的元素。
解决方案
您可以尝试使用委托方法,如下所示:
$('body').on('click', '.delete', function(){.....
此外,您应该在section周围使用引号。
我已经稍微更新了标记以包含父元素内的每个组:
演示:
//ADD NEW EMPATHIZE ELEMENT TO ACCORDION WITH BUTTON 1
$('#addEmpathize').on('click', function() {
$('#accordion').accordion(); // added to initialize accordion
let newEmpathize = document.createElement('section');
let newDiv = document.createElement('div');
let newDeleteBtn = document.createElement('div')
let acc = document.getElementById('accordion');
//CREATES NEW TITLE
newEmpathize.innerHTML =
"<div class='empathize'>" +
"<div class='title'><i class=\"far fa-heart\"> </i>EMPATHIZE</div>" +
"<div class='push-right'>" +
"<span style='margin-right: 20px; font-size: 16px'><i class=\"far fa-times-circle\"></i></span>|<span style='margin-left: 20px; margin-right: 20px'><a><i class='fas fa-chevron-down rotate'></i></a></span>" +
"</div>" +
"</div>";
//CREATES CONTENT INSIDE ACCORDION SECTION
newDiv.innerHTML = "<div class='inline'><div class='card'>ITEM 1</div><div class='card'>ITEM 2</div><div class='card'>ITEM 3</div></div>";
//CREATES DELETE BUTTON
newDeleteBtn.innerHTML = "<div><button class='delete'>Delete</button></div>"
//APPENDS ELEMENTS TO ACCORDION AND REFRESHES
var parentEl = document.createElement('div'); // create an element as parent
parentEl.classList.add('deleteParent'); // set class to the element
parentEl.appendChild(newEmpathize);
parentEl.appendChild(newDiv);
parentEl.appendChild(newDeleteBtn);
acc.appendChild(parentEl); // add the parent element
$( "#accordion" ).accordion("refresh");
});
//DELETE FUNCTION
$('body').on('click', '.delete', function(){
$(this).closest('.deleteParent').remove(); // remove the respective group
});
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" integrity="sha512-iBBXm8fW90+nuLcSKlbmrPcLa0OT92xO1BIsZ+ywDWZCvqsWgccV3gFoRBv0z+8dLJgyAHIhR35VZc2oM/gI1w==" crossorigin="anonymous" />
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<body>
<div class="container">
<div class="btn-box">
<button id="addEmpathize" class="btn emp-btn"><i class="far fa-heart"> </i>Empathize</button>
<button id="addDefine" class="btn def-btn"><i class="fas fa-bullseye"> </i>Define</button>
<button id="addIdeate" class="btn idea-btn"><i class="far fa-lightbulb"> </i>Ideate</button>
<button id="addPrototype" class="btn prot-btn"><i class="fas fa-pencil-ruler"> </i>Prototype</button>
<button id="addTest" class="btn test-btn"><i class="fas fa-vial"> </i>Test</button>
</div>
<!-- START ACCORDION ELEMENT -->
<div>
<div id="accordion"></div>
</div>
<!-- END ACCORDION ELEMENT -->
</div>
</body>
推荐阅读
- google-cloud-platform - 使用 gsutil 时可以指定服务帐户吗?
- c++ - C++ 等待回调在回调中完成
- tensorflow - TensorFlow 对象检测异常大的边界框和错误的结果
- nginx - 用 nginx 替换 apache 和 mod_weblogic 什么?
- google-chrome-extension - CORS 策略被阻止
- google-chrome - 如何在没有 amp-ad 的情况下呈现 Amp 广告?
- html - 检测 Html 中的红线
- react-native - React-Native 与 Objective-c 的 ViewWillAppear 有什么相似之处?
- ios - 如果目标是普通类,则 UITapGestureRecognizer 无法正常工作
- php - 使用 magento2 在 url 中添加斜杠