• jQuery事件


    事件

    在页面加载后执行任务

    时机选择

    • 原生window.onload:完全下载完页面全部元素时触发
    • $(document).ready()注册的事件,DOM就绪时触发,不用等文件下载完(没下载完时,图像宽高这样的属性不一定能访问)。
    • 加载样式与执行代码: 将<link rel="stylesheet">标签和<style>标签放在<script>标签之前。确保JavaScript代码执行之前已经应用了样式。

    基于一个页面执行多个脚本

    • 函数引用 window.onload = doStuff;(只是函数标识)
    • 函数调用 doStaff();(函数会立即执行)
    • window.onload = doStuff; window.onload = doOtherStaff;第二个会覆盖第一个函数。
    • $(document).ready(),不会覆盖,每次调用会向内部的行为队列添加一个新函数。页面加载完后这些函数会依次执行。

    .ready()的简写形式

    • $(document).ready(function(){//代码}) (推荐,语义更清楚)
    • <=>
    • $(function(){//代码})

    处理简单的事件

    简单的样式转换器

    $(document).ready(function(){
        $('#switcher-large').on('click',function(){
            $('body').addClass('large');
        });
    });

    多次调用.on()即可为同一个事件追加更多行为。

    利用事件处理程序的上下文

    • 使用$(this)可以简化代码
    $('#switcher button').on('click',function(){
        $('#swithcher button').removeClass('selected');
        $(this).addClass('selected');
       })
    • removeClass()不加参数时默认移除所有类。
    • this访问DOM元素属性:this.id.split('-')[1];

    简写的事件

    • .on('click',...) =>.click(...)
    • 类似的blur,keydown,scroll等标准DOM事件。

    显示和隐藏高级特性

    .hidden{
        display: none;
    }

    toggleClass()能够根据相应的类是否存在来添加或者删除类。

    $(document).ready(function(){
        $('#switcher h3').click(function(){
          $('#switcher button').toggleClass('hidden);
        });
    });

    事件传播

    CSS规范加入了一个名叫:hover的伪类选择符,可以在鼠标悬停时,影响元素外观。 jQuery的.hover方法,可以在鼠标进入和离开元素时,通过js改变元素的样式(或者其他任意操作)。

    .hover {
        curser: pointer;
        background-color: #afa;
    }
    $(document).ready(function({
       $('#switcher h3').hover(function(){
           $(this).addClass('hover');    //->鼠标指针进
       },function(){
           $(this).removeClass('hover'); //->鼠标指针出
       }); 
    });
    );

    使用.hover()也意味着可以避免js中的事件传播导致的问题。

    事件的旅行

    • 事件捕获:事件从外层元素到具体元素。
    • 事件冒泡:事件从具体元素到上层元素。
    • DOM标准规定同时使用两种策略:首先事件从一般到具体逐层捕获,然后再通过冒泡返回DOM树的顶层。
    • jQuery始终在模型的冒泡阶段注册事件处理程序,因此总是可以假定最具体的元素先获得响应。

    事件冒泡的副作用

    • mouseover和mouseout事件,最外层元素注册该事件,当离开(进入)里层元素时,会触发事件。
    • mouseenter和mouseleave事件无论单独绑定还是在.hover()方法中组合绑定,都可以避免这些冒泡问题。
    • 在其他情况下,需要从空间和时间上限制某个事件。

    通过事件对象改变事件的旅程

    //会发生事件冒泡的代码,当点击switcher div内部的按钮时也会触发事件
    $(document).ready(function(){
       $('#switcher') .click(function(){
           $('#switcher button').toggleClass('hidden');
       });
    });

    事件对象和事件目标

    //不会发生事件冒泡的代码,使用了事件对象event(不是必须命名成event可以是其他)
    //event.target
    $(document).ready(function(){
       $('#switcher') .click(function(event){ //->这里使用了事件对象
           if(event.target == this){          //->这里使用了事件目标
           $('#switcher button').toggleClass('hidden');
           }
       });
    });

    停止事件传播

    //stopPropagation()
    $(document).ready(function(){
       $('#switcher') .click(function(event){
           $('#switcher button').toggleClass('hidden');
       });
    });
    $(document).ready(function(){
       //按钮相关的操作
       $('#switcher-default').addClass('selected');
       var bodyClass = this.id.split(-)[1];
       $('body').removeClass().addClass(bodyClass);
       $(this).addClass('selected');
       
       event.stopPropagation();   //->这里取消掉了div内按钮的冒泡
    });

    阻止默认操作

    .preventDefault()
    • 事件传播和默认操作是相互独立的两套机制,如果想要同时停止这两种机制,可以在事件处理程序中返回false 等同于 同时使用.preventDefault()和.stopPropagation()

    事件委托

    利用冒泡的一项技术,通过在祖先元素上绑定事件,利用事件冒泡,在点击子元素时,事件会到达这个祖先元素。

    $(document).ready(function(){
        $('#switcher').click(function(){
         if($(event.target).is('button')){ //.is()接收一个选择符表达式,如果当前对象至少一个匹配选择符,返回true
             var bodyClass = event.target.id.split('-')[1];
             $('body').removeClass().addClass('selected');
             $(event.target).addClass('selected');
             event.stopPropagation(); //这里不会阻止切换发生 event为switcher事件的内置对象,阻止冒泡只能阻止向其祖先元素冒泡。
         }  
        });
    })
    //改进 
    $('#switcher').click(function(){
    if($(event.target).is('button')){
        ...
    }
    else{
        $('#switchet button').toggleClass('hidden');
    }
    });

    使用内置的事件委托功能

    $('#switcher').on('click','button',function(){
        //...
    })
    • 第二个参数是选择符表达式,当event.target和选择符表达式匹配时,执行事件处理程序。
    • .delegate() 和 .undelegate()

    移除事件处理程序

    $('#switcher').off('click')

    为事件处理程序添加命名空间

    //使.off()调用更有针对性,可以使用事件命名空间
    $('#switcher').on('click.collapse',function(){//...})
    $('#switcher').off('click.collapse');

    附加的命名空间后缀.collapse对于事件处理系统而言,是不可见的。

    重新绑定事件

    $(document).ready(function() {
    var toggleSwitcher = function(event) {
    if (!$(event.target).is('button')) {
    $('#switcher button').toggleClass('hidden');
    }
    };
    $('#switcher').on('click', toggleSwitcher);
    $('#switcher button').click(function() {
    $('#switcher').off('click', toggleSwitcher);
    if (this.id == 'switcher-default') {
    $('#switcher').on('click', toggleSwitcher);
    }
    });
    });

    .one()只触发一次,随后立即解除绑定。

    模仿用户操作

    用户未操作时触发

    .trigger()

    $(document).ready(function() {
    $('#switcher').trigger('click');
    });

    .click()

    $(document).ready(function() {
    $('#switcher').click();
    });

    响应键盘事件

    $(document).ready(function() {
    var triggers = {
    D: 'default',
    N: 'narrow',
    L: 'large'
    };
    $(document).keyup(function(event) {
    var key = String.fromCharCode(event.which);
    if (key in triggers) {
    $('#switcher-' + triggers[key]).click();
    }
    });
    });
  • 相关阅读:
    go语言goroutine
    go语言接口
    go语言的map
    go语言切片
    go语言数组
    django的信号机制
    python redis 实现简单的消息订阅
    scrapy中使用selenium来爬取页面
    尝试用tornado部署django
    控制台输出太多导致项目启动过慢
  • 原文地址:https://www.cnblogs.com/goingforward/p/6987058.html
Copyright © 2020-2023  润新知