0

我正在使用以下模式编写一个 jquery 插件(因为我不想做 $("#element").myPlugin(),我没有对特定元素做任何事情......无论如何......

$.extend({
    myPlugin: function(){
        //some cool stuff
    }
});

但我还需要一种方法让其他插件改变我的插件行为,我尝试执行以下操作,但遇到了一个奇怪的错误......

$.extend({
    myPluginStyles: {
        someStuff: {},
        moreStuff: {},
    }
});

$.extend({
    myPlugin: function(options) {
        this.style = $.myPluginStyles[options.style]; //options.style will contain either "someStuff" or "moreStuf"
    }
})

现在,其他插件可以在 myPluginStyles 对象中添加新的“样式”..至少是这样的想法:

$.myPluginStyles.newStyle = {};

现在你可以做 $.myPlugin({style: 'newStyle'});

但我收到以下错误:

Uncaught TypeError: Property 'style' of object function (e,t){return new v.fn.init(e,t,n)} is not a function 

提前致谢。

4

2 回答 2

1

$.extend 的样式适用于使用此模式 $(element).yourFunction 的新插件。

所以,你不想创建插件,你只想给 jQuery 添加函数。所以你需要做的:

$.myPlugin=function () {alert('yourfunction') };
$.myPluginSeries={someStuff:'', someStuff2: ''};

我希望我很清楚。

于 2013-01-09T12:27:44.743 回答
1

也许这就是你要找的?这样,插件就有一个对象'styles',可以注册(使用registerStyles)和使用(使用this.styles[name])的东西。

$.fn.extend({
    myPlugin: {
        styles : {}, //define the style object
        registerStyles : function(name, style) {
            //register name and style in the plugin's styles object
            this.styles[name] = style;
        },
        doStuff: function(name){
            //test by alerting the first value in the styles object
            alert(this.styles[name])
        }
    }
});

用法:

$.fn.myPlugin.registerStyles('myStyle', 'test'); //set style

$('#my_element').myPlugin.doStuff('myStyle'); //do stuff (in this case echo-ing the style)

// or $.fn.myPlugin.doStuff('myStyle'); if you your function is not designed to use an element

我不知道这是否是最佳做法,但我会这样做。

看到这个小提琴的演示

于 2013-01-09T12:43:58.480 回答