自动删除特定 HTML 元素时如何触发事件?

Posted

技术标签:

【中文标题】自动删除特定 HTML 元素时如何触发事件?【英文标题】:How to trigger an event when a particular HTML element is removed automatically? 【发布时间】:2018-02-11 17:58:41 【问题描述】:

代码概述:此代码包含一个可编辑的 div 部分。在 div 下方,有一个按钮,用于创建 span 元素,在 span 元素中插入文本“tag”,最后将 span 元素附加到该可编辑 div 中

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
    <style type="text/css">
        #sample-div
        
            border-style: solid;
            border-width: 1px;
            border-color: black;
            height:100px;
            overflow: auto;
        
    </style>
    <script type="text/javascript">
        function addTags()
        
            var tag = document.createElement("span");
            tag.className = "$(tag)"
            tag.innerHTML = "tag";
            tag.contentEditable = false;
            $('#sample-div').append(tag);
        

        $(document).ready(function()
            $('span').keyup(function()
                if(!this.value)
                
                    alert('this is empty');
                
            );
        );
    </script>
</head>
<body>
 <div id="sample-div" contenteditable="true"></div>
 <input type="button" value="date" id="sample-tags" onclick="addTags()">
</body>
</html>

一般观察:当我在 div 中输入内容然后单击按钮时,HTML DOM 将变为:

<div id="sample-div" contenteditable="true">
    this is a <span class="$(tag)" contenteditable="false">tag</span>
</div>

请注意,文本“this is a”是我在 div 元素中键入时提供的。当我点击输入按钮时出现“标签”

期望/尝试实现:当我删除span中的文本时,DOM会变成:

<div id="sample-div" contenteditable="true">
    this is a
</div>  

所以,我的目标是在删除 span 中的文本时获取元素 span 被删除的信息。我试图通过执行以下操作来实现这一点,这是不正确的:

$(document).ready(function()
    $('span').keyup(function()
        if(!this.value)
        
            alert('this is empty');
        
    );
);

所以,我的问题是如何在 DOM 删除 span 元素时收到“这是空的”消息?

【问题讨论】:

【参考方案1】:

您可以将变量用作“标记”计数器。 当 div 中出现的数量标签低于标签计数器时,即被删除。

var tagCount = 0;

function addTags()
  var tag = document.createElement("span");
  tag.className = "$(tag)"
  tag.innerHTML = "tag";
  tag.contentEditable = false;
  $('#sample-div').append(tag);
  
  // Increment tagCount
  tagCount++;



$(document).ready(function()

  $('#sample-div').keyup(function()
    if($(this).find("span").length < tagCount)
      alert('One tag was removed');
      
      // Decrement tagCount
      tagCount--;
    
  );

); // Ready
#sample-div
  border-style: solid;
  border-width: 1px;
  border-color: black;
  height:100px;
  overflow: auto;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="sample-div" contenteditable="true"></div>
 <input type="button" value="date" id="sample-tags" onclick="addTags()">

【讨论】:

tagCount = $(this).find("span").length 可以避免同时删除多个跨度的问题。【参考方案2】:

你可能应该使用MutationObserver

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title></title>
    <style type="text/css">
        #sample-div
        
            border-style: solid;
            border-width: 1px;
            border-color: black;
            height:100px;
            overflow: auto;
        
    </style>
</head>
<body>
    <div id="sample-div" contenteditable="true"></div>
    <input type="button" value="date" id="sample-tags" onclick="addTags()">
    <script type="text/javascript">

        'use strict';

        function addTags()
        
            var tag = document.createElement("span");
            tag.className = "$(tag)"
            tag.innerHTML = "tag";
            tag.contentEditable = false;
            document.getElementById('sample-div').appendChild(tag);
        

        function onTagRemoved(node)
        
            alert(`node $node.tagName.$node.className removed`);
        

        //
        // https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
        //

        // select the target node
        let target = document.querySelector('#sample-div');

        // create an observer instance
        let observer = new MutationObserver(function(mutations) 
            mutations.forEach(function(mutation) 

                // console.log(mutation);

                let node = null;
                for (var i = 0; i < mutation.removedNodes.length; i++) 
                    node = mutation.removedNodes[i];
                    if (/span/i.test(node.tagName)) 
                        onTagRemoved(node);
                    
                
            );
        );

        // configuration of the observer:
        let config =  attributes: false, childList: true, characterData: false 

        // pass in the target node, as well as the observer options
        observer.observe(target, config);

        // later, you can stop obser
        // observer.disconnect();

    </script>
</body>
</html>

在 Firefox 52 上测试

【讨论】:

以上是关于自动删除特定 HTML 元素时如何触发事件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Postgres 和 GraphQL 在特定日期自动触发事件?

layui如何自动触发change事件,可以用jquery的change吗?

html 如何设置打开网页时自动触发按钮的单击事件

HTML DOM Event对象

仅当鼠标悬停在元素上至少特定时间时,如何触发 MouseMove 事件?

在页面内容更改时停止自动滚动