JavaScript 事件——“事件类型”中“复合事件”和“变动事件”的注意要点

砾岩递归
• 阅读 6427

复合事件

复合事件是DOM3级事件中心添加的一类事件,用于处理IME的输入序列。

compositionstartcompositionupdatecompositionend

复合事件有以下三中:

  • compositionstart:要开始输入;

  • compositionupdate:插入新字符;

  • compositionend:复合系统关闭,返回正常键盘输入状态;

event.data

data属性:

  • compositionstart访问data:正在编辑的文本;

  • compositionupdate访问data:正插入的新字符;

  • compositionend访问data:插入的所有字符;

如:

<input type="text" id="name">
<input type="text" id="value" value="">

js:

var inputName = document.getElementById("name");
var value = document.getElementById("value");
// inputName.addEventListener("compositionstart", function () {
//     inputName.style.backgroundColor = "red";
//     value.value = event.data;
// });
inputName.addEventListener("compositionupdate", function () {
    inputName.style.backgroundColor = "yellow"; //开始编辑,背景变成黄色
    value.value = event.data; //第二个textbox显示正在编辑的字符
});
inputName.addEventListener("compositionend", function () {
    inputName.style.backgroundColor = "white"; //编辑完毕,背景变成白色
    value.value = event.data; //第二个textbox显示输入的最终字符
});

变动事件(貌似作废了很多变动事件,跨浏览器不好,不建议用)

变动事件,能在DOM中的某一部分发生变化时给出提示。

主要有:

  • DOMNodeInserted:在一个节点作为子节点被插入到另一个节点中时;

  • DOMNodeRemoved:在节点从其父节点中被移除时;

  • DOMNodeInsertedIntoDocument:在一个节点被直接插入文档,或通过子树间接插入文档之后触发。这个事件在DOMNodeInserted之后触发;

  • DOMNodeRemovedFromDocument:在一个节点被直接从文档中移除,或通过子树间接从文档中移除之前触发。这个事件在DOMNodeRemoved之后触发;

  • DOMSubtreeModified:在DOM结构中发生任何变化时触发;

  • DOMAttrModified:在特性被修改之后触发;

  • DOMCharacterDataModified:在文本节点的值发声变化时触发;

删除节点DOMNodeRemoved事件

当使用removeChild()或replaceChild()从DOM中删除节点,首先触发DOMNodeRemoved事件(event.target是被删除的节点,event.relatedNode属性包含对目标节点父节点的引用,在这个事件触发时,节点尚未从父节点中删除,因此其parentNode属性与event.relatedNode相同),这个事件会冒泡;其次继而触发DOMNodeRemovedFromDocument事件(event.target是被移除的节点,除此之外没有别的信息在event对象中),这个事件不回冒泡;最后触发DOMSubtreeModified事件(event.target是被移除的节点的父节点,除此之外没有别的信息在event对象中)。

如:

<ul id="list">
    <li>list item1</li>
    <li>list item2</li>
    <li>list item3</li>
</ul>

js:

var list = document.querySelector("#list");
//为每一个li添加一个新事件,点击后被移除;
for (var i = 0, len = list.getElementsByTagName("li").length; i < len; i++) {
    list.getElementsByTagName("li")[i].addEventListener("click", function() {
        this.parentNode.removeChild(this);
    });
};
//为list添加一个新事件,当检测到DOM变动的时候,改变css值
list.addEventListener("DOMNodeRemoved", function() {
    var style = event.relatedNode.style;
    style.border = "1px solid gray";
    var x = setTimeout(function () {
        style.border = "1px solid white";
    }, 1000);
});

又如:

var list = document.querySelector("#list");
var item = list.getElementsByTagName("li");
//为每一个li添加一个新事件,点击后被移除;
for (var i = 0; i < item.length; i++) {
    item[i].addEventListener("click", function() {
        this.parentNode.removeChild(this);
    });
    item[i].addEventListener("DOMNodeRemoved", function() { //DOMNodeRemoved事件
        console.log(event.target.tagName + " going to be removed"); //LI going to be removed 目标是li
    });

};
// list.addEventListener("DOMRemovedFromDocument", function() {
//     console.log("removed");
// });
list.addEventListener("DOMSubtreeModified", function() {
    console.log(event.target.tagName + " modified"); //UL modified 目标是Ul
})

插入节点DOMNodeInserted事件

在使用appendChild()、replaceChild()或insertBefore()向DOM中插入节点时,首先会触发DOMNodeInserted事件(event.target是被插入的节点,event.relatedNode是包含一个对父节点的引用,触发这个事件时,节点已经被插入到了新的父节点中),该事件冒泡;然后触发DOMNodeInsertedIntoDocument事件,这个事件不冒泡,因此必须在插入节点之前为它添加这个事件处理程序。最后一个触发的事件是DOMSubtreeModified,触发于新插入节点的父节点。

下面是一个todoList:

style部分:

<style>
*{
    margin:0;
    padding:0;
    font-family: monospace;
}
body{
    background-color:#ccc;
}
#info{
    color:white;
    width:100%;
    height:1em;
    padding:0.3em;
    position:absolute;
    top:-1.6em;
}
li{
    background-color:white;
    margin-top:2em;
    padding:1em;
    width:80%;
    box-shadow: 2px 2px 2px gray;
    max-height:20em;
    list-style-type:none;
    margin-left:auto;
    margin-right:auto;
    overflow:scroll;
}
#btn{
    margin-top:2em;
}
</style>

dom部分:

<div id="info">
    <p class="note">infomation</p>
</div>
<input type="button" value="new item" id="btn">
<ul id="list">
</ul>

js部分:

<script type="text/javascript">
//设置变量
var list = document.querySelector("#list");
var item = list.getElementsByTagName("li");
var btn = document.getElementById("btn");
var info = document.querySelector("#info");
var note = document.querySelector("#info").querySelector(".note");
//添加新的任务
btn.onclick = function() {
    //输入新的任务字符串
    var newItemValue = prompt("输入新的任务");
    if (newItemValue == null || newItemValue == "") {
        return false;
    }
    // 创建新任务列表
    var newLi = document.createElement("li");
    newLi.appendChild(document.createTextNode(newItemValue))
    list.appendChild(newLi);
    //为添加的新任务赋予删除功能
    newLi.addEventListener("dblclick", function() {
        this.parentNode.removeChild(this);
    });
    //为添加的新任务赋予删除提醒功能
    newLi.addEventListener("DOMNodeRemoved", function() { //DOMNodeRemoved事件
        message("orangered",1.6,"已删除");
    });
};
//当list添加新任务时,发出提醒
list.addEventListener("DOMNodeInserted", function() {
    message("skyblue",1.6,"新建成功");
});
// 当Ul DOM改变时,发出提醒
list.addEventListener("DOMSubtreeModified", function() {
    console.log("updated"); //UL modified 目标是Ul
})
//消息提醒
function message (color,top,infomation) {
    note.firstChild.nodeValue = infomation;
    info.style.backgroundColor = color;
    var showing = setTimeout(function () {
        info.style.top = "0em";
        var hiding = setTimeout(function  () {
            info.style.top = -top + "em";
        }, 3000);
    }, 0);
}
</script>
点赞
收藏
评论区
推荐文章
Dax Dax
4年前
jQuery 的事件绑定和事件委托(事件代理)
简单以jQuery的on()方法为例说明:API:1.on(events,selector,data,handler) 如果on()方法的selector参数为空,事件处理程序就被称为直接绑定。每当在被绑定元素上(如下例中被绑定的document元素,译者注)发生事件时,无论这个事件发生在这个元素上还是从内层元素经冒泡而
Python进阶者 Python进阶者
4年前
一文解读JavaScript事件对象和表单对象
前言相信做网站对JavaScript再熟悉不过了,它是一门脚本语言,不同于Python的是,它是一门浏览器脚本语言,而Python则是服务器脚本语言,我们不光要会Python,还要会JavaScript,因为它对做网页方面是有很大作用的。1.事件对象(Event)1).事件对象常量bubbles事件是否是起泡事件类型cancelabl
Wesley13 Wesley13
4年前
jabdp宝典:新版事件编辑
         低代码开发平台jabdp的页面事件编辑迎来了重大更新,本次更新对事件编辑进行了许多优化。好了废话不多说,就让小编带大伙来了解下新版事件编辑吧!(新版)事件编辑        Jabdp平台的javascript编程是基于事件驱动的,所谓事件驱动,就是指在页面中执行了某种操作所产生的动作,就称为“事件”(Event)。比如
Stella981 Stella981
4年前
JQuery中对option的添加、删除、取值
jQuery获取Select选择的Text和Value:1\.$("select\_id").change(function(){//code...});  //为Select添加事件,当选择其中一项时触发2\.varcheckText$("select\_id").find("option:selected").text();  
Stella981 Stella981
4年前
JavaScript事件
事件通常与函数配合使用,这样就可以通过发生的事件来驱动函数执行。FF:Firefox,N:Netscape,IE:InternetExplorer属性当以下情况发生时,出现此事件     FF  N   IEonabort图像加载被中断134onblur元素失去焦点1
Wesley13 Wesley13
4年前
JS的事件冒泡和事件捕获
什么是事件?事件是文档和浏览器窗口中发生的特定的交互瞬间。事件是javascript应用跳动的心脏,也是把所有东西黏在一起的胶水,当我们与浏览器中web页面进行某些类型的交互时,事件就发生了。事件可能是用户在某些内容上的点击,鼠标经过某个特定元素或按下键盘上的某些按键,事件还可能是web浏览器中发生的事情,比如说某
Stella981 Stella981
4年前
JavaScript事件详解
1.事件传播机制:事件冒泡,事件捕获。2.注册事件处理程序方式:设置html标签属性为事件处理程序,文档元素的事件处理程序属性,名字由“on”后面跟着事件名组成,例如:onclick,onmouseover,用法如下1<d
Stella981 Stella981
4年前
Noark入门之异步事件
引入异步事件主要是为了各模块的解耦,每当完成一个动作时,向系统发布一个事件,由关心的模块自己监听处理,可选择同步处理,异步处理,延迟处理。何时发布事件,当其他模块关心此动作时<br比如获得道具时,任务系统模块要判定完成进度,BI模块需要上报等等都可以监听此事件,已达模块解耦0x00事件源一个实现xyz.noark.core.event
Stella981 Stella981
4年前
JavaScript事件 ——常见事件
1.什么是事件?      当我们与浏览器中Web页面进行某些类型的交互时,事件就发生了。事件可能是用户在某些内容上的点击、鼠标经过某个特定元素或按下键盘上的某些按键。事件还可能是Web浏览器中发生的事情,比如说某个Web页面加载完成,或者是用户滚动窗口或改变窗口大小。常见事件:(http://www.runoo
Stella981 Stella981
4年前
JavaScript——页面相关事件
页面事件是在页面加载或改变浏览器的大小、位置,以及对页面中的滚动条进行操作时,所触发的事件处理程序。加载与卸载事件加载事件(onload)是在网页加载完毕后触发相应的事件处理程序,它可以在网页加载完成后对网页中的表格样式、字体、背景颜色等进行设置。卸载事件(unload)是在卸载网页时触发相应的事件处理程序,卸载网页是指关闭当前页或
Stella981 Stella981
4年前
Javascript高级编程学习笔记(57)—— 事件(1)事件流
事件JS与HTML的交互是通过事件实现的而事件指的就是:文档或浏览器窗口特定的交互瞬间可以通过侦听器来预定事件,以便在事件发生时执行相应的代码这种模式也是设计模式中的观察者模式事件流有了事件,也就有了事件流的概念事件流故名思意:也就是事件的流向,所以事件流描述的是从页面中接收事件的顺序虽然事件流描述的都是事件的流