【问题标题】:Usage of data() in Jquery Scrolly.js在 Jquery Scrolly.js 中使用 data()
【发布时间】:2014-12-12 09:47:45
【问题描述】:

我正在尝试为自己制作一个视差插件,并在网上找到了一个名为 scroll.js 的简单视差插件:

虽然它有一些令人困惑的代码行,但即使对文档进行多次检查也无济于事。 jQuery 文档说 jQuery 中的 data 方法接受 key : Value 对,即使插件中的很多代码是通过引用传递的,我也看不到键:值对的形成。

Google 搜索稍好一些,在 Google 上搜索后,我对 data 方法有了更好的理解,但是在 jQuery 插件中使用 data 方法的情况下,这仍然对我没有帮助,所以这是我的困难。

我没看懂的sn-p代码是:

 $.fn[pluginName] = function ( options ) {
        return this.each(function () {
            if (!$.data(this, 'plugin_' + pluginName)) {
                $.data(this, 'plugin_' + pluginName, new Plugin( this, options ));
            }
        });
    };

整个插件源代码都可以在这里找到(别担心!它不到 100 行!不是一个巨大的插件)。 Plugin on Git

现在我对上面这段代码的困难是,到目前为止我在教程等中看到的所有数据方法的例子,data 方法在现实世界插件中的用法是相当不同的。作者在这里真正使用数据功能是为了什么?

除了线:

return this.each(function () {

所有其他代码行,我并不完全自信地理解它们。他们在做什么?

例如。下面的行在做什么?

if (!$.data(this, 'plugin_' + pluginName)) {

检查 'plugin_' + pluginName 是否具有初始化为对象文字的属性?我的假设正确吗?

如果条件返回真怎么办? :

 $.data(this, 'plugin_' + pluginName, new Plugin( this, options ));

上面这行代码被执行了,但是它又在做什么呢??

我看到再次使用了 data 方法,关键字 this 用于指向当前元素,'plugin_' + pluginname(我猜这指定了“this”应该指向 'plugin_' + pluginname??? )和最后创建一个新实例。

我对 Jquery 的理解不是很好,我试图猜测或者更确切地说解释这个小sn-p 代码中发生了什么。对不起,如果我的解释离题了。

如果真的有人能来告诉我到底发生了什么,那就太好了。

我问这个问题的一个重要原因是因为我在许多当代 Jquery 插件中看到了类似的 sn-ps 代码。

【问题讨论】:

  • jQuery 有两种不同的data 方法。 This one,在上面的代码中使用,this one 这可能是你想的那个。它们本质上都是一样的,但第一个需要一个元素(此代码中的 this)作为第一个参数传递。
  • @JamesThorpe 我在谷歌搜索时看到了这一点,但既然你特别指出了这一点,我会去谷歌搜索更多关于差异的信息。
  • @TrueBlueAussie 我还有一个问题:D stackoverflow.com/questions/27499842/…。如果您有空,如果您能回答这个问题,那就太好了。 :)
  • @TrueBlueAussie,我会将您的答案保存在存档中并将其标记为已回答。但我仍在学习 Jquery,所以不能说,我完全理解它,但我猜你就是这样学习的 :)。谢谢。

标签: javascript jquery jquery-data


【解决方案1】:

插件将类(函数)实例作为数据存储在 DOM 元素上,因此以后可以很容易地找到它,以便为方法调用提供正确的“this”引用。 data(key, value) 调用将原始对象存储到名称/值缓存中(不一定在元素本身上)。 data(key) 调用检索与该键关联的对象。

data 使用的版本是 static jQuery data 方法,因此“this”(元素)作为参数提供。它相当于data 的基于元素的版本,如下所示:$(this).data(key, value)

以下行在创建新实例之前检查对象的类型(即插件名称/键值)对象是否已经存在。如果它已经有该插件,它将不会再次创建一个(因此是 if)。通常,如果它存在,插件将采用传递的任何新选项并更改其设置,但您的示例插件不会这样做:

if (!$.data(this, 'plugin_' + pluginName)) {

以下行存储类的新实例(例如实际的插件实例):

$.data(this, 'plugin_' + pluginName, new Plugin( this, options ));

new Plugin( this, options ) 部分通过对 DOM 元素的引用以及提供给插件调用的选项对象调用类构造函数(主函数)。

function Plugin( element, options ) {
    this.element = element;
    this.$element = $(this.element);

    this.options = $.extend( {}, defaults, options) ;

    this._defaults = defaults;
    this._name = pluginName;

    this.init();
}

在构造函数内部,它将存储元素引用,使用传递的选项扩展一组默认选项值,然后初始化插件(注册事件处理程序等以完成实际工作)。

【讨论】:

  • 只有在我理解了代码 sn-p 后,我才会接受您的回答,所以请给我一些时间,您的回答可能会解决我的一些困难,但我可能会想出一些新的问题。谢谢。
  • @Tenali_raman:请随时询问具体细节。我已经编写了自己的基础插件类,以及超过 2 打的 jQuery 插件,所以应该能够为您澄清它:)
  • 那太好了 :) 那我肯定还有一些问题要问你。
猜你喜欢
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 2014-01-31
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多