您当前的位置: 首页 >  前端

HM-hhxx!

暂无认证

  • 4浏览

    0关注

    123博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

前端学习第二十三课(WebAPIs-节点操作、事件高级、鼠标事件)

HM-hhxx! 发布时间:2022-04-30 22:13:21 ,浏览量:4

目录

1.1节点操作

1.1.1 删除节点

1.1.2 删除留言案例

1.1.3 复制(克隆)节点

1.1.4 创建元素的三种方式

1.1.5  innerTHML和createElement效率对比

1.2.1 创建

1.2.2 增加

1.2.3 删

1.2.4 改

1.2.5 查

1.2.6 属性操作

1.3事件高级

1.3.1 注册事件(2种方式)

1.3.2 事件监听

1.3.3 删除事件(解绑事件)

1.3.4 DOM事件流

1.3.5 事件对象

1.3.6 阻止默认行为

1.3.7 阻止事件冒泡

1.3.8 事件委托

 1.4 常用鼠标事件

​1.4.1 案例:禁止选中文字和禁止右键菜单

1.4.2 鼠标事件对象

​1.4.3 获取鼠标在页面的坐标

1.1节点操作 1.1.1 删除节点

node.removeChild() 方法从 node节点中删除一个子节点,返回删除的节点。

例如:

    删除
    
  • 熊大
  • 熊二
  • 光头强
// 1.获取元素 var ul = document.querySelector('ul'); var btn = document.querySelector('button'); // 2. 删除元素 node.removeChild(child) // ul.removeChild(ul.children[0]); // 3. 点击按钮依次删除里面的孩子 btn.onclick = function() { if (ul.children.length == 0) { this.disabled = true; } else { ul.removeChild(ul.children[0]); } }
1.1.2 删除留言案例
    
    发布
    
// 1. 获取元素 var btn = document.querySelector('button'); var text = document.querySelector('textarea'); var ul = document.querySelector('ul'); // 2. 注册事件 btn.onclick = function() { if (text.value == '') { alert('您没有输入内容'); return false; } else { // console.log(text.value); // (1) 创建元素 var li = document.createElement('li'); // 先有li 才能赋值 li.innerHTML = text.value + "删除"; // (2) 添加元素 // ul.appendChild(li); ul.insertBefore(li, ul.children[0]); // (3) 删除元素 删除的是当前链接的li 它的父亲 var as = document.querySelectorAll('a'); for (var i = 0; i < as.length; i++) { as[i].onclick = function() { // 删除的是 li 当前a所在的li this.parentNode; ul.removeChild(this.parentNode); } } } }

案例分析:

当我们把文本域里面的值赋值给li的时候,多添加一个删除的链接;

需要把所有的链接获取过来,当我们点击当前的链接的时候,删除当前链接所在的li;

组织链接跳转需要添加javascript:void(0);或者javascript:;

1.1.3 复制(克隆)节点

node.cloneNode()

该方法返回调用该方法的节点的一个副本。也称为克隆节点或拷贝节点。

注意:

1)如果括号参数为空或者false,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点。

2)如果括号参数为true,则是深度拷贝,恢复至节点本身及里面所有的子节点。

例如:

    
  • 1111
  • 2
  • 3
var ul = document.querySelector('ul'); // 1. node.cloneNode(); 括号为空或者里面是false 浅拷贝 只复制标签不复制里面的内容 // 2. node.cloneNode(true); 括号为true 深拷贝 复制标签复制里面的内容 var lili = ul.children[0].cloneNode(true); ul.appendChild(lili);
1.1.4 创建元素的三种方式

document.write();

element.innerHTML;

document.createElement();

区别: 1)document.write是直接将内容写入页面的内容流,但是文档流执行完毕,则他会导致页面全部重绘。

2)innerHTML是将内容写入某个DOM节点,不会导致页面全部重绘。

3)innerHTML创建多个元素效率更高(不要拼接字符串,采取数组形式拼接),结构稍微复杂。

4)createElement()创建多个元素效率稍微低一点点,但是结构更清晰。

因此,在不同的浏览器下,innerHTML效率比createElement高。

例如:  

 
        // 三种创建元素方式区别 
        // 1. document.write() 创建元素  如果页面文档流加载完毕,再调用这句话会导致页面重绘
         var btn = document.querySelector('button');
         btn.onclick = function() {
             document.write('
123
'); } // 2. innerHTML 创建元素 var inner = document.querySelector('.inner'); for (var i = 0; i html -> document var son = document.querySelector('.son'); // 给son注册单击事件 son.addEventListener('click', function() { alert('son'); }, false); // 给father注册单击事件 var father = document.querySelector('.father'); father.addEventListener('click', function() { alert('father'); }, false); // 给document注册单击事件,省略第3个参数 document.addEventListener('click', function() { alert('document'); })

 事件捕获:

    
son盒子
// 如果addEventListener() 第三个参数是 true 那么在捕获阶段触发 // document -> html -> body -> father -> son var son = document.querySelector('.son'); // 给son注册单击事件,第3个参数为true son.addEventListener('click', function() { alert('son'); }, true); var father = document.querySelector('.father'); // 给father注册单击事件,第3个参数为true father.addEventListener('click', function() { alert('father'); }, true); // 给document注册单击事件,第3个参数为true document.addEventListener('click', function() { alert('document'); }, true)
1.3.5 事件对象

事件发生后,跟事件相关的一系列信息数据的集合都放到这个对象里面,这个对象就是事件对象。

比如:

  1. 谁绑定了这个事件。

  2. 鼠标触发事件的话,会得到鼠标的相关信息,如鼠标位置。

  3. 键盘触发事件的话,会得到键盘的相关信息,如按了哪个键。

事件对象的使用

事件触发发生时就会产生事件对象,并且系统会以实参的形式传给事件处理函数。

所以,在事件处理函数中声明1个形参用来接收事件对象。

 

事件对象的兼容性处理

事件对象本身的获取存在兼容问题:

  1. 标准浏览器中是浏览器给方法传递的参数,只需要定义形参 e 就可以获取到。

  2. 在 IE6~8 中,浏览器不会给方法传递参数,如果需要的话,需要到 window.event 中获取查找。

 

 只要“||”前面为false, 不管“||”后面是true 还是 false,都返回 “||” 后面的值。  只要“||”前面为true, 不管“||”后面是true 还是 false,都返回 “||” 前面的值。

 

123
            var div = document.querySelector('div');         div.onclick = function(e) {                 // 事件对象                 e = e || window.event;                 console.log(e);         }    

 事件对象的属性和方法

e.target 和 this 的区别

  • this 是事件绑定的元素(绑定这个事件处理函数的元素) 。

  • e.target 是事件触发的元素。

常情况下terget 和 this是一致的, 但有一种情况不同,那就是在事件冒泡时(父子元素有相同事件,单击子元素,父元素的事件处理函数也会被触发执行),这时候this指向的是父元素,因为它是绑定事件的元素对象,而target指向的是子元素,因为他是触发事件的那个具体元素对象。

    
123
var div = document.querySelector('div'); div.addEventListener('click', function(e) { // e.target 和 this指向的都是div console.log(e.target); console.log(this); });

 事件冒泡下的e.target和this

    
  • abc
  • abc
  • abc
var ul = document.querySelector('ul'); ul.addEventListener('click', function(e) { // 我们给ul 绑定了事件 那么this 就指向ul console.log(this); // ul // e.target 触发了事件的对象 我们点击的是li e.target 指向的就是li console.log(e.target); // li });
1.3.6 阻止默认行为

html中一些标签有默认行为,例如a标签被单击后,默认会进行页面跳转。

    百度
    
        // 2. 阻止默认行为 让链接不跳转 
        var a = document.querySelector('a');
        a.addEventListener('click', function(e) {
             e.preventDefault(); //  dom 标准写法
        });
        // 3. 传统的注册方式
        a.onclick = function(e) {
            // 普通浏览器 e.preventDefault();  方法
            e.preventDefault();
            // 低版本浏览器 ie678  returnValue  属性
            e.returnValue = false;
            // 我们可以利用return false 也能阻止默认行为 没有兼容性问题
            return false;
        }
    
1.3.7 阻止事件冒泡

事件冒泡本身的特性,会带来的坏处,也会带来的好处。

标准写法:利用事件对象里面的stopPropagation()方法

e.stopPropagation()

非标准写法:IE6-8利用事件对象cancelBubble属性

e.cancelBubble = true;

    
son儿子
var son = document.querySelector('.son'); // 给son注册单击事件 son.addEventListener('click', function(e) { alert('son'); e.stopPropagation(); // stop 停止 Propagation 传播 window.event.cancelBubble = true; // 非标准 cancel 取消 bubble 泡泡 }, false); var father = document.querySelector('.father'); // 给father注册单击事件 father.addEventListener('click', function() { alert('father'); }, false); // 给document注册单击事件 document.addEventListener('click', function() { alert('document'); })
1.3.8 事件委托

事件委托就是把事情委托给别人,代为处理。事件委托也称为事件代理,在 jQuery 里面称为事件委派。 说白了就是,不给子元素注册事件,给父元素注册事件,把处理代码在父元素的事件中执行。

事件委托的原理

给父元素注册事件,利用事件冒泡,当子元素的事件触发,会冒泡到父元素,然后去控制相应的子元素。

事件委托的作用

  • 我们只操作了一次 DOM ,提高了程序的性能。

  • 动态新创建的子元素,也拥有事件。

    
  • 知否知否,点我应有弹框在手!
  • 知否知否,点我应有弹框在手!
  • 知否知否,点我应有弹框在手!
  • 知否知否,点我应有弹框在手!
  • 知否知否,点我应有弹框在手!
// 事件委托的核心原理:给父节点添加侦听器, 利用事件冒泡影响每一个子节点 var ul = document.querySelector('ul'); ul.addEventListener('click', function(e) { // e.target 这个可以得到我们点击的对象 e.target.style.backgroundColor = 'pink'; })
 1.4 常用鼠标事件 1.4.1 案例:禁止选中文字和禁止右键菜单

 例如:


    我是一段不愿意分享的文字
    
        // 1. contextmenu 我们可以禁用右键菜单
        document.addEventListener('contextmenu', function(e) {
                e.preventDefault();
        })
        // 2. 禁止选中文字 selectstart
        document.addEventListener('selectstart', function(e) {
            e.preventDefault();
        })
    
1.4.2 鼠标事件对象 1.4.3 获取鼠标在页面的坐标
   
        // 鼠标事件对象 MouseEvent
        document.addEventListener('click', function(e) {
            // 1. client 鼠标在可视区的x和y坐标
            console.log(e.clientX);
            console.log(e.clientY);
            console.log('---------------------');

            // 2. page 鼠标在页面文档的x和y坐标
            console.log(e.pageX);
            console.log(e.pageY);
            console.log('---------------------');

            // 3. screen 鼠标在电脑屏幕的x和y坐标
            console.log(e.screenX);
            console.log(e.screenY);

        })
    
关注
打赏
1663160980
查看更多评论
立即登录/注册

微信扫码登录

4.2785s