【问题标题】:jQuery plugin namespace for specific objects特定对象的 jQuery 插件命名空间
【发布时间】:2012-02-21 19:15:37
【问题描述】:

我正在尝试创建一个 jQuery 插件,它将向上下文对象添加新的命名空间函数,同时保持完整的链能力。我不确定这是否可能,但这是我目前所拥有的一个例子:

(function ($) {
    var loadScreen = $('<div />').text('sup lol');

    $.fn.someplugin = function (args) {
        var args = args || {},
            $this = this;

        $this.append(loadScreen);

        return {
            'caption' : function (text) {
                loadScreen.text(text);
                return $this;
            }
        };
    }
})(jQuery);

如果我这样做$(document.body).someplugin().caption('hey how\'s it going?').css('background-color', '#000');,这很好用

不过我还需要$(document.body).someplugin().css('background-color', '#000').caption('hey how\'s it going?');的能力

由于.someplugin() 返回它自己的对象,而不是一个jQuery 对象,它不能按预期工作。我还需要以后能够通过$(document.body) 访问.caption()。例如,如果没有为初始 $(document.body).someplugin() 设置变量。这意味着 .caption() 将以某种方式通过 $.fn.caption = function () ... 设置为 document.body 对象。这是我不太确定可能的部分。如果没有,那么我想我将不得不满足于要求设置一个变量,以维护插件函数链能力。

这是我所期望的示例代码:

$(document.body).someplugin().css('background-color', '#000');
$('.non-initialized').caption(); // Error, jQuery doesn't know what caption is
$(document.body).caption('done loading...');

如果这是不可能的,或者只是效率很低,我愿意满足于:

var $body = $(document.body).someplugin().css('background-color', '#000');
$('.non-initialized').caption(); // Error, jQuery doesn't know what caption is
$body.caption('done loading...');

【问题讨论】:

    标签: javascript jquery plugins namespaces


    【解决方案1】:

    jquery-chainable,一个 jQuery 方法必须返回一个 jQuery 对象或一个支持所有 jQuery 方法的对象。您只需要决定是否希望您的插件可链接到其他 jQuery 方法,或者是否希望它返回您自己的数据。你不能两者兼得。选择一个。

    在您的代码示例中,您可以定义多个插件方法,.someplugin().caption()。 jQuery 无法实现仅适用于一个特定 DOM 对象的 jQuery 插件方法。但是,使该方法可用于所有 jQuery 对象并没有什么坏处,您只能将其用于有意义的对象。

    我认为你可以使用这个:

    (function ($) {
        var loadScreen = $('<div />').text('sup lol');
    
        $.fn.someplugin = function (args) {
            var args = args || {},
                $this = this;
    
            $this.append(loadScreen);
            return(this);
        }
    
        $.fn.caption = function (text) {
            loadScreen.text(text);
            return this;
        }
    })(jQuery);
    
    $(document.body).someplugin().css('background-color', '#000');
    $('.non-initialized').caption('whatever');
    $(document.body).caption('done loading...');
    

    如果两个.caption() 电话之间应该有某种联系,请进一步解释,因为我没有从你的问题中理解这一点。

    【讨论】:

    • 重点是我不会弄乱 jQuery 命名空间,同时仍然能够将可链接的函数扩展到我自己的插件上。 .caption() 可能在 $.fn.loading = function () ...$.fn.tabs = function () 之间完全不同。基本上,我需要能够在单独的插件之间分离.caption() 功能。
    • 我想我已经想出了一个使用 $.extend($this, {caption: function () {...}}); 的解决方案...它仍然需要我使用变量,但至少它不会弄乱 jQuery 命名空间。
    • 请记住,您只是在扩展特定的 jQuery 对象,并且您必须保存该 jQuery 对象才能访问该方法。你也可以用this.caption = function() {}; 做到这一点你不需要.extend()
    • 所以(可能是一个显而易见的问题)你认为使用this.caption = function () {} 比扩展它更有效吗?
    • 他们做同样的事情。 .extend() 合并两个对象,当源对象上有多个属性/方法时很有用。在您的情况下,您只有一种方法可以打包到临时对象中,这样您就可以使用.extend(),因此使用.extend() 没有任何优势。我推荐的简单作业更简洁 IMO。两者都行。
    猜你喜欢
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 2013-03-10
    • 2012-09-19
    • 2010-11-19
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    相关资源
    最近更新 更多