Non ho usato jQuery Boilerplate, ma credo che il problema qui sia con la variabile chiamata plugin
.
In nessun punto del codice si dichiara una variabile denominata plugin
. Quando interrompo il debugger in Plugin.prototype.showTabContent
, posso valutare window.plugin
e restituisce il valore globale per il plug-in.
Nel costruttore per Plugin, la prima riga legge plugin= this;
. Poiché plugin
non è definito, sta dichiarando la variabile nell'ambito globale sull'oggetto window
.
La correzione consiste nel passare un riferimento all'oggetto plugin
durante l'impostazione del gancio $().on()
. I dati passati sono disponibili nei gestori eventi tramite il parametro event
passato nella proprietà data
.
Ecco la soluzione (a 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's 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"
});
});
* ma inizia a malfunzionarsi non appena un altro elemento con la stessa classe viene aggiunto alla pagina * .... In che modo? hai solo vagamente spiegato che cosa dovrebbe * fare il tuo codice * e non hai affatto spiegato quale sia il vero problema per dire che c'è un problema. Si prega di essere più specifici – DelightedD0D
Nelle dimensioni dello schermo 768px e superiori, facendo clic su uno dei tre titoli verrà visualizzato il paragrafo del contenuto della scheda corrispondente. Facendo clic su un altro titolo verrà visualizzato un altro paragrafo del contenuto della scheda. Potrei non averlo descritto molto bene ma ho fornito un Codepen che dimostrava il problema quindi non c'era motivo di essere scortesi –
Le mie scuse per essere venuta maleducata, voglio solo che tu veda che non ci hai dato le informazioni di cui abbiamo bisogno per aiutarti . Siamo tutti felici di aiutarti, ma prima di passare al codice nel tuo esempio, dobbiamo sapere che cosa deve fare * e * il codice * come il codice attualmente fallisce *. Questi non sono così comuni per un estraneo così come sono al richiedente Ad esempio, quando ridimensiono lo schermo nella tua demo, non succede nulla quando clicco i titoli, vedi http://i.imgur.com/v0JPO2g.png – DelightedD0D