【问题标题】:jQuery plugin question - can I modify a core method?jQuery 插件问题 - 我可以修改核心方法吗?
【发布时间】:2009-12-21 23:18:40
【问题描述】:

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

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

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

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

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

谢谢

【问题讨论】:

    标签: javascript jquery css jquery-plugins


    【解决方案1】:

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

    更改一个经常与多个插件一起使用的库的核心功能是一个糟糕、危险、又糟糕又危险的想法。

    您可能会导致被覆盖的方法以其原始方式进行接口和行为,并且仅对参数子集的行为有所不同;但是,在库的后续版本中,如果此核心方法发生更改,简而言之,您可能会被搞砸并不得不重新访问被覆盖的方法。

    最好使用不同的方法名。也许,对于您的用途,您可以使用 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);
        };
    })();
    

    * 代码未经测试或完成。

    【讨论】:

      【解决方案2】:

      基本上,您需要替换 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% 的功能,同时在顶部添加您的功能。

      好主意,不过如此!

      【讨论】:

      • 那真的不安全。如果任何其他(插件)方法依赖于 css 方法返回无效属性的空字符串,并且您开始定义这些属性,那么您将破坏其他人的代码。
      • @贾斯汀约翰逊:他问怎么做,我建议他怎么做(以及大量的警告)。当然,这不是一个“好主意”。
      【解决方案3】:

      为什么不在您的应用程序命名空间中创建一个用户定义的函数来满足您的需求(您的自定义业务规则)?

      通过示例,我没有看到在您当前的应用程序之外使用此功能...

      我的 2 美分

      编辑: 嗨亚历克斯,已经内置的功能可以帮助你吗?

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

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

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

      【讨论】:

      • 我认为 CSS 速记对除了我之外的某些人来说可能会很方便?
      • @alex 可以,就像一个单独的插件一样
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-13
        相关资源
        最近更新 更多