I have not used jQuery Boilerplate, but I believe that the problem here in your variable is called plugin .
Nowhere in your code do you declare a variable called plugin . When I stop the debugger in Plugin.prototype.showTabContent , I can evaluate window.plugin and it returns the global value for the plugin.
In the constructor for the plugin, the first line reads plugin= this; . Since the plugin not defined, it declares a variable in the global scope of the window object.
The fix is ββto pass a link to the plugin object when setting hook $().on() . Past data is available in event handlers through the event parameter, which is passed in the data property.
Here is the solution ( http://codepen.io/shhQuiet/pen/JXEjMV )
(function($, window, document, undefined) { var pluginName = "tabs2Accordion", defaults = { menuSelector: ".tabs2accordion-menu", tabContentSelector: ".tabs2accordion-content" }; function Plugin(element, options) { this.element = element; this.$element = $(this.element); this.options = $.extend({}, defaults, options); this.$menu = $(this.element).find(this.options.menuSelector), this.$tabs = $(this.element).find(this.options.tabContentSelector), this.$accordionTriggers = $(this.element).find(this.$tabs).find("h3"); this._defaults = defaults; this._name = pluginName; this.init(); } Plugin.prototype = { init: function() { //Set all the tab states to inactive this.$tabs.attr("data-active", false); //Set the first tab to active this.$tabs.first().attr("data-active", true); //If you click on a tab, show the corresponding content this.$menu.on("click", "li", this, this.showTabContent); //Set the dimensions (height) of the plugin this.resizeTabs2Accordion({ data: this }); //If the browser resizes, adjust the dimensions (height) of the plugin $(window).on("resize", this, this.resizeTabs2Accordion); //Add a loaded class to the plugin which will fade in the plugin content this.$element.addClass("loaded"); console.log(this.$element); }, resizeTabs2Accordion: function(event) { var contentHeight; var plugin = event.data; if (!plugin.$element.is("[data-nested-menu]")) { contentHeight = plugin.$tabs.filter("[data-active='true']").outerHeight() + plugin.$menu.outerHeight(); } else { contentHeight = plugin.$tabs.filter("[data-active='true']").outerHeight(); } plugin.$element.outerHeight(contentHeight); }, showTabContent: function(event) { var $target; var plugin = event.data; plugin.$menu.children().find("a").filter("[data-active='true']").attr("data-active", false); plugin.$tabs.filter("[data-active='true']").attr("data-active", false); $target = $($(this).children("a").attr("href")); $(this).children("a").attr("data-active", true); $target.attr("data-active", true); plugin.resizeTabs2Accordion({data: plugin}); return false; }, showAccordionContent: function(event) { var plugin = event.data; $("[data-active-mobile]").not($(this).parent()).attr("data-active-mobile", false); if ($(this).parent().attr("data-active-mobile") === "false") { $(this).parent().attr("data-active-mobile", true); } else { $(this).parent().attr("data-active-mobile", false); } } }; $.fn[pluginName] = function(options) { return this.each(function() { if (!$.data(this, "plugin_" + pluginName)) { $.data(this, "plugin_" + pluginName, new Plugin(this, options)); } }); }; })(jQuery, window, document); $(window).on("load", function() { $(".tabs2accordion").tabs2Accordion({ state: "desktop" }); });