Javascript jQuery插件私有函数的作用域问题
我的内部函数“getFontSize”似乎遇到了范围问题。我可以从插件中选择DOM元素,但不能从“getFontSize”函数中选择Javascript jQuery插件私有函数的作用域问题,javascript,jquery,jquery-plugins,Javascript,Jquery,Jquery Plugins,我的内部函数“getFontSize”似乎遇到了范围问题。我可以从插件中选择DOM元素,但不能从“getFontSize”函数中选择 (function ($) { $.fn.pluginName = function(options) { options = $.extend({}, $.fn.pluginName.defaults, options); return this.each(function() {
(function ($) {
$.fn.pluginName = function(options) {
options = $.extend({}, $.fn.pluginName.defaults, options);
return this.each(function() {
// do stuff
});
}
// Default options
$.fn.pluginName.defaults = {
fontSize: getFontSize('body', '16px')
}; // defaults close
// get font-size
function getFontSize(selector, dSize) {
var fSize = $(selector).css('font-size') || dSize;
fSize = (fSize.indexOf('px') >= 0) ? fSize : dSize;
var factor = (fSize.indexOf('em') >= 0) ? fSize : '1';
factor = (fSize.indexOf('%') >= 0) ? String(Number(fSize.replace(/[^0-9\.]+/g, "")) / 100) : '1';
return Number(fSize.replace(/[^0-9\.]+/g, "") * Number(factor.replace(/[^0-9\.]+/g, "")));
};
})(jQuery);
根据jquery插件创建页面,我认为另一个想法是将函数放置在匿名jquery插件函数中 应该是
$.fn.getFontSize=函数(选择器,dSize){…}
而不是具有位于$.fn
命名空间之外的外部函数
但是我还没有测试过它。谢谢大家的建议。我能够通过两种不同的方式让它工作:
(function ($) {
$.fn.pluginName = function(options) {
options = $.extend({}, $.fn.pluginName.defaults(), options);
return this.each(function() {
// do stuff
});
}
// Default options
$.fn.pluginName.defaults = function (){
var optns = {
fontSize: getFontSize('body', '16px')
}
return optns;
};
// get font-size
function getFontSize(selector, dSize) {
var fSize = $(selector).css('font-size') || dSize;
fSize = (fSize.indexOf('px') >= 0) ? fSize : dSize;
var factor = (fSize.indexOf('em') >= 0) ? fSize : '1';
factor = (fSize.indexOf('%') >= 0) ? String(Number(fSize.replace(/[^0-9\.]+/g, "")) / 100) : '1';
return Number(fSize.replace(/[^0-9\.]+/g, "") * Number(factor.replace(/[^0-9\.]+/g, "")));
};
})(jQuery);
第二个选项的使用范围似乎更广,因此我使用了它。我相信您不需要使用
$(选择器)
,因为您已经在jquery函数中,您应该可以只使用这个或$(这个)
,因为jquery是新的,所以我没有编写jquery插件,所以这可能已经改变了。另一个问题可能是闭包可以尝试(函数getFontSize(…){})($)代码>console.log($)
。如果jQuery没有加载,它可能是未定义的。如果是这种情况,您需要在$(document).ready
@Mouseroot上运行整个初始化-我正在使用getFontSize函数获取body元素的css中定义的现有字体大小。这与插件实际应用到的元素不同,因此“This”不会work@TastySpaceApple-谢谢你的建议。我可以确认jQuery在进一步的测试中已经加载了,事实上,这似乎是加载而不是范围的问题。如果我将对插件的调用移动到HTML页面的底部,那么我就能够从getFontSize函数中选择DOM元素。关于如何确保默认函数在DOM准备好之前不执行(不需要从页面底部调用)的任何建议?谢谢。我没能让它工作。我认为这是因为真正的问题与何时调用getFontSize函数有关。当“defaults”是一个对象时,在DOM准备就绪之前,脚本一初始化就会调用getFontSize函数。作为一个函数,“defaults”将等待插件函数调用它,直到DOM就绪。请参阅上面我建议的解决方案。