/** * jQuery custom event "outerClick". * @author David Brockman Smoliansky http://littleroom.se/ * @license GNU Lesser General Public License: http://creativecommons.org/licenses/LGPL/2.1/ * @version 1.1 * 2009/02/27 * * The outerClick event is fired when an element outside of the target element is clicked. * * Usage: * $(selector).bind("outerClick", fn); // Bind the function fn to the outerClick event on each of the matched elements. * $(selector).outerClick(fn); // Bind the function fn to the outerClick event on each of the matched elements. * $(selector).trigger("outerClick"); // Trigger the outerClick event on each of the matched elements. * $(selector).outerClick(); // Trigger the outerClick event on each of the matched elements. * $(selector).unbind("outerClick", fn); // Unbind the function fn from the outerClick event on each of the matched elements. * $(selector).unbind("outerClick"); // Unbind all outerClick events from each of the matched elements. */ /*global jQuery */ (function ($, elements, OUTER_CLICK) { /** * Check if the event should be fired. * @param {Object} event The click event. * @private */ function check(event) { for (var i = 0, l = elements.length, target = event.target, el; i < l; i++) { el = elements[i]; if (el !== target && !(el.contains ? el.contains(target) : el.compareDocumentPosition ? el.compareDocumentPosition(target) & 16 : 1)) { $.event.trigger(OUTER_CLICK, event, el); } } } $.event.special[OUTER_CLICK] = { setup: function () { var i = elements.length; if (!i) { $.event.add(document, 'click', check); } if ($.inArray(this, elements) < 0) { elements[i] = this; } }, teardown: function () { var i = $.inArray(this, elements); if (i >= 0) { elements.splice(i, 1); if (!elements.length) { $.event.remove(document, 'click', check); } } } }; /** * Event helper outerClick * * @param {Function} [fn] A function to bind to the outerClick event on each of the matched elements. * If fn is omitted the event is triggered. * @return {jQuery} Returns the jQuery object. */ $.fn[OUTER_CLICK] = function (fn) { return fn ? this.bind(OUTER_CLICK, fn) : this.trigger(OUTER_CLICK); }; })(jQuery, [], 'outerClick');