1;(function($){ // secure $ jQuery alias 2/*******************************************************************************************/ 3// jquery.event.hover.js - rev 5 4// Copyright (c) 2008, Three Dub Media (http://threedubmedia.com) 5// Liscensed under the MIT License (MIT-LICENSE.txt) 6// http://www.opensource.org/licenses/mit-license.php 7// Created: 2008-06-02 | Updated: 2008-07-30 8/*******************************************************************************************/ 9 10// USE THESE PROPERTIES TO CUSTOMIZE SETTINGS... 11 12// jQuery.event.special.hover.delay = 100; 13// Defines the delay (msec) while mouse is inside the element before checking the speed 14 15// jQuery.event.special.hover.speed = 100; 16// Defines the maximum speed (px/sec) the mouse may be moving to trigger the hover event 17 18// save the old jquery "hover" method 19$.fn._hover = $.fn.hover; 20 21// jquery method 22$.fn.hover = function( fn1, fn2, fn3 ) { 23 if ( fn3 ) this.bind('hoverstart', fn1 ); // 3 args 24 if ( fn2 ) this.bind('hoverend', fn3 ? fn3 : fn2 ); // 2+ args 25 return !fn1 ? this.trigger('hover') // 0 args 26 : this.bind('hover', fn3 ? fn2 : fn1 ); // 1+ args 27 }; 28 29// special event configuration 30var hover = $.event.special.hover = { 31 delay: 100, // milliseconds 32 speed: 100, // pixels per second 33 setup: function( data ){ 34 data = $.extend({ speed: hover.speed, delay: hover.delay, hovered:0 }, data||{} ); 35 $.event.add( this, "mouseenter mouseleave", hoverHandler, data ); 36 }, 37 teardown: function(){ 38 $.event.remove( this, "mouseenter mouseleave", hoverHandler ); 39 } 40 }; 41 42// shared event handler 43function hoverHandler( event ){ 44 var data = event.data || event; 45 switch ( event.type ){ 46 case 'mouseenter': // mouseover 47 data.dist2 = 0; // init mouse distance² 48 data.event = event; // store the event 49 event.type = "hoverstart"; // hijack event 50 if ( $.event.handle.call( this, event )!==false ){ // handle "hoverstart" 51 data.elem = this; // ref to the current element 52 $.event.add( this, "mousemove", hoverHandler, data ); // track the mouse 53 data.timer = setTimeout( compare, data.delay ); // start async compare 54 } 55 break; 56 case 'mousemove': // track the event, mouse distance² = x² + y² 57 data.dist2 += Math.pow( event.pageX-data.event.pageX, 2 ) 58 + Math.pow( event.pageY-data.event.pageY, 2 ); 59 data.event = event; // store current event 60 break; 61 case 'mouseleave': // mouseout 62 clearTimeout( data.timer ); // uncompare 63 if ( data.hovered ){ 64 event.type = "hoverend"; // hijack event 65 $.event.handle.call( this, event ); // handle "hoverend" 66 data.hovered--; // reset flag 67 } 68 else $.event.remove( data.elem, "mousemove", hoverHandler ); // untrack 69 break; 70 default: // timeout compare // distance² = x² + y² = ( speed * time )² 71 if ( data.dist2 <= Math.pow( data.speed*( data.delay/1e3 ), 2 ) ){ // speed acceptable 72 $.event.remove( data.elem, "mousemove", hoverHandler ); // untrack 73 data.hovered++; // flag for "hoverend" 74 data.event.type = "hover"; // hijack event 75 if ( $.event.handle.call( data.elem, data.event ) === false ) // handle "hover" 76 data.hovered--; // flag for "hoverend" 77 } 78 else data.timer = setTimeout( compare, data.delay ); // async recurse 79 data.dist2 = 0; // reset distance² for next compare 80 break; 81 } 82 function compare(){ hoverHandler( data ); }; // timeout/recursive function 83 }; 84 85/*******************************************************************************************/ 86})(jQuery); // confine scope
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.