Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.02.2020, 02:16
Кандидат Javascript-наук
Отправить личное сообщение для Katy93 Посмотреть профиль Найти все сообщения от Katy93
 
Регистрация: 28.12.2018
Сообщений: 138

Как при нажатии кнопки удалить ещё и внешний блок?
Нашла в интернете код, который удаляет блоки div. При нажатии удаляется тот блок в который вложена кнопка удаление. У блока есть класс card, по нему и происходит удаление. Как сделать, чтобы при нажатии удалялся еще и внешний блок который не вложен в class card. Пример в коде. У блоков есть название текст 1, текст 2, текст 3 и текст 4. У внешних блоков тоже есть название текст 1_1, текст 1_2, текст 1_3, текст 1_4. Удаление по идеи должно происходить, таким образом “текст 1” = “текст 1_1” и т.д. Как это сделать. Вот весь код:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<meta name="description" content="" />
<meta name="keywords" content="" />
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<style>
body {
  display: flex;
}

.card {
  text-align: center;
  border: 1px solid #000;
  background: #ccc;
}

</style>
<script>
$(document).ready(function(e){


function removeElem(delElem, attribute, attributeName) {      

  if (!(delElem && attribute && attributeName)) return;
  return function(e) {
 
    let target = e.target;


    if (!(target.hasAttribute(attribute) ?
        (target.getAttribute(attribute) === attributeName ? true : false) : false)) return;
    let elem = target;
    

    while (target != this) {
      if (target.classList.contains(delElem)) {
        target.remove();
        return;
      }
      target = target.parentNode;
    }
    return;
  };
}


document.addEventListener("click", removeElem("card", "data-del", "delete"));
});
</script>

</head>
<body>
  <div>Текст 1_1</div>
  <div>Текст 1_2</div>
  <div>Текст 1_3</div>
  <div>Текст 1_4</div>
<div class="card show">
  <div class="card-body">
    <h5 class="card-title">Текст 1</h5>
    <button type="button" class="btn btn-outline-secondary" data-del="delete">Удалить</button>
  </div>
</div>
<div class="card show">
  <div class="card-body">
    <h5 class="card-title">Текст 2</h5>
    <button type="button" class="btn btn-outline-secondary" data-del="delete">Удалить</button>
  </div>
</div>
<div class="card show">
  <div class="card-body">
    <h5 class="card-title">Текст 3</h5>
    <button type="button" class="btn btn-outline-secondary" data-del="delete">Удалить</button>
  </div>
</div>
<div class="card show">
  <div class="card-body">
    <span class="separator mx-auto"></span>
    <h5 class="card-title">Текст 4</h5>
    <button type="button" class="btn btn-outline-secondary" data-del="delete">Удалить</button>
 </div>
</div>
</body>
</html>
Ответить с цитированием
  #2 (permalink)  
Старый 21.02.2020, 08:23
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

Katy93,
класс текстовым блокам можно присвоить?
Ответить с цитированием
  #3 (permalink)  
Старый 21.02.2020, 08:38
Кандидат Javascript-наук
Отправить личное сообщение для Katy93 Посмотреть профиль Найти все сообщения от Katy93
 
Регистрация: 28.12.2018
Сообщений: 138

Да, конечно.
Ответить с цитированием
  #4 (permalink)  
Старый 21.02.2020, 08:53
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

Katy93,
<!DOCTYPE html>
<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
<style>
body {
    display: flex;
}

.card {
    text-align: center;
    border: 1px solid #000;
    background: #ccc;
}

</style>
<script>
document.addEventListener( "DOMContentLoaded" , function() {
 const on = (parent, event, selector, fn) => parent.addEventListener(event, ({target}) => {
     if(target = target.closest(selector)) fn(target)
 })
 const remove = del => {
 const card = del.closest(".card.show");
 const index = [...document.querySelectorAll(".card.show")].indexOf(card);
 card.remove();
 document.querySelectorAll(".txt")[index].remove();
 };
 on(document, "click", ".card.show [data-del]", remove);
  });
</script>
</head>
<body>
    <div class="txt">Текст 1_1</div>
    <div class="txt">Текст 1_2</div>
    <div class="txt">Текст 1_3</div>
    <div class="txt">Текст 1_4</div>
<div class="card show">
    <div class="card-body">
        <h5 class="card-title">Текст 1</h5>
        <button type="button" class="btn btn-outline-secondary" data-del="delete">Удалить</button>
    </div>
</div>
<div class="card show">
    <div class="card-body">
        <h5 class="card-title">Текст 2</h5>
        <button type="button" class="btn btn-outline-secondary" data-del="delete">Удалить</button>
    </div>
</div>
<div class="card show">
    <div class="card-body">
        <h5 class="card-title">Текст 3</h5>
        <button type="button" class="btn btn-outline-secondary" data-del="delete">Удалить</button>
    </div>
</div>
<div class="card show">
    <div class="card-body">
        <span class="separator mx-auto"></span>
        <h5 class="card-title">Текст 4</h5>
        <button type="button" class="btn btn-outline-secondary" data-del="delete">Удалить</button>
 </div>
</div>
</body>
</html>
Ответить с цитированием
  #5 (permalink)  
Старый 23.02.2020, 01:07
Кандидат Javascript-наук
Отправить личное сообщение для Katy93 Посмотреть профиль Найти все сообщения от Katy93
 
Регистрация: 28.12.2018
Сообщений: 138

Я проверила ваш пример, на Windows XP, с установленными последними версиями браузеров. Только на FireFox, работает нормально на Chrome и Opera не работает. Выдаёт ошибку:
Цитата:
Uncaught TypeError: (var)[Symbol.iterator] is not a function
.
Всё таки мне бы хотелось пример, который работал и под Windows XP. Операционка хоть и старая но по моей статистики вебвизор показывает, что ей до сих пор пользуются. Я решила пример вот так присвоив id как кнопки так и внешним блокам при нажатии поиск осуществляется по id, а потом удаляется.
Вот пример:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<meta name="description" content="" />
<meta name="keywords" content="" />
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<style>
body {
    display: flex;
}

.card {
  text-align: center;
  border: 1px solid #000;
  background: #ccc;
}

</style>
<script>
$(document).ready(function(e){


function removeElem(delElem, attribute, attributeName) {      

  if (!(delElem && attribute && attributeName)) return;
  return function(e) {
     
    let target = e.target;


    if (!(target.hasAttribute(attribute) ?
        (target.getAttribute(attribute) === attributeName ? true : false) : false)) return;
    let elem = target;
    

    while (target != this) {
      if (target.classList.contains(delElem)) {
        target.remove();
        document.getElementById(elem.getAttribute('id')).remove();
        return;
      }
      target = target.parentNode;
    }
    return;
  };
}




document.addEventListener("click", removeElem("card", "data-del", "delete"));
});

</script>

</head>
<body>
  <div id="test1">Текст 1_1</div>
  <div id="test2">Текст 1_2</div>
  <div id="test3">Текст 1_3</div>
  <div id="test4">Текст 1_4</div>
<div class="card show">
  <div class="card-body">
    <h5 class="card-title">Текст 1</h5>
    <button id="test1" type="button" class="btn btn-outline-secondary" data-del="delete">Удалить</button>
  </div>
</div>
<div class="card show">
  <div class="card-body">
    <h5 class="card-title">Текст 2</h5>
    <button id="test2" type="button" class="btn btn-outline-secondary" data-del="delete">Удалить</button>
  </div>
</div>
<div class="card show">
  <div class="card-body">
    <h5 class="card-title">Текст 3</h5>
    <button id="test3" type="button" class="btn btn-outline-secondary" data-del="delete">Удалить</button>
  </div>
</div>
<div class="card show">
  <div class="card-body">
    <span class="separator mx-auto"></span>
    <h5 class="card-title">Текст 4</h5>
    <button id="test4" type="button" class="btn btn-outline-secondary" data-del="delete">Удалить</button>
 </div>
</div>
</body>
</html>

Последний раз редактировалось Katy93, 23.02.2020 в 01:12.
Ответить с цитированием
  #6 (permalink)  
Старый 23.02.2020, 10:17
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Дело не в операционке, а в версиях браузеров.
Возьмите последние версии Хрома и Оперы

Но в ИЕ все это все равно работать не будет
Вот это ИЕ не возьмет
const card = del.closest(".card.show");
const index = [...document.querySelectorAll(".card.show")].indexOf(card);
card.remove();

Если очень надо, ищете полифилы.
По мне так очень странно писать код в расчете на ИЕ-6 и НетскейпНавигатор.

if (target.classList.contains(delElem)) Тоже не будет работать в ИЕ <10. А 10 и 11 нет в ХР

Последний раз редактировалось voraa, 23.02.2020 в 10:30.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отловить событие с сайта, при нажатии кнопки на Гарнитуре Nickon Events/DOM/Window 2 16.10.2018 09:51
Появление кнопки «удалить отмеченные» при нажатии одного checkbox zoOmer Общие вопросы Javascript 11 20.11.2014 16:29
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Блок должен перемещаться из одной точки в другую, а при повторном нажатии обратно Ser12345678 jQuery 2 17.07.2012 12:18
глюк форума Gvozd Сайт Javascript.ru 11 18.03.2009 14:37