1、冒泡和默认行为

 <div class="aa">
        <div class="bb">
            <div class="cc">
                <em>
                    <strong>
                        冒泡测试3
                    </strong>
                </em>
            </div>
        </div>
    </div>
    <div>
        <form action="http://www.baidu.com" method="post">
            <input type="submit" value="提交">
        </form>

        <a href="http://www.baidu.com">百度一下</a>


    </div>

    <script src="jquery-3.2.1.js"></script>
    <script>
        $(function () {
//            $(document).bind("click",function () {
//
//                alert("第一层冒泡")
//            })
//            $("div .bb").bind("click",function () {
//                alert("第二层冒泡测试")
//            })
//            $("div .cc").bind("click",function (e) {
//                e.stopPropagation()
//                alert("第三层冒泡测试")
//            })



//        第一层里是document,第二层是div,第三层还是div,都绑定了click事件,如果直接点第三层的事件,则首先会执行第三层绑定的函数,然后会执行第二层的函数,最后
//        在实行最后一层的函数,如果我们想阻止这样的行为该怎么处理e.stopPropagation(),这样,这一层就不会出现冒泡行为了


//            阻止默认行为是上面意思呢?比如我们的按钮,和超链接,如果我们点击了就会提交数据或者跳转到超链接,我们就可以使用代码实现阻止这样的默认行为
//            看到下面的例子,就阻止了a标签和input标签的默认行为,preventDefault

//            $("a").bind("click",function (event) {
//                event.preventDefault()
//            })
//            $(":input[type='submit']").bind("click",function (event) {
//                event.preventDefault()
//           )}

//            如果在函数中直接返回false,就可以实现取消默认行为+阻止冒泡行为

  

2、模拟用户操作

    <input type="button" value="提交">
    <script src="jquery-3.2.1.js"></script>
    <script>
        $(function () {

//            这个是用户的真实操作,而不是浏览器模拟用户操作,如果在加上下面的代码,就实现了浏览器模拟用户的click事件
//            $(this).bind('click',function () {
//                alert("模拟用户点击页面")
//
//            $(this).trigger('click')
//
//        })

//            用下面这种写法也可以实现模拟用户行为
//            $('input').bind('click',function () {
//                alert("第二种模拟用户点击页面的方法")
//            }).trigger('click')


//            自定义事件,主要是用在只要浏览器刷新就会自动执行的事件,相当于刷新页面触发一个函数一样的效果
//            $(':input').bind('myevent',function () {
//                alert("自定义事件")
//            }).trigger('myevent')

//trigger和triggerHandler的区别
//            1、如果标签有默认行为,则riggerHandler不会执行默认行为,trigger则会执行默认行为,比如点击按钮提交数据,这里就会有一个默认的行为
//            2、如果匹配到多个标签,则trigger会每个标签执行一次,而triggerHandler只第一个标签会执行默认行为,后面的标签不会执行默认行为
//            3、返回值不一样



//命令空间,比如下面的例子,一个input上绑定了2个click事件,但是我们只想把abc这个事件去掉该怎么办呢,我们可以在click后加一个点,在一些随机数就可以了

//            $("input").bind('click',function () {
//                    alert('abc')
//            })
//            $("input").bind('click',function () {
//                    alert('123')
//            })
//
//            $("input").bind('click.abc',function () {
//                    alert('abc')
//            })
//            $("input").bind('click.123',function () {
//                    alert('123')
//            })
//
//            $("input").unbind('click.123')




         })

  

3、事件委托

  <div class="aa" id="box">
        <input type="button" value="按钮">
        <input type="button" value="按钮">
        <input type="button" value="按钮">
        <input type="button" value="按钮">
    </div>
    <script src="jquery-3.2.1.js"></script>
    <script>
        $(function () {
//            $(':button').bind('click',function () {
//                alert("事件不委托")
//            })

//            使用live绑定的是document,而非button,所有永远只会绑定一次事件
//            $(":button").live('click',function () {
//                alert('事件委托绑定')
//



//            })
//            bind不能动态绑定,比如下面的例子,我开始有4个button按钮,我点击这4个中的任何一个
//            都会触发下面的click事件,然后复制出来一个按钮,但是如果我点击复制出来的按钮,则不会
//            在复制出来新的按钮,这就是bind不能动态绑定的意思;同样live可以实现动态绑定,因为事件是
//            绑定在document上,而点击button是冒泡到document,如果要触发这个冒泡,还会校验event type
//            和event target
//            $(':button').bind('click',function () {
//                $(this).clone().appendTo(".aa")
//
//            })
//            live已经被废弃了,live的替代方法是delegate<,他只绑定父元素
//            $("#box").delegate('input','click',function () {
//                $(this).clone().appendTo('#box')
//            })
//
//            $("#box").undelegate("input",'click')



//on off one 这个才是重点

//普通的绑定:bind
//普通的解绑:unbind
//普通的事件委托:delegate
//普通的事件委托解绑:undelegate
//方法太多,导致换乱,所有这里提供了新的方法 on和off
//新方法绑定:on
//新方法解绑:off
//            普通使用
//        $(":input").on('click',function () {
//            alert('替代bind')
//
//        })

//        额外数据也是可以的
//        $(":input").on('click',{user:'cui'},function (e) {
//            alert('替代bind' + e.data.user)
//
//        })

//        执行多个事件也是可以的
//        $(":input").on('click dblclick',{user:'cui'},function (e) {
//            alert('替代bind' + e.data.user)
//
//        })
//          $(":input").on({
//              click:function () {
//                  alert('鼠标单击')
//              },
//              dblclick:function () {
//                  alert('鼠标双击')
//              }
//          })


//同样阻止默认行为和冒泡也是可以的,方法和bind是一样的


//通过off来移除事件,也支持移除多个,也支持明明空间



//on如何替换delegate呢?也是通过父元素绑定和删除
//        $("#box").on('click',':input',function () {
//            $(this).clone().appendTo('#box')
//        })
//移除事件委托
//        $("#box").off('click',':input')

//one的意思,仅仅触发一次,然后就会移除事件

//            $(":input").one('click',function () {
//                alert("one来触发事件")
//            })

//            同样one的委托效果也是一样的 ,只有第一次生效
//            $("#box").one('click',':input',function () {
//                $(this).clone().appendTo("#box")
//            })


        })

  

posted on 2017-10-14 01:32  bainianminguo  阅读(309)  评论(0编辑  收藏  举报