bootstrap-contextmenu.min.js 3.03 KB
/*!
 * Bootstrap Context Menu
 * Author: @sydcanem
 * https://github.com/sydcanem/bootstrap-contextmenu
 * Inspired by Bootstrap's dropdown plugin.
 * Bootstrap (http://getbootstrap.com).
 * Licensed under MIT
 * ========================================================= */
 (function(e){"use strict";var t='[data-toggle="context"]';var n=function(t,n){this.$element=e(t);this.before=n.before||this.before;this.onItem=n.onItem||this.onItem;this.scopes=n.scopes||null;if(n.target){this.$element.data("target",n.target)}this.listen()};n.prototype={constructor:n,show:function(t){var n,r,i,s,o={relatedTarget:this};if(this.isDisabled())return;this.closemenu();if(!this.before.call(this,t,e(t.currentTarget)))return;n=this.getMenu();n.trigger(r=e.Event("show.bs.context",o));i=this.getPosition(t,n);s="li:not(.divider)";n.attr("style","").css(i).addClass("open").on("click.context.data-api",s,e.proxy(this.onItem,this,e(t.currentTarget))).trigger("shown.bs.context",o);e("html").on("click.context.data-api",n.selector,e.proxy(this.closemenu,this));return false},closemenu:function(t){var n,r,i,s;n=this.getMenu();if(!n.hasClass("open"))return;s={relatedTarget:this};n.trigger(r=e.Event("hide.bs.context",s));i="li:not(.divider)";n.removeClass("open").off("click.context.data-api",i).trigger("hidden.bs.context",s);e("html").off("click.context.data-api",n.selector);return false},keydown:function(e){if(e.which==27)this.closemenu(e)},before:function(e){return true},onItem:function(e){return true},listen:function(){this.$element.on("contextmenu.context.data-api",this.scopes,e.proxy(this.show,this));e("html").on("click.context.data-api",e.proxy(this.closemenu,this));e("html").on("keydown.context.data-api",e.proxy(this.keydown,this))},destroy:function(){this.$element.off(".context.data-api").removeData("context");e("html").off(".context.data-api")},isDisabled:function(){return this.$element.hasClass("disabled")||this.$element.attr("disabled")},getMenu:function(){var t=this.$element.data("target"),n;if(!t){t=this.$element.attr("href");t=t&&t.replace(/.*(?=#[^\s]*$)/,"")}n=e(t);return n&&n.length?n:this.$element.find(t)},getPosition:function(t,n){var r=t.clientX,i=t.clientY,s=e(window).width(),o=e(window).height(),u=n.find(".dropdown-menu").outerWidth(),a=n.find(".dropdown-menu").outerHeight(),f={position:"absolute","z-index":9999},l,c,h;if(i+a>o){l={top:i-a+e(window).scrollTop()}}else{l={top:i+e(window).scrollTop()}}if(r+u>s&&r-u>0){c={left:r-u+e(window).scrollLeft()}}else{c={left:r+e(window).scrollLeft()}}h=n.offsetParent().offset();c.left=c.left-h.left;l.top=l.top-h.top;return e.extend(f,l,c)}};e.fn.contextmenu=function(t,r){return this.each(function(){var i=e(this),s=i.data("context"),o=typeof t=="object"&&t;if(!s)i.data("context",s=new n(i,o));if(typeof t=="string")s[t].call(s,r)})};e.fn.contextmenu.Constructor=n;e(document).on("contextmenu.context.data-api",function(){e(t).each(function(){var t=e(this).data("context");if(!t)return;t.closemenu()})}).on("contextmenu.context.data-api",t,function(t){e(this).contextmenu("show",t);t.preventDefault();t.stopPropagation()})})(jQuery)