Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery插件私有函数的作用域问题_Javascript_Jquery_Jquery Plugins - Fatal编程技术网

Javascript jQuery插件私有函数的作用域问题

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

我的内部函数“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);

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

应该是

$.fn.getFontSize=函数(选择器,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是根据以下教程在插件函数内移动“默认”对象:


  • 第二个选项的使用范围似乎更广,因此我使用了它。

    我相信您不需要使用
    $(选择器)
    ,因为您已经在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就绪。请参阅上面我建议的解决方案。