代码之家  ›  专栏  ›  技术社区  ›  John Leidegren

jquery插件编写和/或构造函数注入

  •  1
  • John Leidegren  · 技术社区  · 14 年前

    我编写了一个插件,它构造了一个丰富的UI控件。我希望有一种方法可以让我在查询这个元素时改变jquery的操作方式。

    我希望jquery忽略这个控件的内部结构,但这并不是一个很难的要求。我想做的是改变 $('#RichUIControlID').val() 因为 #RichUIControlID 是此控件的包装元素(可能我使用CSS类来标识该元素)。

    目前我必须调用插件函数 $('#RichUIControlID').richUIControlID().val() 这将返回带有必要更改的jquery对象。 val() 在这种情况下,我希望它做什么。

    但是,如果我可以在不使用附加函数调用的情况下维护jquery接口,那么它将允许我继续使用熟悉的模式,在我的例子中,这种模式具有巨大的重用价值。

    // I want to change val() depending on some property of the selector #RichUIControlID
    $('#RichUIControlID').val()
    

    可以这样做吗?

    编辑1:

    这样做的一种方式,因为MAMOO提供的链接,将是这样做然后:

    (function() {
        var val = jQuery.fn.val;
        jQuery.fn.val = function() {
            if (this.is('#RichUIControlID'))
                return this.richUIControlID().val()
            else
                return val.apply(this, arguments);
        }
    })();
    

    然而,这感觉有点太过侵入。每次召唤 Val.() 不需要检查它是否是richuiControlID元素,如果可能的话,我宁愿在施工期间将其连接起来。

    编辑2:

    这就是问题所在,浏览源代码实际上可以以相同的方式控制jquery构造函数。这里要注意的是,如果您首先不将调用转发给默认的构造函数,那么最终会得到一个麻烦的调用堆栈。

    (function() {
        var init = jQuery.fn.init;
        jQuery.fn.init = function() {
            var q = init.apply(this, arguments); // call this first
            if (q.data('RichUIControlID'))
                return q.richUIControlID();
            else
                return q;
        }
    })();
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   mamoo    14 年前

    可以重写jquery的val()方法(请参见 http://www.bennadel.com/blog/1624-Ask-Ben-Overriding-Core-jQuery-Methods.htm )实现自己的逻辑,如果目标对象是标准对象,则保留对原始方法的回退。