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