从jQuery插件内的公共职能(Public functions from within a jQu

2019-06-23 23:51发布

我爱jQuery插件体系结构,但是,我觉得很沮丧(可能是由于我的一部分缺乏了解)时,我想保留的插件实例的引用稍后访问我的代码属性或方法。

编辑:我要澄清的是什么,我真正想要做的是保留该插件中使用的方法和属性的参考,这样我可以在以后使用它们

让我们一个AJAX加载图标的情况。 在一个更传统的面向对象的环境中,我可以这样做:

var myIcon = new AJAXIcon();
myIcon.start();
//some stuff
myIcon.stop();

的方法和我的对象的特性被存储,供以后使用的变量。 现在,如果我想有一个jQuery插件相同的功能,我就从我的主要代码有点这样称呼它:

$("#myId").ajaxIcon()

按照惯例,我的插件需要返回传递给我的插件,允许chainability原来的jQuery对象,但如果我这样做,我松访问插件实例的方法和属性的能力。

现在,我知道,你可以在我的插件声明一个公共职能,有点沿行

$.fn.ajaxIcon = function(options) {
    return this.each(function () {
        //do some stuff
    }
}

$.fn.ajaxIcon.stop = function() {
    //stop stuff
}

然而,在不破坏返回原始的jQuery对象的约定,我不能保留,我想指的是插件的具体实例的引用。

我希望能够做这样的事情:

var myIcon = $("myId").ajaxIcon(); //myIcon = a reference to the ajaxIcon 
myIcon.start();
//some stuff
myIcon.stop();

有什么想法吗?

Answer 1:

如果你这样做了以下内容:

(function($){

$.fn.myPlugin = function(options) {
    // support multiple elements
    if (this.length > 1){
        this.each(function() { $(this).myPlugin(options) });
        return this;
    }

    // private variables
    var pOne = '';
    var pTwo = '';
    // ...

    // private methods
    var foo = function() {
        // do something ...
    }
    // ...

    // public methods        
    this.initialize = function() {
        // do something ...
        return this;
    };

    this.bar = function() {
        // do something ...
    };
    return this.initialize();
}
})(jQuery);

然后你就可以访问你的任何公共方法:

var myPlugin = $('#id').myPlugin();

myPlugin.bar();

这是从这个考虑非常有帮助的文章从trulyevil.com(2009年5月),这是本身延伸这篇文章 (2007年10月)从learningjquery.com。



Answer 2:

好吧,我想通了,如何做到这一点:

插件代码:

$.ajaxIcon.init = function(element, options) {
    //your initialization code

    this.start = function() {
         //start code
    }

    this.stop = function() {
         //stop code
    }
}

$.fn.ajaxIcon = function(options) {
    this.each(function () {
        //This is where the magic happens
        jQuery(this).data('ajaxIcon', new jQuery.ajaxIcon.init(this, opts));
    });

return this;
}

然后在代码中的其他地方使用它:

var myIcon = $("#myId").ajaxIcon.data('ajaxIcon') 
// myIcon: a reference to the 'init' object specific to this plugin instance
myIcon.start();
myIcon.stop();

瞧,回答我的问题:)



Answer 3:

我想你可以完成你在找什么东西是这样的:

var myIcon = $("myId").ajaxIcon(); //myIcon = a reference to the ajaxIcon 
$.ajaxIcon.start(myIcon);//some stuff
$.ajaxIcon.stop(myIcon);

没有测试它虽然 - 我没有一个环境,我能做到这一点ATM接入



Answer 4:

大部分的jQuery插件,我看到试图完成,这将使用匿名范围和关闭,以独有的实例引用函数和变量。 例如,使用以下模式:

;(function ($) {
    // your code
})(jQuery);

开始和模块结束之间,你可以声明任何你想要的功能。 你不会污染全局命名空间,您可以保留访问通过封闭的局部变量,这样可以解决很多你的问题。 此外,不要害怕使用$.data的功能。



文章来源: Public functions from within a jQuery plugin