Javascript Jquery Scrolly.js中data()的用法

Javascript Jquery Scrolly.js中data()的用法,javascript,jquery,jquery-data,Javascript,Jquery,Jquery Data,我正在尝试为自己制作一个视差插件,并在网上找到了一个名为scroll.js的简单视差插件: 不过,它有一些令人困惑的代码行,即使多次检查文档也没有帮助。jQuery文档说jQuery中的数据方法接受一个key:Value对,即使插件中有很多代码是通过引用传递的,我也看不到key:Value对的形成 谷歌搜索做得稍微好一点,在谷歌上搜索之后,我对数据方法有了更好的理解,但是这对我在jQuery插件中使用数据方法仍然没有帮助,所以我的困难就在这里 我不理解的代码片段是: $.fn[pluginNa

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

不过,它有一些令人困惑的代码行,即使多次检查文档也没有帮助。jQuery文档说jQuery中的数据方法接受一个
key:Value
对,即使插件中有很多代码是通过引用传递的,我也看不到key:Value对的形成

谷歌搜索做得稍微好一点,在谷歌上搜索之后,我对
数据
方法有了更好的理解,但是这对我在jQuery插件中使用
数据
方法仍然没有帮助,所以我的困难就在这里

我不理解的代码片段是:

 $.fn[pluginName] = function ( options ) {
        return this.each(function () {
            if (!$.data(this, 'plugin_' + pluginName)) {
                $.data(this, 'plugin_' + pluginName, new Plugin( this, options ));
            }
        });
    };
完整的插件源代码可以在这里找到(别担心!它不到100行!不是一个巨大的插件)

以上代码的难点在于,到目前为止,我在教程等中看到的所有数据方法示例,在真实的插件中使用
data
方法是完全不同的。作者在这里使用数据函数的真正目的是什么

除线路外:

return this.each(function () {
所有其他代码行,我不能完全自信地理解它们。他们在干什么

下面这一行在做什么

if (!$.data(this, 'plugin_' + pluginName)) {
正在检查“plugin_u”+pluginName是否具有初始化为对象文字的属性??我的假设正确吗

如果条件返回true怎么办

 $.data(this, 'plugin_' + pluginName, new Plugin( this, options ));
上面的代码行被执行了,但是它又在做什么呢

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

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

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

我问这个问题的一个重要原因是,我在许多当代Jquery插件中看到了类似的代码片段

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

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

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

if (!$.data(this, 'plugin_' + pluginName)) {
下一行存储类的新实例(例如,实际的插件实例):

newplugin(this,options)
部分调用类构造函数(main函数),并引用DOM元素和提供给插件调用的options对象

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

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

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

    this.init();
}

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

jQuery有两种不同的
数据方法,正如上面代码中所使用的,这可能就是您正在考虑的。它们本质上都是一样的,但是第一个需要一个元素(这个代码中的
this
)作为第一个参数来传递。@JamesThorpe我在谷歌搜索时看到了这一点,但既然你明确指出了这一点,我会去谷歌更多地了解差异。@TrueBlueAusie我还有一个问题:D。如果你有空,如果你能回答这个问题就太好了。:)@真的,我会把你的答案保存在档案里,并标记为已回答。但是我仍然在学习Jquery,所以不能说,我完全理解它,但我想这就是你学习Jquery的方式:)。谢谢。只有当我理解了代码片段后,我才会接受你的答案,所以给我一些时间,你的答案可能会解决我的一些困难,但我可能会想出一些新的。谢谢。@Tenali_raman:请随意询问具体细节。我已经编写了自己的基本插件类,以及超过24个jQuery插件,因此应该能够为您澄清:)太好了:)到时候我肯定会有更多的问题要问您。
function Plugin( element, options ) {
    this.element = element;
    this.$element = $(this.element);

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

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

    this.init();
}