为了账号安全,请及时绑定邮箱和手机立即绑定

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

<!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 回答

在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() 最终添加到队列中。




0 回复 有任何疑惑可以回复我~
#1

DeppSparrow 提问者

非常感谢!
2017-12-29 回复 有任何疑惑可以回复我~
#2

tobeyous

看不懂
2018-02-22 回复 有任何疑惑可以回复我~
#3

qq_演绎陌路离伤_3 回复 tobeyous

求也看不懂,你说说你会啥
2018-05-03 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信