jQuery插件问题 - 我可以修改核心方法吗?

时间:2009-12-21 23:18:40

标签: javascript jquery css jquery-plugins

我开发了一些jQuery插件,之前的格式为$('#something').myPlugin()$.myPlugin()

我知道你也可以自己编写选择器。

我想知道是否可以编写一个更改css()方法工作方式的插件,也就是说,如果我请求简写CSS属性(例如填充),我可以返回类似这样的内容

return $(this).css('padding-top') + ' ' + $(this).css('padding-right') + ' ' + $(this).css('padding-bottom') + ' ' + $(this).css('padding-left');

这可能吗?如果是这样我该怎么办?

由于

4 个答案:

答案 0 :(得分:2)

这是可能的,但应该不惜一切代价避免在生产中使用

更改通常与多个插件串联使用的库的核心功能是一个坏的,危险的,坏的和危险的想法。

您可能会使覆盖的方法以其原始方式进行接口和操作,并且仅对参数子集表现不同;但是,在库的后续版本中,如果这个核心方法发生变化,简而言之,你可能会被搞砸,不得不重新审视被覆盖的方法。

最好使用不同的方法名称。也许,根据您的使用情况,您可以使用stylexCsscssExt或其他内容。

如果您正在寻找一种方法来结合您的方法和核心方法的功能,那么最好采取相反的方法。而不是覆盖核心方法,用其他功能包装它,当然还有一个新名称。

jQuery.fn.xCss = (function() {
    var compoundProperties = {
        'padding':    ['padding-top', 'padding-right' ...],
        'border':     ['border-width', 'border-style', ...],
        'background': ['background-color', ...],
        ...
    };

    return function(property, value) {
        // Use plugin functionality
        if ( compoundProperties.hasOwnPropery(property) ) { 
            // Get value
            if ( !value ) {
                var propertySet = compoundProperties[property],
                    result      = [];

                for ( var i=0, l=propertySet.length; i<l; ++i ) {
                    result.push( this.css(propertySet[i]) );
                }

                return result.join(" ");
            }

            // Set value
            ...
            return this;
        }

        // Use core functionality
        return this.css.apply(this, arguments);
    };
})();

*代码未经测试或完整。

答案 1 :(得分:1)

基本上,您需要替换jQuery方法。建议极为谨慎,因为你可以打破许多依赖这种方法的东西。最好选择不同的名字。

考虑这个概念:

jQuery.fn.css_orig = jQuery.fn.css

jQuery.fn.css = function(arg1, arg2) {
    if(arg1 == 'what-I-want')
    { 
        return my_thing;
    } 
    else
    {
        return this.css_orig(arg1, arg2);
    }
};

对于.css,我认为你可以(如果你非常小心)保留.css方法的100%功能,同时添加你的功能在上面。

很酷的想法,尽管如此!

答案 2 :(得分:0)

为什么不在应用程序命名空间中创建一个用户定义的函数来执行您想要的操作(您的自定义业务规则)?

通过这个例子,我没有看到在你当前的应用程序之外使用这个函数很多......

我的2美分

编辑: 嗨Alex,已经内置的功能可以帮助你吗?

  

简写CSS属性(例如保证金,   背景,边框)不受支持。   例如,如果要检索   渲染保证金,使用:   $(elem).css('marginTop')和   $(elem).css('marginRight'),等等。

我猜你可以用填充做同样的事情吗?

http://docs.jquery.com/CSS/css#name

答案 3 :(得分:-1)

您可以通过创建具有相同名称的插件来覆盖默认的jQuery方法。

Ask Ben处有更多关于此内容的信息。

  

jQuery经过深思熟虑,   功能强大的Javascript库,它   实际上用自己来建立自己。   我的意思是很多   jQuery提供的方法   库实际上是内部构建的   作为jQuery架构的插件。   当你开始思考   这种方法,它是一个小的   飞跃看到我们可以覆盖一个   通过简单的创建给出jQuery方法   一个同名的新插件。