我的内部函数"getFontSize"似乎遇到了范围问题。我能够从插件中选择 DOM 元素,但不能从"getFontSize"函数中选择 DOM 元素
(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插件创建页面
http://learn.jquery.com/plugins/basic-plugin-creation/应该是
$.fn.getFontSize = function(selector,dSize) { ... }
而不是具有 $.fn
命名空间之外的外部函数,
但是我还没有测试过。
感谢大家的建议。我能够以两种不同的方式让它工作:
-
按照以下代码将"defaults"对象转换为函数:
(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);
-
选项 2 是按照以下教程在插件函数内移动"默认"对象:http://www.codeproject.com/Articles/291290/How-To-Write-Plugin-in-jQuery
第二种选择似乎规定得更广泛,所以我使用了它。