一个很老的话题,只是自己做下记录,免得忘记。写得比较简单还请见谅,有不对的地方也请告知,多谢:) jQuery的版本2.1.1pre
如何生成一个jQuery对象呢?
直接调用$(selector, context)即可,让我们来看看源码都做了什么
// Define a local copy of jQuery jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' // Need init if jQuery is called (just allow error to be thrown if not included) return new jQuery.fn.init( selector, context ); },
实例化一个jQuery.fn.init对象(别看那么长的名字,就当成是一个function name就行),那在这个构造函数里都做了什么呢?
init = jQuery.fn.init = function( selector, context ) { var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false) if ( !selector ) { return this; } ........ if ( selector.selector !== undefined ) { this.selector = selector.selector; this.context = selector.context; } return jQuery.makeArray( selector, this ); };
其实就是返回来一个伪数组的自身实例,也就是jQuery.fn.init的实例,这也就是我们常用到的jQuery对象。
那jQuery怎么实现链式语法呢?
我们接着源码往下看,下面这句是关键。
// Give the init function the jQuery prototype for later instantiation init.prototype = jQuery.fn;
也就是jQuery.fn.init的实例都拥有jQuery.fn相应的方法,也就是我们所使用的方法都在这个上面。那jQuery.fn最开始是什么样的?没有jQuery.fn也就没有jQuery.fn.init。
jQuery.fn = jQuery.prototype = { // The current version of jQuery being used jquery: version, constructor: jQuery, // Start with an empty selector selector: "", // The default length of a jQuery object is 0 length: 0, toArray: function() { return slice.call( this ); }, ..................... };
这就是他的赋值来,相当于一个Object对象。那怎么给他新增方法呢?看看他给我们提供了什么?
jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; // skip the boolean and the target target = arguments[ i ] || {}; i++; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !jQuery.isFunction(target) ) { target = {}; } // extend jQuery itself if only one argument is passed if ( i === length ) { target = this; i--; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( (options = arguments[ i ]) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop if ( target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && jQuery.isArray(src) ? src : []; } else { clone = src && jQuery.isPlainObject(src) ? src : {}; } // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; };
通过extend可以扩展方法,其中jQuery.extend是给jQuery扩展方法,这个我的理解他就像一个工具类,比如我们常用的$.each,$.trim等都源自于此。而jQuery.fn.extend则相当于给我们的jQuery对象扩展方法,上下文就是jQuery.fn.init实例对象本身,链式中方法都源自于此。
既然是链式语法,那方法调用后都返回了什么呢?
很显然的就是jQuery对象自身,我们看看removeAttr的实现
jQuery.fn.extend({ attr: function( name, value ) { return access( this, jQuery.attr, name, value, arguments.length > 1 ); }, removeAttr: function( name ) { return this.each(function() { jQuery.removeAttr( this, name ); }); } });
jQuery.fn = jQuery.prototype = { ..................... // Execute a callback for every element in the matched set. // (You can seed the arguments with an array of args, but this is // only used internally.) each: function( callback, args ) { return jQuery.each( this, callback, args ); }, ..................... }
从之前的init.prototype = jQuery.fn;可以看出this实际上就是init的实例。
jQuery.extend({ .................................. // args is for internal usage only each: function( obj, callback, args ) { var value, i = 0, length = obj.length, isArray = isArraylike( obj ); if ( args ) { if ( isArray ) { for ( ; i < length; i++ ) { value = callback.apply( obj[ i ], args ); if ( value === false ) { break; } } } else { for ( i in obj ) { value = callback.apply( obj[ i ], args ); if ( value === false ) { break; } } } // A special, fast, case for the most common use of each } else { if ( isArray ) { for ( ; i < length; i++ ) { value = callback.call( obj[ i ], i, obj[ i ] ); if ( value === false ) { break; } } } else { for ( i in obj ) { value = callback.call( obj[ i ], i, obj[ i ] ); if ( value === false ) { break; } } } } return obj; }, ..................... }
直接看返回的结果obj, 他就是之前传入的this参数,也就是jQuery.fn.init的实例对象,removeAttr最后调用this.each返回的就是这个对象。这个对象拥有着jQuery.fn上的所有方法,所以我们还能接着调用jQuery的方法。
相关推荐
本教程将通过一系列实例,帮助你快速理解并掌握jQuery的语法。 一、选择器(Selectors) jQuery的选择器是其强大的功能之一,它们基于CSS选择器,允许你精准地选取页面中的元素。例如,`$("#id")`用于选取ID为"id...
现在,我们将详细讲解“隐式迭代”、“链式编程”以及“jQuery插件”。 1. **隐式迭代**: jQuery的一个显著特性是它的选择器功能,它允许开发者通过CSS选择器轻松地选取DOM元素。当一个jQuery对象被创建后,所有...
1. **选择器**:JQuery的链式语法和丰富的选择器简化了DOM元素的选择。 2. **DOM操作**:如`$(selector).html()`, `append()`, `remove()`等方法方便地处理HTML内容。 3. **事件处理**:`on()`, `off()`, `click()`,...
标题“Javascript 链式调用实现代码(参考jquery)”和描述“谓的链式调用无非是一个语法技巧而已,我就学Jquery写了一个粗浅的库”说明了本段代码的核心在于演示如何使用JavaScript实现类似jQuery库中的链式调用特性...
jQuery的核心是它的链式操作和简洁的语法。在jQuery中,通常以`$`函数开始,它可以用来选择DOM元素、执行操作或创建新元素。 ```javascript // 选择元素 $('selector').action(); // 创建元素 $('<element>')....
要了解如何实现连缀语法,首先要对jQuery的核心思想有一个全面的认识。 在jQuery中,连缀语法是通过返回jQuery对象自身来实现的。这样做的好处是,可以在一个表达式中连续调用多个jQuery方法,每个方法的返回值都是...
* jQuery 使用链式语法,可以方便地操作 DOM 元素 * jQuery 支持 CSS1.3 选择器,可以轻松设置、删除、读取 CSS 属性 * jQuery 提供了多种选择器,例如:`$()`、`find()`、`parent()` 等 知识点三:jQuery 事件响应...
**jQuery基础语法详解** jQuery,一个轻量级的JavaScript库,因其简洁的API和高效的DOM操作而备受开发者喜爱。它极大地简化了JavaScript的使用,使得网页动态化和交互变得更加容易。在本文中,我们将深入探讨jQuery...
jQuery通过选择器(如$("#elementId"))使得选取DOM元素变得简单,然后可以使用链式调用来执行一系列操作,如CSS更改、事件绑定或数据操作。这种简洁的语法极大地方便了开发者编写代码。 在这个后台管理界面中,...
### jQuery语法和注意事项 #### 一、页面元素的引用 在使用jQuery进行页面元素操作时,最基础也是最重要的就是能够准确地引用到页面中的元素。jQuery提供了多种方式来选取元素,包括通过`id`、`class`、`标签名`等...
- **链式操作**:jQuery对象返回的是自身,允许连续调用多个方法,如`$("p").css("color", "red").hide()`。 - **DOM操作**:包括添加、删除或修改HTML元素,如`append()`, `remove()`, `html()`, `text()`等。 -...
**jQuery 语法** jQuery 是一个广泛使用的 JavaScript 库,它简化了HTML文档遍历、事件处理、...同时,jQuery的源码也是一个学习JavaScript和面向对象编程的好材料,可以帮助开发者深入理解JavaScript库的设计与实现。
jQuery对象支持链式调用,这意味着你可以连续执行多个方法,如`$("#example").css("color", "red").fadeIn(500)`。 在"JQuery实现插入行"这个主题中,我们将主要关注如何动态地向HTML表格中添加新的行。以下是一个...
本篇文章关注的是如何通过一些技巧让Canvas支持链式语法,类似于jQuery那样使得代码更易读、更紧凑。 链式语法是一种编程风格,允许开发者在一个对象的方法调用后直接调用另一个方法,而无需反复引用该对象。在...
jQuery的核心特性可以总结为:具有独特的链式语法和短小清晰的多功能接口;具有高效灵活的CSS选择器,并且可对CSS选择器进行扩展;拥有便捷的插件扩展机制和丰富的插件。jQuery兼容各种主流浏览器,如IE 6.0+、FF ...
jquery设计的宗旨是“write Less,Do More”(即倡导写更少的代码,做更多的事情),其核心特性可以总结为:具有独特的链式语法和短小清晰的多功能接口;具有高效灵活的css选择器,并且可对CSS选择器进行扩展;拥有...
**jQuery语法** jQuery 是一个广泛使用的JavaScript库,它简化了HTML文档遍历、事件处理、动画制作和Ajax交互。...通过熟悉并掌握jQuery的基本语法,开发者可以更快、更有效地实现动态网页效果和交互。
- 使用jQuery,开发者可以使用链式调用,使得代码更简洁、易读。 - `$(document).ready()`是jQuery中的常用函数,确保在DOM加载完成后执行代码。 2. **SVG**: - SVG是一种可缩放的矢量图形格式,它可以无损地...
jQuery的核心特性可以总结为:具有独特的链式语法和短小清晰的多功能接口;具有高效灵活的css选择器,并且可对CSS选择器进行扩展;拥有便捷的插件扩展机制和丰富的插件。jQuery兼容各种主流浏览器,如IE 6.0+、FF ...