我知道这是stackoverflow中的一个老问题。但对我来说这是新的,我已经找到了解决方案,但我没有得到一个我能理解的解决方案。我有一个插件,因为我有一些功能。现在我想在select options
上的事件发生变化时访问其中一个函数。但我的问题是我无法从插件外部访问该功能。但是我是插件开发的新手。
这是我的插件:
(function($, window, document, undefined) {
var Spec = {
init: function(options, ele)
{
var self = this;
self.elem = ele;
self.$elem = $(ele);
self.findPro = (typeof options === 'string') ? self.findPro = options : self.findPro = options.findPro;
self.options = $.extend({}, $.fn.specpro.options, options);
if (self.options.findPro === 'latest') {
self.latestPro();
}
},
.
.
.
filter:function(filFor){
console.log($('.chzn-select').val());
}
};
$.fn.specpro = function(options) {
return this.each(function() {
var spec = Object.create(Spec);
spec.init(options, this);
});
};
$.fn.specpro.options = {
findPro: 'latest'
};
})(jQuery, window, document);
我尝试的是:
$(function(){
var mn=$('#lp').specpro({findPro:'latest'});
$('.chzn-select').chosen().change().mn.filter('latest');
});
任何人都可以告诉我。如何从插件外部调用函数filter
。
直播Fiddle
答案 0 :(得分:0)
该函数位于“Spec”对象中,并且位于自调用匿名函数的范围内:
(function($, window, document, undefined) {
... code ...
})(jQuery, window, document);
因此,只有该匿名函数内的代码才能访问Spec.filter()
。要访问Spec变量,它需要位于全局范围内。
当某些东西处于“全局”范围内时,这意味着它被附加到全局对象(在大多数情况下,这是窗口)。
所以例如
var test = {
'hello' : function (){
alert('hello world');
}
}
在功能上与以下相同:
window.test = {
'hello' : function (){
alert('hello world');
}
}
因此它们都可以被称为test.hello()或window.test.hello()'test'对象在全局范围(窗口)中。
现在让我们把第一个例子放在一个匿名函数中。
(function(){
var test = {
'hello' : function (){
alert('hello world');
}
}
// call the function
test.hello();
})();
如果您尝试此操作,它将显示警报。但如果你以后累了打电话给test.hello();
,你会得到类似的东西:
ReferenceError:未定义测试
对象测试及其hello()函数位于匿名函数范围内,而不是全局范围。
现在这里再次使用相同的函数,但我们将测试直接附加到窗口(全局范围)。
(function(){
window.test = {
'hello' : function (){
alert('hello world');
}
}
// call the function
test.hello();
})();
现在你可以在以后的匿名函数之外测试test.hello()。您可以拥有多个级别的范围。