【问题标题】:jQuery plugin instance variablesjQuery 插件实例变量
【发布时间】:2014-06-20 17:24:06
【问题描述】:

我从 jQuery 插件开始,为新手问题道歉。我的目标是让一个插件实例化两次,其中每个实例都有自己的变量值。但是,它们似乎共享命名空间。

例如,给定以下插件:

(function ( $ ) {

    var x = false;

    $.fn.test = function() {

        alert(x);

        if ( !x )
           x = true;

        return this;

    };

}( jQuery ));

从以下 div 调用:

$( "div1" ).test();
$( "div2" ).test();

警报首先显示假,然后显示真,当目标是必须有一组变量时警报会显示两次假。

这可能吗?

【问题讨论】:

标签: javascript jquery


【解决方案1】:

您的问题有些混乱。您的插件是一个简单的功能。您不会通过调用一个函数来“实例化”它。所以你也不会“实例化”你的插件。

你可以在你的函数中实例化一些东西,并将它们持久化到某个地方。

由于外部作用域只运行一次,因此在您的原始解决方案中,您只能获得变量 x 的一个实例。

如果你在函数内部创建它,每次调用它都会创建一个新实例。

我假设您想为调用此插件的每个元素创建一个实例。一个好的解决方案是将您的数据附加到您启动插件的 DOM 元素上,例如:

(function ( $ ) {
    $.fn.test = function() {
        var vars = this.data('testPlugin');
        if (!vars) {
            vars = {
                x: false,
                something: 'else'
            };
            this.data('testPlugin', vars);
        }

        alert(vars.x);
        vars.x = !vars.x;

        return this;
    };
}( jQuery ));

试试this fiddle

【讨论】:

  • 谢谢,我说“实例化”是因为我将插件视为具有属性和功能的对象。
【解决方案2】:

你应该放

var x = false;

$.fn.test function 内,否则x 变量对于所有test() 函数都是相同的,并在第一次调用后设置为true。

您可以阅读更多关于 javascript 变量作用域的here

【讨论】:

  • 谢谢,但没用。我把var x = false; 放在$.fn.test function 里面,显然变量总是设置为false,不仅在第一次调用之后。
【解决方案3】:

实际上,这比以前的答案要容易得多。插件中this 的上下文是根据您提供的选择器接收到的DOM 元素的jQuery 对象。要获得唯一性,只需遍历每个元素,如下所示:

(function($) {
  $.fn.test = function() {
    return this.each(function() {
      var x = false;

      alert(x);

      if (!x) {
        x = true;
      } 
    });
  }
}(jQuery));

$("div1").test();  //false
$("div2").test();  // false

这里有一个 JSFiddle 来确认:http://jsfiddle.net/Z6j7f/

【讨论】:

  • alert(x) 将始终在此处警告 false,并且由于没有其他内容可以访问内部范围,因此 if... 部分是完全没有必要的,因为没有其他内容可以访问 x。这是故意的吗? return this.each(function () { alert(false); }); 会做同样的事情。
  • 根据我对发布的原始问题的解释,条件检查是任意的,用于评估x 的状态是否发生了变化。我同意你的观点,这个条件是不必要的。
猜你喜欢
  • 2019-05-13
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多