Skip to content

Commit

Permalink
Renamed
Browse files Browse the repository at this point in the history
  • Loading branch information
padolsey committed Jul 28, 2010
1 parent 10e6d4f commit ac3353d
Showing 1 changed file with 145 additions and 0 deletions.
145 changes: 145 additions & 0 deletions proximity-event/jquery.proximity.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
/**
* Proximity event for jQuery
* ---
* @author James Padolsey (http://james.padolsey.com)
* @version 0.1
* @updated 28-JUL-09
* ---
* @info http://github.com/jamespadolsey/jQuery-plugins/proximity-event/
*/

(function($){

var elems = $([]),
doc = $(document);

$.event.special.proximity = {

defaults: {
max: 100,
min: 0,
throttle: 0,
fireOutOfBounds: 1
},

setup: function(data) {

if (!elems[0])
doc.mousemove(handle);

elems = elems.add(this);

},

add: function(o) {

var handler = o.handler,
data = $.extend({}, $.event.special.proximity.defaults, o.data),
lastCall = 0,
nFiredOutOfBounds = 0,
hoc = $(this);

o.handler = function(e, pageX, pageY) {

var max = data.max,
min = data.min,
throttle = data.throttle,
date = +new Date,
distance,
proximity,
inBounds,
fireOutOfBounds = data.fireOutOfBounds;

if (throttle && lastCall + throttle > date) {
return;
}

lastCall = date;

distance = calcDistance(hoc, pageX, pageY);
inBounds = distance < max && distance > min;

if (fireOutOfBounds || inBounds) {

if (inBounds) {
nFiredOutOfBounds = 0;
} else {

// If fireOutOfBounds is a number then keep incrementing a
// counter to determine how many times the handler's been
// called out of bounds. Note: the counter is reset whenever
// the cursor goes back inBounds...

if (typeof fireOutOfBounds === 'number' && nFiredOutOfBounds > fireOutOfBounds) {
return;
}
++nFiredOutOfBounds;
}

proximity = e.proximity = 1 - (
distance < max ? distance < min ? 0 : distance / max : 1
);

e.distance = distance;
e.pageX = pageX;
e.pageY = pageY;
e.data = data;

return handler.call(this, e, proximity, distance);

}

};

},

teardown: function(){

elems = elems.not(this);

if (!elems[0])
doc.unbind('mousemove', handle);

}

};

function calcDistance(el, x, y) {

// Calculate the distance from the closest edge of the element
// to the cursor's current position

var left, right, top, bottom, offset,
cX, cY, dX, dY,
distance = 0;

offset = el.offset();
left = offset.left;
top = offset.top;
right = left + el.outerWidth();
bottom = top + el.outerHeight();

cX = x > right ? right : x > left ? x : left;
cY = y > bottom ? bottom : y > top ? y : top;

dX = Math.abs( cX - x );
dY = Math.abs( cY - y );

return Math.sqrt( dX * dX + dY * dY );

}

function handle(e) {

var x = e.pageX,
y = e.pageY,
i = -1,
fly = $([]);

while (fly[0] = elems[++i]) {
fly.triggerHandler('proximity', [x,y]);
}

}

}(jQuery));

0 comments on commit ac3353d

Please sign in to comment.