jQuery插件创作和/或构造函数注入

时间:2010-11-09 10:44:42

标签: javascript jquery

我编写了一个构建丰富UI控件的插件。我希望有一种方法可以让我在查询这个元素时以某种方式改变jQuery的运行方式。

我希望jQuery忘记这个控件的内部结构,但这并不是一个很难的要求。我想做的是将$('#RichUIControlID').val()的含义更改为其他函数,因为#RichUIControlID是此控件的包装元素(可能我使用css类来标识该元素)。 / p>

目前我必须调用插件函数$('#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 个答案:

答案 0 :(得分:2)

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