jQuery插件选项

时间:2009-07-20 06:25:32

标签: javascript jquery scope

首先,我知道这是一个基本的JS问题,而不是jQuery。我处在那个学习点,我似乎无法完全解决一些范围问题。所以我需要一些解释。

我一直在阅读我能找到的每篇文章/教程,但只需要一些答案。我设置了这个基本代码进行试验(因为实际的代码太大了,不能在这里发布)。

在下面的实验中,当单击selector1-change按钮时,'cmd'变量显示正确,但对this.options的引用是'undefined',因为它是MySelector()的不同实例,除非我我走了。

那么如何调用像这样的对象的实例呢?

示例:

您可以通过创建它来使用jQueryUI的对话框,然后您可以像$('#mydiv')那样将命令传递给它。dialog('close');这将访问附加到该元素的实例。这是如何完成的?

JQUERY_MYSELECTOR.JS

(function($){
    $.fn.MySelector = function(incoming) {

        if (typeof(incoming) != 'object') {
            return runCommand(incoming);
        }

        var options = $.extend({},{
            id: false,
            backgroundColor: false
        },incoming);

        function runCommand(cmd) {
            alert('blah:'+this.options.backgroundColor+"\n"+'cmd:'+cmd);
        }
    }
})(jQuery);

SCRIPT

<script type="text/javascript" src="jquery_myselector.js"></script>
<script type="text/javascript">
    $j(document).ready(function() {
        $j('#selector1).MySelector({ backgroundColor: '#000000' });
        $j('#selector1-change').click(function() {
            $j('#selector1').MySelector('mooocow');
        });
    });
</script>

风格

<input type="button" value="selector1" id="selector1" />
<br/>
<input type="button" value="selector1-change" id="selector1-change" />

更新的 忘了在selector1(duh)上使用插件

3 个答案:

答案 0 :(得分:2)

在为选项赋值之前调用runCommand - options在runCommand主体内部具有值undefined。不要问我JS在声明之前是如何看到runCommand的主体的,但它可以。

此外,在MySelector的第一级,this绑定到运行$j('#selector1-change')的结果,这是一个数组。您将需要迭代该数组。

尝试这样的事情:

(function($){
    function runCommand(e, cmd) {
        alert('blah:'+ e.options.backgroundColor+"\n"+'cmd:'+cmd);
    }

    $.fn.MySelector = function(incoming) {
        this.each(function() {
            if (typeof(incoming) != 'object') {
                return runCommand(this, incoming);
            } else {
                this.options = $.extend(this.options || {
                    id: false,
                    backgroundColor: false
                },incoming);    
            }
        });
    }
})(jQuery);

答案 1 :(得分:1)

您可以尝试这样的事情:

(function($){
    $.myPlugin = {
        foo: function () {...},
        bar: function () {...},
        foobar: function () {...}
    };

    $.fn.MySelector = function (operation) {
        if (typeof operation === 'string') {
            switch(operation) {
                'open':
                    $.myPlugin.foo();
                    break;
                'destroy':
                    $.myPlugin.bar();
                    break;
                default:
                    $.myPlugin.foobar();
                    break;
            }
        }
    }
}(jQuery));

答案 2 :(得分:0)

options在您的主要范围内使用var语句声明,您不需要在runCommand函数中使用this关键字,因为在该函数中您可以访问到外封闭:

    function runCommand(cmd) {
        alert('blah:'+options.backgroundColor+"\n"+'cmd:'+cmd);
    }