Событие DOM при удалении элемента - PullRequest
0 голосов
/ 16 октября 2018

Есть ли способ получить уведомление, когда элемент удаляется из DOM, напрямую или как часть поддерева ?Кажется, что единственные доступные методы предназначены только для непосредственно удаленных узлов, но я хотел бы получить уведомление, когда удаляется целое поддерево, содержащее мой узел.

EDIT

Кажется, проблема не совсем ясна, поэтому я сделал вызов: https://jsbin.com/winukaf

DOM выглядит так:

<body>
  <div class="root">
    <div class="great-grand-parent">
      <div class="grand-parent">
        <div class="parent">
          <div class="leaf">
            Am I still here?
          </div>
        </div>
      </div>
    </div>
  </div>
</body>

, и задача состоит в том, чтобы уведомлять, когдаодин из элементов здесь удаляется, так как это удалит листовой узел из дерева DOM.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Вы должны использовать MutationObserver API для этого.Вот пример MDN, адаптированный к простому сценарию:

// Select the node that will be observed for mutations
var targetNode = document.getElementsByClassName('root')[0];

// Options for the observer (which mutations to observe)
var config = {
  childList: true,
  subtree: true
};

// Callback function to execute when mutations are observed
var callback = function(mutationsList, observer) {
  console.log('A child node has been added or removed.');
  console.log(mutationsList[0]);
};

// Create an observer instance linked to the callback function
var observer = new MutationObserver(callback);

// Start observing the target node for configured mutations
observer.observe(targetNode, config);

var subElement = document.getElementsByClassName('parent')[0];
var elementToRemove = document.getElementsByClassName('leaf')[0];
var anotherElement = document.getElementsByClassName('great-grand-parent')[0];
setTimeout(function() {
  subElement.removeChild(elementToRemove);
}, 500);
setTimeout(function() {
  targetNode.removeChild(anotherElement);
}, 500);

// Later, you can stop observing
// observer.disconnect();
<div class="root">
  <div class="great-grand-parent">
    <div class="grand-parent">
      <div class="parent">
        <div class="leaf">
          Am I still here?
        </div>
      </div>
    </div>
  </div>
</div>
0 голосов
/ 16 октября 2018

Существует HTML5 API с именем MutationObserver , и он имеет довольно хорошую поддержку

Вот пример:

// Element is the whatever subtree/element you need to watch over
var in_dom = document.body.contains(element);
var observer = new MutationObserver(function(mutations) {
    if (document.body.contains(element)) {
        if (!in_dom) {
            console.log("element inserted");
        }
        in_dom = true;
    } else if (in_dom) {
        in_dom = false;
        console.log("element removed");
    }

});
observer.observe(document.body, {childList: true, subtree: true});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...