 
		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> 
				在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() 最终添加到队列中。
jQuery基础(三)—事件篇
89985 学习 · 645 问题
相似问题