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基础(三)—事件篇
89996 学习 · 625 问题
相似问题