我试图覆盖this jQuery plugin中的一个方法,该方法遵循在Smashing Magazine article中引用的“jQuery轻量级插件样板”模式,但是我似乎错过了一些东西。 [编辑:原来的模式故意使该方法私人。]如何覆盖这个jQuery插件的私有方法?
$.fn.mbp
存在,当我测试它。但是,当我使用以下语法重写其方法之一时,没有错误,并且插件方法未被覆盖。
$.fn.mbp.loadFiles = function() {
alert('test')
};
我试图覆盖this jQuery plugin中的一个方法,该方法遵循在Smashing Magazine article中引用的“jQuery轻量级插件样板”模式,但是我似乎错过了一些东西。 [编辑:原来的模式故意使该方法私人。]如何覆盖这个jQuery插件的私有方法?
$.fn.mbp
存在,当我测试它。但是,当我使用以下语法重写其方法之一时,没有错误,并且插件方法未被覆盖。
$.fn.mbp.loadFiles = function() {
alert('test')
};
正如Tomalak说,他们的功能受到保护,但它不是遥不可及。
因为它将mbp对象的实例存储在jquery数据存储中,所以我们可以获取此对象的构造函数并覆盖该函数。
从你的代码行360:
$.fn[pluginName] = function (options) {
return this.each(function() {
if (!$.data(this, 'plugin_' + pluginName)) {
$.data(this, 'plugin_' + pluginName,
new MBP(this, options));
}
else {
if (options == 'options') {
return $.data(this, 'plugin_' + pluginName).options;
}
}
});
}
覆盖它:
$.data($('<div/>').mbp()[0], 'plugin_mbp').constructor.prototype.loadFiles = function() {
// ...
}
然而,这是不是一个真正的非常干净的解决方案,所以你可能会想别的办法;)
插件使用该appoach:
(function ($) {
function MBP() {
// ...
}
MBP.prototype.loadFiles = function() {
// ...
};
$.fn.mbp = function() {
return this.each(function() {
var mbp = new MBP();
// ...
});
};
})(jQuery)
底线:由于封闭功能,MBP构造函数是私有的。你不能修改它(至少不需要修改插件的源代码)。
您必须确保您的代码在插件代码之后运行,从而确保它被覆盖。这样做的一种方式是登录您的控制台,另一个方法是使用中断点和测试是否在您之前或之后点击您的代码。另外,我注意到您正在调用mbp
,而链接中提到的功能是MBP
.Notice案例difference.Hope它有帮助
谢谢,是的,我测试了订单。你会注意到插件底部附近调用$('...')。mbp()来初始化。 – simesy
此方法有用,谢谢!不是非常漂亮,但对于“及时”修复非常有用,无需维护大量新代码。 – simesy
你是对的!没想到这一点。 – Tomalak