解释
首先,我可能混淆了 jQueryconstructor
和init
函数,如果是这样,请忽略我下面的术语。
我有一个名为 的对象SineMacula
,目前它只是充当方法库的命名空间。
但是,我将要为对象编写一些方法SineMacula
,我想将其用作 jQuery 扩展。
这里出现了复杂性,而不是使用 jQuery 别名$
,我想使用该SineMacula
对象来运行 jQuery 构造。如此有效地,我的代码将如下所示:
SineMacula('#test').dropdown();
代替:
$('#test').dropdown();
但是,如果不是因为我的下一点,我认为这不会太难:
我不想给整个 jQuery 起别名,我只是想让 jQuery 构造函数在我调用时运行SineMacula('something')
,然后将任何方法应用于SineMacula('something')
我的问题
问这个问题的最好方法是通过说明。以下可能吗?
SineMacula('#test').someFunction(function(){
// Do something here
// The jQuery object must be passed in so that
// $(this) refers to SineMacula('#test')
});
但是,我不想这样做(完全别名 jQuery):
SineMacula('#test').animate(); // A regular jQuery function
我知道这可能是不可能的,但觉得值得一问:-)
更新 1
为了清楚起见,这是我目前用于该SineMacula
对象的一些代码:
/**
* Sine Macula Javascript API
* The Sine Macula API contains all base functions for use throughout
* all websites
* @name class.sinemacula.js
* @author Ben Carey
* @version 1.0
* @date 25/10/2012
* @copyright (c) 2012 Sine Macula MMVIII Limited (sinemacula.co.uk)
*/
function SineMacula(){
// Only proceed if jQuery has been loaded
if(typeof jQuery=='undefined'){
// jQuery has not been loaded
console.log('jQuery has not been loaded');
}else{
/**
* Sine Macula Load
* Load the Sine Macula Libraries and Plugins
* into the current document
*
* The options:
* - package: the package of libraries to load
* - packageURL: a remote source to load the package details from
* - libraries: any additional libraries to load
*
* @param object options The options for the Sine Macula load
*/
this.load = function(options){
// Load Sine Macula Libraries here
}
}
};
/**
* Overlay
* Place an overlay on the page
*
* The options:
* - wrapper: the wrapper to prepend to
* - fade: indicate whether or not to fade the overlay
* - fadeSpeed: the fade speed for the overlay fade
* - opacity: the opacity to apply to the overlay
* - color: the color to apply to the overlay
* - callback: the callback to be called once the function has completed
*
* @param boolean showHide A boolean to indicate whether to show/hide the overlay
* @param object options The options for the overlay
*/
SineMacula.prototype.overlay = function (showHide,options){
// Process the overlay here
};
// All libraries are extended onto the SineMacula object
该SineMacula
对象在每个页面的顶部启动,如下所示:
<script src="//libraries.example.net/jsapi" language="javascript" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
var sm = new SineMacula();
sm.load();
</script>
更新 2 - 忽略以上
是的,我发现很难解释我想要实现的目标。下面我会尽我所能分步完成,忽略上面的内容。
第1步
我有一个名为 的类SineMacula
,它包含许多可以做各种事情的方法。把它想象成一个像 jQuery 一样的库。
这是这样定义的:
function SineMacula(){
// Only proceed if jQuery has been loaded
if(typeof jQuery=='undefined'){
// jQuery has not been loaded
console.log('jQuery has not been loaded');
}else{
this.load = function(options){
// Load Sine Macula Libraries here
}
}
};
第2步
该类SineMacula
在每个页面的顶部使用以下代码启动:
<script src="//libraries.example.net/jsapi" language="javascript" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
var sm = new SineMacula();
</script>
第 3 步
然后,该对象通过调用例如加载该SineMacula
对象所需的任何库和扩展。这会将任何扩展动态加载到网页中。SineMacula
sm.load({package:'all'})
第4步
扩展定义如下:
SineMacula.prototype.doSomething = function(){
// Do something here
}
第 5 步 - 这是事情变得更复杂的地方
到目前为止,该SineMacula
对象一直充当诸如doSomething()
etc之类的方法的命名空间。
我现在想定义的方法不仅仅是作为一个函数。
在我本来可以调用的地方SineMacula.doSomething()
,我现在希望能够调用SineMacula('#test').doSomething()
where与 jQuery 中SineMacula('#test')
的行为相同$('#test')
。
所以我可以像这样访问我的功能:
SineMacula.doSomething('maybe parameters here');
SineMacula('selector').doSomethingElse('maybe parameters here');
与您可以调用的方式相同:
$.ajax('parameters');
$('selector').animate('parameters');
因此,如果将参数传递给SineMacula
对象,则使用 jQuery选择器函数对其进行处理,并作为主题传递给被调用的方法。
例如:
// Call doSomethingElse on the #test element
SineMacula('#test').doSomethingElse();
// Within the doSomethingElse function $(this) relates to $('#test')
总结...
SineMacula('selector')
就像提供了$('selector')
一样'selector'
,这被传递给子方法。但SineMacula
不是 jQuery 的扩展。我不想SineMacula
成为一个别名$
。