Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery插件编写和/或构造函数注入_Javascript_Jquery - Fatal编程技术网

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

Javascript jQuery插件编写和/或构造函数注入,javascript,jquery,Javascript,Jquery,我已经编写了一个插件,它构造了一个富UI控件。我希望有一种方法可以让我在查询这个元素时以某种方式改变jQuery的操作方式 我希望jQuery能够忽略此控件的内部结构,但这并不是一个很难满足的要求。我想做的是将$('#richucontrolid').val()的含义更改为其他函数,因为#richucontrolid是此控件的包装器元素(可能我使用css类来标识该元素) 目前,我必须调用插件函数$('#richucontrolid').richucontrolid().val(),该函数将返回带

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

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

目前,我必须调用插件函数
$('#richucontrolid').richucontrolid().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()
的每次调用都不必检查它是否是#richucontrolid元素,如果可能的话,我宁愿在构造期间连接它

编辑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;
    }
})();

您可以重写JQuery的val()方法(请参阅)来实现自己的逻辑,如果目标对象是标准对象,则可以保留对原始方法的回退

很好!我的插件的公共接口相当小,但如果我继续这样做的话,我将提供该API作为附加插件。我有像get_selectedItem和get_selectedItems这样的东西。现在考虑到可能有多个插件想要更改val方法的场景,我担心它会导致一个大混乱,而不是在jQuery对象被构造为包装器元素时添加/重写该方法。有什么想法吗?嗨,John,我想到的第一个想法是:可以创建类似“extVal()”的东西来实现自定义逻辑,并在重写的val()中检查extVal()是否已定义。如果为true,则应用扩展方法,否则应用标准val(),这是一个更优雅的解决方案……关键是使实现不透明。检查我的编辑2,您将看到我如何以类似的方式更改init函数(构造函数)。