jquery链接如何工作?
我不是问什么是链接的适当的语法,我知道它可能是这样的:
$('myDiv').removeClass('off').addClass('on');
不过我真的很好奇,理解它的内部工作,据我所知,链接是其他着名框架的优势之一,但这个我们像一个像我这样的新手程序员的抽象,我肯定有人出来那里可以给我一个解释,让我了解如何链接工程。
谢谢!
如果你有一个具有特定方法的对象,如果每个方法都返回一个包含方法的对象,那么你可以直接从返回的对象中调用一个方法。
var obj = { // every method returns obj---------v first: function() { alert('first'); return obj; }, second: function() { alert('second'); return obj; }, third: function() { alert('third'); return obj; } } obj.first().second().third();
演示: http : //jsfiddle.net/5kkCh/
它所做的只是在方法结束时返回this
的引用。 以这个简单的对象为例:
var sampleObj = function() { }; sampleObj.prototype.Foo = function() { return this; };
您可以整天链接这些电话,因为您返回this
的引用:
var obj = new sampleObj(); obj.Foo().Foo().Foo().Foo() // and so on
jQuery只是执行一个操作,然后返回this
。
基本上第一个函数调用$('myDiv')
返回一个jQuery对象,然后每个后续调用返回相同的一个。
严格地说,
var $ = function(selector) { return new jQuery(selector); }; jQuery.prototype.removeClass = function(className) { // magic return this; }
return $this;
每个jQuery函数返回一个jQuery类的实例,然后可以调用它的方法。 你可以把它分解,这个代码会有相同的效果。
jQuery_obj = $('myDiv'); jQuery_obj = jQuery_obj.removeClass('off'); jQuery_obj = jQuery_obj.addClass('on');
重点是一个函数必须评估为“父”function。 所以,例如
foo().bar().test();
必须评估:
foo().test();
这样你就可以在foo()
上调用另一个函数了。 要做到这一点,你可以return this
:
function foo() { // empty, nothing interesting here } foo.prototype.bar = function() { return this; } foo.prototype.test = function() { return this; }
然后,
var something = new foo(); something.bar() === something; // true
正因为如此:
something.bar().test() === something.test(); // true
因此,因为something.bar()
计算出来的something
,你可以立即调用第二个函数。
在链接父函数/方法返回一个对象,然后由子函数/方法使用,事情就这样。 总之, jQuery
或$
返回本身(一个对象),允许链接。
下面是同样的机制
var obj=$('input'); //returns jQuery object var obj1=obj.val('a'); //returns jQuery object var obj2=obj1.fadeOut();//returns jQuery object
它看起来像这样,如果它是与链接
$('input').val('a').fadeOut();
下面是一个条件callback链的例子,就像在$.ajax
jQuery函数中使用的一样。
// conditional callback function example myFunction = function () { // define event callback prototypes without function parameter var callback_f = new Object; callback_f.callback1 = function () { return callback_f; }; callback_f.callback2 = function () { return callback_f; }; if ([condition]){ // redefine the callback with function parameter // so it will run the user code passed in callback_f.ReturnPlayer = function (f) { f(); return callback_f; }; }else{ callback_f.NewPlayer = function (f) { f(); return callback_f; }; } return callback_f; }
链接的方法之一,检查演示 。
test("element").f1().f2().f3()