Skip to content

Instantly share code, notes, and snippets.

@kkosuge
Created September 7, 2012 21:02
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kkosuge/3669605 to your computer and use it in GitHub Desktop.
Save kkosuge/3669605 to your computer and use it in GitHub Desktop.
// 指定した要素以外のクリックでイベントを発火させる
// 例: $("#notification-list").outerClick(function (event) { ... });
(function ($, elements, OUTER_CLICK) {
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) {
jQuery(this).unbind('click', check);
}
}
}
};
$.fn[OUTER_CLICK] = function (fn) {
return fn ? this.bind(OUTER_CLICK, fn) : this.trigger(OUTER_CLICK);
};
})(jQuery, [], 'outerClick');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment