jQuery知识点总结(五)

jQuery知识点总结(五)


事件冒泡和默认行为

  1. 什么是事件冒泡?
    当给子级一个事件的时候,子级的事件会传递给父级,父级也会执行这个事件

  1. 如何阻止事件冒泡
    在子级的事件函数内加上return false;
    如果子级有event参数传入可以在子级的事件函数内加上event.stopPropagation( );

  1. 什么是默认行为
    默认行为就是没有添加但是本身就拥有的行为,比如a标签、submit按钮点击会跳转页面

  1. 如何阻止默认行为
    在事件函数内加上return false;
    如果有event参数传入可以在事件函数内加上event.preventDefault( );

事件自动触发

trigge( )和triggerHandler( )都会自动触发事件。

trigger

  • 不会阻止默认行为以及事件冒泡
    注意!如果已经在事件函数内阻止了事件冒泡或者默认行为,trigger同样也会阻止

triggerHandler

  • 会阻止默认行为以及事件冒泡

重点!!"< a >" 标签使用trigger或者是triggerHandler都不会触发默认事件
触发默认事件的解决办法:给"< a >“标签里面添加一个”< span >"标签,$(“span”).trigger(“click”)。


自定义事件

  • 自定义事件要用对象.on(“事件”,函数)来定义
  • 用trigger或者triggerHandler来调用
<script>
    $(function()
    {
        //给按钮添加一个自定义事件
        $("button").on("MyClick",function()
        {
            alert("我是自定义事件")
        })
        //调用自定义事件
        $("button").trigger("MyClick");
    })
</script>
<body>
    <button>点击</button>
</body>

事件命名空间

  1. 添加事件的命名空间 click.自定义的命名空间

  2. 触发条件

    1. 事件是用on绑定的
    2. 事件通过trigger触发

以下程序给子级绑定了click,click.1事件,也给父级绑定了click,click.1事件,此时点击son会触发所有点击事件,点击father会触发father的点击事件

<script>
  $(function()
  {
    $(".son").on("click.1",function()
    {
        alert("son click.1");

    })
    $(".son").on("click",function()
    {
        alert("son click");
    })
    $(".father").on("click",function()
    {
        alert("fath click");
    })
    $(".father").on("click.1",function()
    {
        alert("father click.1");
    })
</script>
<body>
    <div class="father">
        <div class="son"></div>
    </div>
</body>
  • $(".son").trigger(“click”);
    此时也会触发所有点击事件(先触发click.1事件,因为这个事件先添加的)

  • $(".father").trigger(“click.1”);
    只会触发father的click.1的点击事件,不会触发father的click事件

  • $(".son").trigger(“click.1”);
    触发son的点击事件以及father同名(click.1)的点击事件,不会触发father的click事件

事件委托

当我们在页面加载完毕之后添加DOM元素,该DOM元素不会执行入口函数中的函数,此时我们需要事件委托,将监听事件交给加载好的DOM元素。


以下程序点击按钮会新增一个li,点击li会在控制台打印li的内容

<script>
    $(function()
    {
        //点击按钮新增li
        $("button").on("click",function()
        {
            $("ul").append("<li>我是新增的li</li>");
        })

        //jQuery中如果找到的元素不止一个,那么jQuery会遍历所有找到的元素并给他们添加事件
        $("ul>li").on("click",function()
        {
            console.log($(this).html());
        })
  
        //事件委托
        $("ul").delegate("li","click",function()
        {
            console.log($(this).html());        //this指的就是点击的li,不是ul(li将事件传递给ul的)
        })
    })
</script>
<body>
    <ul>
        <li>我是第1个li</li>
        <li>我是第2个li</li>
        <li>我是第3个li</li>
    </ul>
    <button>新增li</button>
</body>

注意! 当我们新增li之后,点击新增的li控制台不会打印新增的li

原因: jQuery入口函数是在所有DOM元素加载完成之后执行的,这里新增的li是在DOM元素
加载完毕之后(入口函数执行之后)新增的,所以新增的li没有click事件

解决: 将监听click事件的任务交给父元素,当点击新增的li时,click事件会传递给父元素
父元素响应click事件,最终新增的li会执行click事件

!!!!现在用on来替代delegate

$(“ul”).delegate(“li”,“click”,function(){})
$(“ul”).on(“click”,“li”,function(){})


事件委托练习


点击登录弹出登录框,点击关闭关闭登录框

<style>
    .loginback{
        width: 100%;
        height: 100%;
        position: fixed;
        top: 0;
        left: 0;
        background: rgb(0,0,0,0.5);
    }
    body{
        width: 99%;
        height: 100%;
    }
    .login{
        width: 500px;
        height: 300px;
        border: 5px solid black;
        position: relative;
        margin: 100px auto;
    }
    span{
        width: 50px;
        height: 50px;
        position: absolute;
        right: 0;
        top: 0;
        background-color: blue;
    }
</style>
<script src="../jquery-1.12.4.min.js"></script>
<script>
    $(function()
    {
        //点击弹出登录框
        $("a").on("click",function()
        {
                var $login=$(
            '<div class="loginback">'+
            '  <div class="login">'+
            '      <span>关闭</span>'+
            '  </div>'+
            '</div>')
            $("body").append($login);       

            //点击关闭关闭登录框(span的click委托给body监听)
            $("body").delegate(".login>span","click",function()
            {
                $login.remove();
            })
            return false;
        })
    })
</script>
<body>

    <a href="http://www.baidu.com">登录</a>
    <div></div>
</body>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值