【问题标题】:jQuery Plugin OptionsjQuery 插件选项
【发布时间】:2010-11-12 05:23:09
【问题描述】:

首先,我知道这是一个基本的 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 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)

【问题讨论】:

    标签: javascript jquery scope


    【解决方案1】:

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

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

    【讨论】:

    • 已经试过了。如果不使用“this”,Firebug 会抛出“无法访问优化的闭包”错误。
    【解决方案2】:

    你可以试试这样的:

    (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));
    

    【讨论】:

    • 我不是在寻找那个。我希望能够在具有不同选项堆栈的同一页面上多次使用它,但我也希望能够将命令传递给它。此时,当我尝试传递命令时,它会创建一个新的函数实例。
    • 每次调用都会有不同的选项堆栈,因为您使用传递的incoming 对象扩展options。你试图传递什么样的命令不能按预期工作?
    • runCommand 的调用应该是在插件第一次运行之后。就像你运行 $('#myDiv').dialog(); (来自 jQueryUI).. 然后你可以运行 $('#myDiv').dialog('close');在插件被“附加”到 DOM 元素后,您可以向它发送命令。许多插件都可以做到这一点,但我不知道如何。
    • 我已经更新了我的代码。现在它将根据您传递的第一个参数执行不同的操作。
    【解决方案3】:

    您在为选项分配值之前调用 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);
    

    【讨论】:

    • 好的,我明白你在说什么迭代数组。我会解决的。但是 runCommand 的调用应该是在插件第一次运行之后。运行时必须像 $('#myDiv').dialog(); (来自 jQueryUI).. 然后你可以运行 $('#myDiv').dialog('close');在插件被“附加”到 DOM 元素后,您可以向它发送命令。许多插件都可以做到这一点,但我不知道如何。
    • 我更改了我的代码,使其表现得更有状态。现在我明白你为什么要使用this.options。使用each进行迭代时,回调函数可以使用this访问当前项。您可以将其与 runCommand 一起使用,但您还需要将选项存储在 DOM 元素上,就像现在的代码一样。
    猜你喜欢
    • 1970-01-01
    • 2011-08-14
    • 2014-08-10
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多