请问mouseenter不是不支持冒泡吗,为什么$("input").trigger("mouseenter")可以触发事件呢?

来源:7-2 jQuery自定义事件之triggerHandler事件

DeppSparrow

2017-12-08 21:32

<!DOCTYPE html>
<html>

<head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <title></title>
    <style>
        .left div,
        .right div {
            width: 500px;
            height: 50px;
            padding: 5px;
            margin: 5px;
            float: left;
            border: 1px solid #ccc;
        }

        .left div {
            background: #bbffaa;
        }

        .right div {
            background: yellow;
        }
    </style>
    <script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js">
    </script>
</head>

<body>
<h2>自定义事件triggerHandler</h2>
<div class="left">
    <div id="accident">
        <a>triggerHandler事件</a>
        <form name="input" action="" method="get">
          <input type="text" value="momomo">
        </form>
    </div>
    <button>事件冒泡,触发浏览器默认聚焦行为</button><br><br>
    <button>不会冒泡,不触发浏览器默认聚焦行为</button>
</div>
<script type="text/javascript">

    //给input绑定一个聚焦事件
    var n=0;
    $("#accident").on("mouseenter",function(event,title) {
        title=title||"默认";
        $("input").val(++n);
    });

    $("#accident").on("click",function(e) {
        alert("trigger触发的事件会在 DOM 树中向上冒泡");
    });
    //trigger触发focus
    $("button:first").click(function() {
        $("a").trigger("click");
        $("input").trigger("mouseenter","传递");
    });

    //triggerHandler触发focus
    $("button:last").click(function() {
        $("a").triggerHandler("click");
        $("input").triggerHandler("mouseenter","没有触发默认聚焦事件");
    });



</script>
</body>

</html>


写回答 关注

1回答

  • 慕盖茨7260074
    2017-12-09 16:02:13
    已采纳

    在jquery的trigger源码中:

    ontype = type.indexOf( ":" ) < 0 && "on" + type;

    .....

    // Fire handlers on the event path

    i = 0;

    while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {

        lastElement = cur; 

        event.type = i > 1 ?bubbleType :special.bindType || type;

        // jQuery handler

        handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&dataPriv.get( cur, "handle" );

        if ( handle ) {

            handle.apply( cur, data );

        }

        // Native handler

        handle = ontype && cur[ ontype ];

        if ( handle && handle.apply && acceptData( cur ) ) {

            event.result = handle.apply( cur, data );

        if ( event.result === false ) {

            event.preventDefault();

        }

    }

    type 是事件类型。

    eventPath就是从target 到window对象 的一条路径。

    当event.isPropagationStopped() 为假时,会遍历eventPath,调用每个符合的jquery处理器。


    从源码上知道, type='mouseenter'  ontype = 'onmouseenter'。必然分别调用Jquery,原生接口中的处理函数。

    在原生接口中,对应event[ontype]

    jquery接口中,对应dataPri.get(cur,'events')[type]  或者dataPriv.get(cur,'handle') 。

    而elem.on() 函数的调用:elem.on() -> jquery.on() -> event.add() 最终添加到队列中。




    qq_演绎陌... 回复tobeyo...

    求也看不懂,你说说你会啥

    2018-05-03 11:03:38

    共 3 条回复 >

jQuery基础(三)—事件篇

jQuery第三阶段开启事件修炼,掌握对页面进行交互的操作

89996 学习 · 625 问题

查看课程

相似问题