返回顶部
首页 > 资讯 > 前端开发 > VUE >jQuery中怎么实现一个构造器
  • 619
分享到

jQuery中怎么实现一个构造器

2024-04-02 19:04:59 619人浏览 安东尼
摘要

这篇文章给大家介绍Jquery中怎么实现一个构造器,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。2009-01-13发布的1.3版init: function( s

这篇文章给大家介绍Jquery中怎么实现一个构造器,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

2009-01-13发布的1.3版

init: function( selector, context ) {     // Make sure that a selection was provided        selector = selector || document;          // 处理节点参数,直接添加属性到新实例上        if ( selector.nodeType ) {            this[0] = selector;            this.length = 1;            this.context = selector;            return this;        }        // 处理字符串参数        if ( typeof selector === "string" ) {            // 判定是否为html片断还是ID            var match = quickExpr.exec( selector );                if ( match && (match[1] || !context) ) {                 // 如果是HTML片断,转换一个由节点构造的数组                if ( match[1] )                   selector = jQuery.clean( [ match[1] ], context );                   // 如果是ID,则查找此元素,如果找到放进空数组中                else {                    var elem = document.getElementById( match[3] );                     // Make sure an element was located                    if ( elem ){                        // 处理 IE and Opera 混淆ID与NAME的bug                        if ( elem.id != match[3] )                            return jQuery().find( selector );                        var ret = jQuery( elem );                        ret.context = document;                        ret.selector = selector;                        return ret;                    }                    selector = [];                }            } else           //使用Sizzle处理其他CSS表达式,生成实例并返回                return jQuery( context ).find( selector );            // 处理函数参数,直接domReady        } else if ( jQuery.isFunction( selector ) )            return jQuery( document ).ready( selector );         //处理jQuery对象参数,简单地将其两个属性赋给新实例        if ( selector.selector && selector.context ) {            this.selector = selector.selector;            this.context = selector.context;        }        //将上面得到节点数组,用setArray方法把它们变成实例的元素        return this.setArray(jQuery.makeArray(selector));    },

2009-02-19发布的1.32版

init: function( selector, context ) {        // Make sure that a selection was provided        selector = selector || document;        // 处理节点参数,直接添加属性到新实例上        if ( selector.nodeType ) {            this[0] = selector;            this.length = 1;            this.context = selector;            return this;        }         //处理字符串参数        if ( typeof selector === "string" ) {            //判定是否为HTML片断还是ID            var match = quickExpr.exec( selector );            if ( match && (match[1] || !context) ) {               // 如果是HTML片断,转换一个由节点构造的数组                if ( match[1] )                    selector = jQuery.clean( [ match[1] ], context );                else {                    var elem = document.getElementById( match[3] );                     // 如果是ID,则查找此元素,如果找到放进空数组中                    if ( elem && elem.id != match[3] )                      return jQuery().find( selector );                       //这里对1.3版做了些优化,更简洁                    var ret = jQuery( elem || [] );                    ret.context = document;                    ret.selector = selector;                    return ret;                }            } else               //使用Sizzle处理其他CSS表达式,生成实例并返回                return jQuery( context ).find( selector );               // 处理函数参数,进行domReady操作        } else if ( jQuery.isFunction( selector ) )            return jQuery( document ).ready( selector );            //处理jQuery对象参数,简单地将其两个属性赋给新实例        if ( selector.selector && selector.context ) {            this.selector = selector.selector;            this.context = selector.context;        }    //这里对1.3版做了些扩展,允许传珍上元素集合(HTMLCollection)与节点集合(NodeList),    //元素数组可能是我们用字符串转换过来的,也可以是用户直接传进来的        return this.setArray(jQuery.isArray( selector ) ? selector : jQuery.makeArray(selector));    },

2010-01-13发布的1.4版

init: function( selector, context ) {        var match, elem, ret, doc;        //处理空白字符串,null,undefined参数(新增),返回一个非常纯净的实例        if ( !selector ) {            return this;        }        // 处理节点参数,直接添加属性到新实例上        if ( selector.nodeType ) {            this.context = this[0] = selector;//写法上优化            this.length = 1;            return this;        }        //处理字符串参数        if ( typeof selector === "string" ) {            //  判定是否为HTML片断还是ID            match = quickExpr.exec( selector );            if ( match && (match[1] || !context) ) {                //如果是HTML片断                if ( match[1] ) {                    //取得文档对象                    doc = (context ? context.ownerDocument || context : document);                    // 如果是单个标签,直接使用 document.createElement创建此节点并放入数组中                    ret = rsingleTag.exec( selector );                    if ( ret ) {                        //如果后面跟着一个纯净的js对象,则为此节点添加相应的属性或样式                        if ( jQuery.isPlainObject( context ) ) {                            selector = [ document.createElement( ret[1] ) ];                            jQuery.fn.attr.call( selector, context, true );                        } else {                            selector = [ doc.createElement( ret[1] ) ];                        }                    } else {                        //改由buildFragment来生成节点集合(NodeList)                        ret = buildFragment( [ match[1] ], [ doc ] );                        selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;                    }                } else {                    // 如果是ID,则查找此元素,如果找到放进空数组中                    elem = document.getElementById( match[2] );                    if ( elem ) {                       // 处理 IE and Opera 混淆ID与NAME的bug                        if ( elem.id !== match[2] ) {                            return rootjQuery.find( selector );                        }                        //这里也做了一些优化,原来是很傻地再生成一个jQuery实例                        this.length = 1;                        this[0] = elem;                    }                    this.context = document;                    this.selector = selector;                   return this;                }                   // 如果字符是很简单的标签选择器,那基本没有必要走Sizzle路线,直接getElementsByTagName,很好的优化            } else if ( !context && /^\w+$/.test( selector ) ) {                this.selector = selector;                this.context = document;                selector = document.getElementsByTagName( selector );                // 如果第二个参数不存在或者是jQuery对象,那么用它或rootjQuery调用find查找目标节点(走Sizzle路线)            } else if ( !context || context.jquery ) {                return (context || rootjQuery).find( selector );                // HANDLE: $(expr, context)                // (which is just equivalent to: $(context).find(expr)            } else {                //如果第二个参数已指定为某元素节点,转为jQuery对象,走Sizzle路线                return jQuery( context ).find( selector );            }               // 处理函数参数,直接domReady        } else if ( jQuery.isFunction( selector ) ) {            return rootjQuery.ready( selector );        }        //处理jQuery对象参数,简单地将其两个属性赋给新实例        if (selector.selector !== undefined) {            this.selector = selector.selector;            this.context = selector.context;        }     //这里又做了些许修改,缘于makeArray可以接受第二个参数(可以是数组或类数组,这时相当合并操作)        return jQuery.isArray( selector ) ?            this.setArray( selector ) ://内部用push方法,迅速将一个普通对象变成类数组对象            jQuery.makeArray( selector, this );    },

接着是广受欢迎的2010-02-13发布的1.42版

init: function( selector, context ) {        var match, elem, ret, doc;       // 处理空白字符串,null,undefined参数        if ( !selector ) {            return this;        }        // 处理节点参数        if ( selector.nodeType ) {            this.context = this[0] = selector;            this.length = 1;            return this;        }           // 处理body参数(新增)        if ( selector === "body" && !context ) {            this.context = document;            this[0] = document.body;            this.selector = "body";            this.length = 1;            return this;        }        // 处理字符串参数,分七种情形:        //①单个标签,带对象属性包           --->   jQuery.merge        //②单个标签,不带对象属性包         --->   attr + jQuery.merge        //③复杂的HTML片断                 --->   buildFragment + jQuery.merge        //④ID选择器,与找到的元素的ID不同   --->   getElementById + Sizzle + pushStack        //⑤ID选择器,与找到的元素的ID相同   --->   getElementById + 简单属性添加        //⑥标签选择器                     --->   getElementsByTagName + jQuery.merge        //⑦其他CSS表达式                  --->   Sizzle + pushStack        if ( typeof selector === "string" ) {            match = quickExpr.exec( selector );            if ( match && (match[1] || !context) ) {                if ( match[1] ) {                    doc = (context ? context.ownerDocument || context : document);                    ret = rsingleTag.exec( selector );                    if ( ret ) {                      if ( jQuery.isPlainObject( context ) ) {                            selector = [ document.createElement( ret[1] ) ];                            jQuery.fn.attr.call( selector, context, true );                        } else {                            selector = [ doc.createElement( ret[1] ) ];                        }                    } else {                        ret = buildFragment( [ match[1] ], [ doc ] );                        selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;                    }                    return jQuery.merge( this, selector );                } else {                    elem = document.getElementById( match[2] );                    if ( elem ) {                        if ( elem.id !== match[2] ) {                            return rootjQuery.find( selector );                        }                        this.length = 1;                        this[0] = elem;                    }                    this.context = document;                    this.selector = selector;                    return this;                }            } else if ( !context && /^\w+$/.test( selector ) ) {                this.selector = selector;                this.context = document;                selector = document.getElementsByTagName( selector );                return jQuery.merge( this, selector );            } else if ( !context || context.jquery ) {                return (context || rootjQuery).find( selector );            } else {               return jQuery( context ).find( selector );            }            // 处理函数参数,直接domReady        } else if ( jQuery.isFunction( selector ) ) {            return rootjQuery.ready( selector );        }        //处理jQuery对象参数        if (selector.selector !== undefined) {            this.selector = selector.selector;            this.context = selector.context;        }        //无论是数组还是类数组(如NodeList),统统使用jQuery.makeArray来为实例添加新的元素        return jQuery.makeArray( selector, this );    },

另附上makeArray方法与merge方法,merge方法好神奇啊

makeArray: function( array, results ) {        var ret = results || [];         if ( array != null ) {            // The window, strings (and functions) also have 'length'            // The extra typeof function check is to prevent crashes            // in Safari 2 (See: #3039)            if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || (typeof array !== "function" && array.setInterval) ) {                push.call( ret, array );            } else {                jQuery.merge( ret, array );            }        }        return ret;    },    merge: function( first, second ) {        var i = first.length, j = 0;         if ( typeof second.length === "number" ) {            for ( var l = second.length; j < l; j++ ) {                first[ i++ ] = second[ j ];            }        } else {            while ( second[j] !== undefined ) {                first[ i++ ] = second[ j++ ];            }        }        first.length = i;        return first;    },

2011-01-23发布的1.5版,其init方法与1.42的变化不大:只有两处做了改动:

//1.42    -  ret = buildFragment( [ match[1] ], [ doc ] );    -  selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;    //1.5    + ret = jQuery.buildFragment( [ match[1] ], [ doc ] );    + selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;    //1.42    - return jQuery( context ).find( selector );    //1.5    + return this.constructor( context ).find( selector );//目的就是为了不再生成新实例

2011-05-02发布的jquery1.6,变化不大,只是对HTML片断进行了更严密的判定:

// Are we dealing with HTML string or an ID?       if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {      // Assume that strings that start and end with <> are HTML and skip the regex check        match = [ null, selector, null ];       } else {        match = quickExpr.exec( selector );       }

关于jQuery中怎么实现一个构造器就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: jQuery中怎么实现一个构造器

本文链接: https://lsjlt.com/news/66376.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • jQuery中怎么实现一个构造器
    这篇文章给大家介绍jQuery中怎么实现一个构造器,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。2009-01-13发布的1.3版init: function( s...
    99+
    2024-04-02
  • 怎么在java中创建一个构造器
    这篇文章将为大家详细讲解有关怎么在java中创建一个构造器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;...
    99+
    2023-06-14
  • C#中怎么构造一个POP3服务器
    C#中怎么构造一个POP3服务器,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C#构造POP3服务器下面我们要用VS.NET 2003和C#开发一个“伪”POP3服务器——之所...
    99+
    2023-06-17
  • Python中怎么构造一个列表
    Python中怎么构造一个列表,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Python构造列表语法代码示例:#!/usr/bin/env python  ...
    99+
    2023-06-17
  • jQuery中怎么实现一个子选择器
    本篇文章给大家分享的是有关jQuery中怎么实现一个子选择器,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。子元素选择器与可见性选择器子元素选择...
    99+
    2024-04-02
  • C++中怎么定义一个构造函数
    C++中怎么定义一个构造函数,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C++构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后...
    99+
    2023-06-17
  • JQuery中怎么实现一个分页程序
    这篇文章将为大家详细讲解有关JQuery中怎么实现一个分页程序,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。首先Default.aspx页面需要引用的JS文...
    99+
    2024-04-02
  • JavaScript中怎么实现一个栈结构
    JavaScript中怎么实现一个栈结构,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1.1.什么是数据结构数据结构就是在计算...
    99+
    2024-04-02
  • Java项目中和实现自动生成一个构造方法
    这篇文章给大家介绍Java项目中和实现自动生成一个构造方法,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java中自动生成构造方法详解每个类在没有声明构造方法的前提下,会自动生成一个不带参数的构造方法,如果类一但声明有...
    99+
    2023-05-31
    java 自动生成 构造方法
  • C#怎么实现分组构造
    这篇文章主要介绍了C#怎么实现分组构造的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#怎么实现分组构造文章都会有所收获,下面我们一起来看看吧。实例using System;using Sy...
    99+
    2023-06-17
  • C#构造函数怎么实现
    本篇内容介绍了“C#构造函数怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!选择C#构造函数基类对象总是在任何派生类之前构造的。因此基...
    99+
    2023-06-17
  • C#中怎么实现复制构造函数
    C#中怎么实现复制构造函数,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。C#复制构造函数的一点认识:某些编程语言的类提供了复制构造函数,即从当前类实例构造一个新的类实例。在...
    99+
    2023-06-18
  • jQuery中怎么实现一个浮动留言板插件
    jQuery中怎么实现一个浮动留言板插件,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。版本信息:Version: 1.0&nb...
    99+
    2024-04-02
  • JavaScript中怎么实现一个队列数据结构
    这篇文章将为大家详细讲解有关JavaScript中怎么实现一个队列数据结构,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.队列数据结构如果你喜欢旅行(像我...
    99+
    2024-04-02
  • 什么是java构造器?怎么使用构造器?
    1、怎么使用构造方法通过一个类创建一个对象,这个过程叫做实例化。实例化就是通过调用构造方法(又叫做构造器)实现的。1.1、什么是构造方法方法名和类名一样(包括大小写)没有返回类型实例化一个对象的时候,必然调用构造方法public class...
    99+
    2016-02-13
    java教程 构造器
  • 怎么使用openSSL构造一个支持https的nodejs服务器
    本篇内容主要讲解“怎么使用openSSL构造一个支持https的nodejs服务器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用openSSL构造一个支...
    99+
    2024-04-02
  • Python中怎么实现一个个税计算器
    Python中怎么实现一个个税计算器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。计税方法科普个税方法这里需要知道的知识点:个税起征点调到 5000;累积预扣法:本期应预扣...
    99+
    2023-06-16
  • JavaScript中怎么实现一个计时器
    这期内容当中小编将会给大家带来有关JavaScript中怎么实现一个计时器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。window.setInterval(); 这个方...
    99+
    2024-04-02
  • Python中怎么实现一个感知器
    这篇文章将为大家详细讲解有关Python中怎么实现一个感知器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。什么是感知器生物神经元示意图感知器的概念类似于大脑基本处理单元神经元的工作原理。神经...
    99+
    2023-06-15
  • JavaWeb中怎么实现一个监听器
    JavaWeb中怎么实现一个监听器,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1. 监听器实现一个监听器的接口;(有n种监听器)1.1 编写一个监听器(实现监听器接口)Onl...
    99+
    2023-06-20
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作