JS|jQuery 源码分析 选择器

声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢!

打开jQuery源码,一眼看去到处都充斥着正则表达式,jQuery框架的基础就是查询了,查询文档元素对象,所以狭隘的说呢,jQuery就是一个选择器,并这个基础上构建和运行查询过滤器!

工欲善其事,必先利其器,所以先从正则入手
我们来分解一个表达式
// A simple way to check for HTML strings // Prioritize #id over to avoid XSS via location.hash (#9521) // Strict HTML recognition (#11290: must start with <) rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,

作者的解释呢很简单,一个简单的检测HTML字符串的表达式
分解:
  1. 通过选择|分割二义,匹配^开头或者$结尾
^(?:\s*(<[\w\W]+>)[^>]* #([\w-]*))$2. ^(?:\s*(<[\w\W]+>)[^>]*

(?:pattern) : 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用 \s* : 匹配任何空白字符,包括空格、制表符、换页符等等 零次或多次 等价于{0,} (pattern) : 匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,使用 $0…$9 属性 [\w\W]+ : 匹配于'[A-Za-z0-9_]'或[^A-Za-z0-9_]' 一次或多次, 等价{1,} (<[wW]+>) :这个表示字符串里要包含用<>包含的字符,例如,等等都是符合要求的 [^>]* : 负值字符集合,字符串尾部是除了>的任意字符或者没有字符,零次或多次等价于{0,},

  1. ([\w-]*))$ 匹配结尾带上#号的任意字符,包括下划线与-
  2. 还要穿插一下exec方法
    如果执行exec方法的正则表达式没有分组(没有括号括起来的内容),那么如果有匹配,他将返回一个只有一个元素的数组,这个数组唯一的元素就是该正则表达式匹配的第一个串; 如果没有匹配则返回null。
    exec如果找到了匹配,而且包含分组的话,返回的数组将包含多个元素,第一个元素是找到的匹配,之后的元素依次为该匹配中的第一、第二…个分组(反向引用)
所以综合起来呢大概的意思就是:匹配HTML标记和ID表达式(<前面可以匹配任何空白字符,包括空格、制表符、换页符等等)
简单测试下:
var str = ' '; var match = rquickExpr.exec(str); console.log(match) //[" ", "", undefined, index: 0, input: " "]var str = '[?\f\n\r\t\v]'; var str = '#test'; var match = rquickExpr.exec(str); console.log(match) //["#test", undefined, "test", index: 0, input: "#test"]

jQuery选择器接口
API
image
jQuery是总入口,选择器支持9种方式的处理
1.$(document) 2.$(‘’) 3.$(‘div’) 4.$(‘#test’) 5.$(function(){}) 6.$("input:radio", document.forms[0]); 7.$(‘input’, $(‘div’)) 8.$() 9.$("", { "class": "test", text: "Click me!", click: function(){ $(this).toggleClass("test"); } }).appendTo("body"); 10$($(‘.test’))

jQuery这个选择器重构了几次后,现在逻辑结构相当的清晰了,一看大概就知道
不能不得说jQuery的反模式,非职责单一深受开发者喜欢,一个接口承载的职责越多内部处理就越复杂了
jQuery查询的的对象是dom元素,查询到目标元素后,如何存储?
查询的到结果储存到jQuery对象内部,由于查询的dom可能是单一元素,也可能是合集 jQuery内部应该要定义一个合集数组,用于存在选择后的dom元素, 当然啦,根据API,jQuery构建的不仅仅只是DOM元素,还有HTML字符串,Object,[] 等等…

本质上讲jQuery.fn.init构建的出来的对象,就是jQuery对象
init: function( selector, context, rootjQuery ) { var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false) if ( !selector ) { return this; }// Handle HTML strings if ( typeof selector === "string" ) { // HANDLE: $(DOMElement) } else if ( selector.nodeType ) { // HANDLE: $(function) // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) { return rootjQuery.ready( selector ); }if ( selector.selector !== undefined ) { this.selector = selector.selector; this.context = selector.context; }return jQuery.makeArray( selector, this ); },

源码缩进后的结构:
处理"",null,undefined,false,返回this ,增加程序的健壮性 处理字符串 处理DOMElement,返回修改过后的this,给this添加了 处理$(function(){})

匹配模式一:$(“#id”)
  1. 进入字符串处理
if ( typeof selector === "string" ) {

  1. 发现不是 “<”开始,”>”结尾 $(‘
    My new text
    ‘)这种的情况 如果selector是html标签组成的话,直接match = [ null, selector, null ];
    而不用正则检查
if (selector.charAt(0) === "<" && selector.charAt(selector.length - 1) === ">" && selector.length >= 3) {

  1. 否则的话需要match = rquickExpr.exec( selector )
match = rquickExpr.exec( selector );

  1. 匹配的html或确保没有上下文指定为# id
if ( match && (match[1] || !context) ) {

  1. match[1]存在,处理(html)?>(array),,也就是处理的是html方式
if ( match[1] ) {

  1. 处理ID
elem = document.getElementById( match[2] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Inject the element directly into the jQuery object this.length = 1; this[0] = elem; }this.context = document; this.selector = selector; return this;

至此本次检索完毕!
可以看到
this就是jQuery工厂化后返回的对象
this.length this[0] = elem this.context = document; this.selector = selector;

image
匹配模式二:
重复的地方跳过直接看处理接口
if ( match && (match[1] || !context) ) { // HANDLE: $(html) -> $(array) if ( match[1] ) { context = context instanceof jQuery ? context[0] : context; // scripts is true for back-compat jQuery.merge( this, jQuery.parseHTML( match[1], context && context.nodeType ? context.ownerDocument || context : document, true ) ); // HANDLE: $(html, props) if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { for ( match in context ) { // Properties of context are called as methods if possible if ( jQuery.isFunction( this[ match ] ) ) { this[ match ]( context[ match ] ); // ...and otherwise set as attributes } else { this.attr( match, context[ match ] ); } } } return this; // HANDLE: $(#id) } else {

传入上下文:
context && context.nodeType ? context.ownerDocument || context : document
ownerDocument和 documentElement的区别
ownerDocument是Node对象的一个属性,返回的是某个元素的根节点文档对象:即document对象 documentElement是Document对象的属性,返回的是文档根节点 对于HTML文档来说,documentElement是标签对应的Element对象,ownerDocument是document对象

具体请看API手册
jQuery.merge( first, second ) 合并两个数组内容到第一个数组。
jQuery.parseHTML
使用原生的DOM元素的创建函数将字符串转换为一组DOM元素,然后,可以插入到文档中。
str = "hello, my name is jQuery.", html = $.parseHTML( str ),

image
源码:
parseHTML: function( data, context, keepScripts ) { if ( !data || typeof data !== "string" ) { return null; } if ( typeof context === "boolean" ) { keepScripts = context; context = false; } context = context || document; var parsed = rsingleTag.exec( data ), scripts = !keepScripts && []; // Single tag if ( parsed ) { return [ context.createElement( parsed[1] ) ]; } parsed = jQuery.buildFragment( [ data ], context, scripts ); if ( scripts ) { jQuery( scripts ).remove(); } return jQuery.merge( [], parsed.childNodes ); },

匹配一个独立的标签
rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
^<(\w+)\s*\/?>: 以<开头,至少跟着一个字符和任意个空白字符,之后出现0或1次/> (?:<\/\1>|)$: 可以匹配<、一个/或者空白并以之为结尾这样如果没有任何属性和子节点的字符串(比如''或者''这样)会通过正则的匹配,当通过正则的匹配后则会通过传入的上下文直接创建一个节点:

只是单一的标签:
if ( parsed ) { return [ context.createElement( parsed[1] ) ]; }

而未通过节点的字符串,则通过创建一个div节点,将字符串置入div的innerHTML:
parsed = jQuery.buildFragment( [ data ], context, scripts );

它会把传入的复杂的html转为文档碎片并且存储在jQuery.fragments这个对象里。这里要提一下,document.createDocumentFragment()是相当好用的,可以减少对dom的操作.
创建一个文档碎片DocumentFragment
如果要插入多个DOM元素,可以先将这些DOM元素插入一个文档碎片,然后将文档碎片插入文档中,这时插入的不是文档碎片,而是它的子孙节点;相比于挨个插入DOM元素,使用文档碎片可以获得2-3倍的性能提升; 如果将重复的HTML代码转换为DOM元素,可以将转换后的DOM元素缓存起来,下次(实际是第3次)转换同样的HTML代码时,可以直接缓存的DOM元素克隆返

当一个HTML比一个没有属性的简单标签复杂的时候,实际上,创建元素的处理是利用了浏览器的innerHTML 机制。
1 tmp = tmp || fragment.appendChild( context.createElement("div") ); 2 3 // Deserialize a standard representation 4 tag = ( rtagName.exec( elem ) || ["", ""] )[ 1 ].toLowerCase(); 5 wrap = wrapMap[ tag ] || wrapMap._default; 6 tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[ 2 ];

特别说明,jQuery创建一个新的元素,并且设置innerHTML属性为传入的HTML代码片段。当参数是一个单标签,就像 $('JS|jQuery 源码分析 选择器') or $(''),jQuery将使用javasrcipt原生的 createElement()函数创建这个元素。 当传入一个复杂的html,一些浏览器可能不会产生一个完全复制HTML源代码所提供的DOM。正如前面提到的,jQuery使用的浏览器.innerHTML属性来解析传递的HTML并将其插入到当前文档中。在此过程中,一些浏览器过滤掉某些元素,如, , 或 的元素。其结果是,被插入元素可能不是传入的原始的字符串。 不过,这些被过滤掉的标签有限的。有些浏览器可能不完全复制所提供的HTML源代码生成DOM。例如,Internet Explorer的版本8之前转换所有链接的href属性为绝对URL路径,和Internet Explorer第9版之前,不增加一个单独的兼容层的情况下,将无法正确处理HTML5元素。 为了确保跨平台的兼容性,代码片段必须是良好的。标签可以包含其他元素,但需要搭配的结束标记 </code></blockquote><br /> 如果第一个参数(HTML字符串)为一个空的单标签,且第二个参数context为一个非空纯对象 <br> var jqHTML = $(‘<br /> ‘, { class: ‘css-class’, data-name: ‘data-val’ }); <br /> console.log(jqHTML.attr[‘class’]); //css-class <br> console.log(jqHTML.attr[‘data-name’]); //data-val<br /> 匹配模式三:$(.className)<br /> 如果第一个参数是一个.className,jQuery对象中拥有class名为className的标签元素,并增加一个属性值为参数字符串、document的selector、context属性 <br> return jQuery(document).find(className); <br /> 匹配模式四:$(.className, context)<br /> 如果第一个参数是.className,第二个参数是一个上下文对象(可以是.className(等同于处理$(.className .className)),jQuery对象或dom节点), <br> jQuery对象包含第二个参数上下文对象中拥有class名为className的后代节点元素,并增加一个context和selector属性<br /> return jQuery(context).find(className); <br /> 匹配模式五:$(jQuery对象)<br /> 如果第一个参数是jQuery对象,上面已经分析过如果在查询dom时,参数是一个#加元素id,返回的jQuery对象会增加一个属性值为参数字符串、document的selector、context属性<br /> var jq = $(‘#container’); <br> console.log(jq.selector); // #container <br> console.log(jq.context); // document<br /> 那么当出现((‘#container’))该如何处理呢?同样的,返回的jQuery对象同情况<br /> var jq2 = ((‘#container’)); <br> console.log(jq2.selector); // #container <br> console.log(jq2.context); // document<br /> 等等………………<br /> jQuery 构造器<br /> <blockquote><code> 由此可见,从本质上来说,构建的jQuery对象,其实不仅仅只是dom,还有很多附加的元素,用数组的方式存储,当然各种组合有不一样,但是存储的方式是一样的 </code></blockquote><br /> 总的来说分2大类:<br /> <blockquote><code>单个DOM元素,如$(ID),直接把DOM元素作数组传递给this对象 多个DOM元素,集合形式,可以通过CSS选择器匹配是有的DOM元素,过滤操作,构建数据结构 </code></blockquote><br /> CSS选择器是通过jQuery.find(selector)函数完成的,通过它可以分析选择器字符串,并在DOM文档树中查找符合语法的元素集合<br /> <strong>【JS|jQuery 源码分析 选择器】</strong>选择器这章有点乱,东西太多了,不能一一陈列 , 后期在慢慢整理<br /> </p> <div class="dede_pages"><ul></ul></div> <div class="pcd_ad"> <center><div class="_ahwullr0ac"></div> <script type="text/javascript"> (window.slotbydup = window.slotbydup || []).push({ id: "u6834461", container: "_ahwullr0ac", async: true }); </script> <script type="text/javascript" src="//cpro.baidustatic.com/cpro/ui/cm.js" async="async" defer="defer" > </script></center> </div> <div class="mbd_ad"> <div style=margin-top:10px;margin-bottom:10px;> <div class="_i7aftr79jl"></div> <script type="text/javascript"> (window.slotbydup = window.slotbydup || []).push({ id: "u5950612", container: "_i7aftr79jl", async: true }); </script> <!-- ½űֻһ --> <script type="text/javascript" src="//cpro.baidustatic.com/cpro/ui/cm.js" async="async" defer="defer" > </script> </div> </div> <h3>推荐阅读</h3> <ul class="post-loop post-loop-default cols-0"> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/2034434.html" title="高铁能带打火机吗"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="高铁能带打火机吗" src="http://img.readke.com/230511/1R61a2a-0-lp.jpg"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/2034434.html"> <b>高铁能带打火机吗 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/1210688.html" title="子宫肌瘤症状 女人脸上长出它当心子宫不保"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="子宫肌瘤症状 女人脸上长出它当心子宫不保" src="/images/defaultpic.gif"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/1210688.html"> <b>子宫肌瘤症状 女人脸上长出它当心子宫不保 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/1593286.html" title="小苏打洗鞋是泡还是刷"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="小苏打洗鞋是泡还是刷" src="/images/defaultpic.gif"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/1593286.html"> <b>小苏打洗鞋是泡还是刷 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/1348237.html" title="荣耀10怎样开后盖"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="荣耀10怎样开后盖" src="http://img.readke.com/230330/022004LE-0-lp.jpg"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/1348237.html"> <b>荣耀10怎样开后盖 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/1746597.html" title="煮熟桃子可以存放多久 熟桃子如何保存时间长"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="煮熟桃子可以存放多久 熟桃子如何保存时间长" src="http://img.readke.com/230424/035953C34-0-lp.jpg"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/1746597.html"> <b>煮熟桃子可以存放多久 熟桃子如何保存时间长 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/2098395.html" title="签了三方协议没去什么后果"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="签了三方协议没去什么后果" src="http://img.readke.com/230516/011115HX-0-lp.jpg"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/2098395.html"> <b>签了三方协议没去什么后果 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/2181479.html" title="珠海口岸有几个关口 珠海口岸有几个?"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="珠海口岸有几个关口 珠海口岸有几个?" src="http://img.readke.com/230522/025SWN2-0-lp.jpg"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/2181479.html"> <b>珠海口岸有几个关口 珠海口岸有几个? </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/4141792.html" title="保定住房公积金怎么提取出来?"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="保定住房公积金怎么提取出来?" src="http://img.readke.com/240211/0101105W1-0-lp.jpg"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/4141792.html"> <b>保定住房公积金怎么提取出来? </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/1167481.html" title="马头琴是哪个民族的乐器"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="马头琴是哪个民族的乐器" src="/images/defaultpic.gif"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/1167481.html"> <b>马头琴是哪个民族的乐器 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/3170674.html" title="鲁大师卸载不了怎么处理"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="鲁大师卸载不了怎么处理" src="http://img.readke.com/230920/0236356418-0-lp.png"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/3170674.html"> <b>鲁大师卸载不了怎么处理 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/1161073.html" title="第九大陆职业包括哪些"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="第九大陆职业包括哪些" src="http://img.readke.com/230226/1T3001O7-0-lp.jpg"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/1161073.html"> <b>第九大陆职业包括哪些 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/2733105.html" title="做短视频用什么软件最好,不同类型等你来选"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="做短视频用什么软件最好,不同类型等你来选" src="http://img.readke.com/230715/0605122359-0-lp.png"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/2733105.html"> <b>做短视频用什么软件最好,不同类型等你来选 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/3932064.html" title="pdf文件"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="pdf文件" src="/images/defaultpic.gif"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/3932064.html"> <b>pdf文件 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/1755008.html" title="青汁喝多了有什么副作用"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="青汁喝多了有什么副作用" src="/images/defaultpic.gif"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/1755008.html"> <b>青汁喝多了有什么副作用 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/0Z2131H22021.html" title="用通俗易懂的故事解读疾病_一辈子你都不会得大病_不信你就看看这几个故事!"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="用通俗易懂的故事解读疾病_一辈子你都不会得大病_不信你就看看这几个故事!" src="/images/defaultpic.gif"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/0Z2131H22021.html"> <b>用通俗易懂的故事解读疾病_一辈子你都不会得大病_不信你就看看这几个故事! </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/12233N4162021.html" title="Verizon狂裁44000名老员工(中年人,愿您的能力和年龄一起增长)"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="Verizon狂裁44000名老员工(中年人,愿您的能力和年龄一起增长)" src="/images/defaultpic.gif"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/12233N4162021.html"> <b>Verizon狂裁44000名老员工(中年人,愿您的能力和年龄一起增长) </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/3000839.html" title="自动挡车换挡拨片有什么作用 换挡拨片对自动挡有用吗"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="自动挡车换挡拨片有什么作用 换挡拨片对自动挡有用吗" src="http://img.readke.com/230815/0133092521-0-lp.jpg"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/3000839.html"> <b>自动挡车换挡拨片有什么作用 换挡拨片对自动挡有用吗 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/4181865.html" title="mysql集群版需要几台服务器 mysql服务器群集"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="mysql集群版需要几台服务器 mysql服务器群集" src="/images/defaultpic.gif"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/4181865.html"> <b>mysql集群版需要几台服务器 mysql服务器群集 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/1360993.html" title="昭平银杉茶怎么样"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="昭平银杉茶怎么样" src="/images/defaultpic.gif"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/1360993.html"> <b>昭平银杉茶怎么样 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/1485352.html" title="全面战争战锤2伊姆瑞克怎么破局 全面战争战锤2伊姆瑞克破局"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="全面战争战锤2伊姆瑞克怎么破局 全面战争战锤2伊姆瑞克破局" src="http://img.readke.com/230409/220Pa1H-0-lp.jpg"> </a> </div> <div class="item-content"> <h4 class="item-title"> <a href="/c/1485352.html"> <b>全面战争战锤2伊姆瑞克怎么破局 全面战争战锤2伊姆瑞克破局 </b></a></h4> <div class="item-meta"> <div class="item-meta-right"> </div> </div> </div> </li> </ul> <p><br /><ul class="post-loop post-loop-list cols-4"><li><a href="/c/021T5K152022.html" title="如何寻找情感问答App的分析切入点" target="_blank">如何寻找情感问答App的分析切入点 </a></li> <li><a href="/c/021T5J262022.html" title="D13|D13 张贇 Banner分析" target="_blank">D13|D13 张贇 Banner分析 </a></li> <li><a href="/c/021T5IG2022.html" title="事件代理" target="_blank">事件代理 </a></li> <li><a href="/c/021T5F252022.html" title="自媒体形势分析" target="_blank">自媒体形势分析 </a></li> <li><a href="/c/021T5C062022.html" title="2020-12(完成事项)" target="_blank">2020-12(完成事项) </a></li> <li><a href="/c/021T5BO2022.html" title="Android事件传递源码分析" target="_blank">Android事件传递源码分析 </a></li> <li><a href="/c/021T5B562022.html" title="Python数据分析(一)(Matplotlib使用)" target="_blank">Python数据分析(一)(Matplotlib使用) </a></li> <li><a href="/c/021T564092022.html" title="jQuery插件" target="_blank">jQuery插件 </a></li> <li><a href="/c/021J561a2022.html" title="Quartz|Quartz 源码解析(四) —— QuartzScheduler和Listener事件监听" target="_blank">Quartz|Quartz 源码解析(四) —— QuartzScheduler和Listener事件监听 </a></li> <li><a href="/c/021J5605R022.html" title="泽宇读书会——如何阅读一本书笔记" target="_blank">泽宇读书会——如何阅读一本书笔记 </a></li> </ul></p> <div class=entry-copyright> <p></p> </div> </div> <div class="entry-footer"> <div class="prev-next sb br mb clearfix"> <p class="post-prev fl ellipsis">上一篇:<a href='/c/11253404952021.html'>EJB是基于哪些技术实现的(并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。)</a> </p> <p class="post-next fr ellipsis">下一篇:<a href='/c/11253404a2021.html'>广告学|广告学流量预算</a> </p> </div> </div> </div> </article> </main> <aside class="sidebar"> <div class="widget widget_post_thumb"> <h3 class="widget-title"><span>更多...</span></h3> <ul> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/091421022R021.html" title="不寄希望于能早起"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="不寄希望于能早起" src="/images/defaultpic.gif"> </a></div> <div class="item-content"> <p class="item-title"><a href="/c/091421022R021.html" title="不寄希望于能早起">不寄希望于能早起</a></p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/02144501112022.html" title="辛丑牛年初一(202110)"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="辛丑牛年初一(202110)" src="/images/defaultpic.gif"> </a></div> <div class="item-content"> <p class="item-title"><a href="/c/02144501112022.html" title="辛丑牛年初一(202110)">辛丑牛年初一(202110)</a></p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/0203433JH022.html" title="生命蜕变能量点断食——第23期-2021-05-07"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="生命蜕变能量点断食——第23期-2021-05-07" src="/images/defaultpic.gif"> </a></div> <div class="item-content"> <p class="item-title"><a href="/c/0203433JH022.html" title="生命蜕变能量点断食——第23期-2021-05-07">生命蜕变能量点断食——第23期-2021-05-07</a></p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/0Z314005H021.html" title="004不忘初心"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="004不忘初心" src="/images/defaultpic.gif"> </a></div> <div class="item-content"> <p class="item-title"><a href="/c/0Z314005H021.html" title="004不忘初心">004不忘初心</a></p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/0ZQK2602021.html" title="闪闪发光的少年"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="闪闪发光的少年" src="/images/defaultpic.gif"> </a></div> <div class="item-content"> <p class="item-title"><a href="/c/0ZQK2602021.html" title="闪闪发光的少年">闪闪发光的少年</a></p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/09192241B2021.html" title="汪曾祺名言"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="汪曾祺名言" src="/images/defaultpic.gif"> </a></div> <div class="item-content"> <p class="item-title"><a href="/c/09192241B2021.html" title="汪曾祺名言">汪曾祺名言</a></p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/092323FW2021.html" title="此刻曼妙"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="此刻曼妙" src="/images/defaultpic.gif"> </a></div> <div class="item-content"> <p class="item-title"><a href="/c/092323FW2021.html" title="此刻曼妙">此刻曼妙</a></p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/091H19D22021.html" title="我喜欢自己"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="我喜欢自己" src="/images/defaultpic.gif"> </a></div> <div class="item-content"> <p class="item-title"><a href="/c/091H19D22021.html" title="我喜欢自己">我喜欢自己</a></p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/09152120C2021.html" title="重归正轨"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="重归正轨" src="/images/defaultpic.gif"> </a></div> <div class="item-content"> <p class="item-title"><a href="/c/09152120C2021.html" title="重归正轨">重归正轨</a></p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/c/0Z41462222021.html" title="《将心比心换真心》『99天将帅极限挑战赛』(33)"> <img width="480" height="300" class="attachment-default size-default wp-post-image j-lazy" alt="《将心比心换真心》『99天将帅极限挑战赛』(33)" src="/images/defaultpic.gif"> </a></div> <div class="item-content"> <p class="item-title"><a href="/c/0Z41462222021.html" title="《将心比心换真心》『99天将帅极限挑战赛』(33)">《将心比心换真心》『99天将帅极限挑战赛』(33)</a></p> </div> </li> </ul> </div> </aside> </div> </div> <footer class="footer"> <div class="container"> <div class="clearfix"> <div class="footer-col footer-col-logo"> <!--<img src="/skin/images/logo-footer.png">--></div> <div class="footer-col footer-col-copy"> <ul class="footer-nav hidden-xs"> <li class="menu-item menu-item-706"><a href="/baike/">生活百科</a></li> <li class="menu-item menu-item-706"><a href="/it/">it技术</a></li> </ul> <div class="copyright"> <p>Copyright © 2017-2022 锐客网 <a href="http://beian.miit.gov.cn/" target="_blank" rel="nofollow">京ICP备11041112号-41</a> </p> </div> </div> <div class="footer-col footer-col-sns"> <div class="footer-sns"> </div> </div> </div> </div> </footer> <div class="action action-style-0 action-color-0 action-pos-1" style="bottom:15%;"> <div class="action-item gotop j-top"> <i class="web-icon wi action-item-icon"><svg aria-hidden="true"> <use xlink:href="#wi-arrow-up-2"></use> </svg></i></div> </div> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?79e4e485d34c6fc717489eaa10b314e3"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> </div> <script>var _web_js={};</script> <script src="/skin/js/index.js"></script> </body> </html>