jQuery插件范围问题的私有函数

时间:2014-02-24 21:12:18

标签: javascript jquery jquery-plugins

我的内部函数'getFontSize'似乎遇到了范围问题。我可以从插件中选择DOM元素,但不能从'getFontSize'函数中选择

    (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);

2 个答案:

答案 0 :(得分:0)

根据jquery插件创建页面,我认为另一个想法是在匿名jquery插件函数中放置函数

http://learn.jquery.com/plugins/basic-plugin-creation/它应该是

$.fn.getFontSize = function(selector,dSize) { ... }而不是具有$.fn命名空间之外的外部函数

然而,我没有测试过它。

答案 1 :(得分:0)

感谢大家的建议。我能够以两种不同的方式让它工作:

  1. 按照以下代码将'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. 选项2是按照以下教程在插件函数中移动'default'对象:http://www.codeproject.com/Articles/291290/How-To-Write-Plugin-in-jQuery

  3. 第二种选择看起来更广泛,所以我改用了它。