0

我在 jQuery 插件中缺少一些基本的变量范围。以下是一个 jQuery 插件存根(主要基于 jQuery.com 文档)。

我想让变量 ($testtest) 可用于插件中的所有函数。

在下面的示例代码中,变量 test 按预期将“hello”写入控制台。

但是,该变量$test将 jQuery() 写入控制台。

问题:(a) 为什么不$test将 jQuery(div#test) 写入控制台?(b) 使 jQuery 变量(或任何其他变量)在所有函数中可用的最佳实践是什么。例如,类似于 .net 类中的类级别变量。

(function ($) {

var settings = {
};

var methods = {
    init: function (options) { if (options) { $.extend(settings, options); } return init(this, settings); }
};

$.fn.scopetest = function (method) {
    // Method calling logic
    if (methods[method]) {
        return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
    } else if (typeof method === 'object' || !method) {
        return methods.init.apply(this, arguments);
    } else {
        $.error('Method ' + method + ' does not exist on jQuery plugin');
    }
};

var $test = $('#test');
var test = 'hello';

var init = function (object, settings) {
    return object.each(function () {

        console.log($test);
        console.log(test);
    });
}

})(jQuery);
4

3 回答 3

0
  • 为什么 $test 不将 jQuery(div#test) 写入控制台?

    test因为,在 DOM中没有带有 id 的元素。因此,jQuery 返回空集合jQuery()

  • 使 jQuery 变量(或任何其他变量)在所有函数中可用的最佳实践是什么?

    我不确定最佳实践,但如果我必须使变量可全局访问,我会将变量与window对象关联。喜欢,

    window.$test = $('#test');
    window.test = 'Hello';

并使用window对象(例如:)alert(window.$test);或仅使用变量名访问它们alert($test);

于 2012-06-18T06:26:45.880 回答
0

有趣的是,保留 var $test 语句但将赋值移至 init 函数似乎可行。因此,除非它在函数内部,否则使用 $ 似乎存在问题。将使用此作为解决方法,直到找到更好的解决方案。

(function ($) {

var settings = {
};

var methods = {
    init: function (options) { if (options) { $.extend(settings, options); } return init(this, settings); }
};

$.fn.scopetest = function (method) {

    // Method calling logic
    if (methods[method]) {
        return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
    } else if (typeof method === 'object' || !method) {
        return methods.init.apply(this, arguments);
    } else {
        $.error('Method ' + method + ' does not exist on jQuery plugin');
    }
};

var $test;
var test;

var init = function (object, settings) {

    return object.each(function () {

        $test = $('#test');
        test = 'hello';
        testfunc();
    });
}

var testfunc = function () {
    console.log($test);
    console.log(test);
}

})(jQuery);
于 2012-06-18T14:38:01.893 回答
0

尝试使用选项:

(function ($) {

var options = {
        option1: "some_value",
        option2: "another_value",
        ...
    }
var settings = {
    };

从你的函数中引用这样的:

var self = this;
alert( self.options.option1 );

或者:

var self = this,
    o = self.options;
alert( o.option1);

还可以查看 Jquery小部件工厂插件布局,它与您的接近,但我更喜欢它。

(function( $, window) {

    $.widget("widge_name", $.widget, {

        options: {
        ...
        },
        init: function(param_1, param_2) {
        ...
        },
        _create: function() {
        ...
        },
        some_function_A: function(param3, param4) {
        ...
        }
        some_function_B: function(param3, param4) {
        var self = this;
        // run some_function_A 
        self.some_function_A("foo","bar");
        }
  });
}) (jQuery,this);

这样你就可以像上面一样使用self调用其他函数。

于 2012-06-18T06:08:22.230 回答