首页 文章 精选 留言 我的

精选列表

搜索[jquery],共1568篇文章
优秀的个人博客,低调大师

【JavaScript框架封装】实现一个类似于JQuery的选择框架的封装

版权声明:本文为博主原创文章,未经博主允许不得转载。更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/details/81123799 // 选择框架 (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法) xframe.extend({}); // 不需要参与链式访问的 xframe.extend(xframe, { /** * ID选择器 * @param context * @return {HTMLElement | *} */ $id: function (context) { // context是一个DOM对象还是字符串 context = this.isString(context) ? document.getElementById(context) : context; return context; }, /** * tag选择器, context;里面存储了上下文信息(尽量少的使用局部变量) * @param tag * @param context * @return {NodeListOf<HTMLElementTagNameMap[keyof HTMLElementTagNameMap]>} */ $tag: function (tag, context) { // 分为两种情况 if (typeof context === 'string') { context = this.$id(context); } // 按照这种思路,只有可能是一种情况 if (context) { if (context.length) { // 这里默认只会返回数组中的第0个元素 return [].slice.call(context)[0].getElementsByTagName(tag); } else { return context.getElementsByTagName(tag); } } return document.getElementsByTagName(tag); }, /** * 实现一个类选择器 * @param className * @param context * @return {*} */ $class: function (className, context) { // context里面此时存储的是一个DOM节点元素 // 如果直接传过来的是一个DOM元素节点context(DOM元素的话就单独处理) context = this.$id(context) || document; // 1.由于getElementByClassName()这个方法是不兼容的,因此需要使用浏览器内置的方法去获取类选择器 // 2. 可以使用getElementByTagName()的方法去获取所有的标签元素,然后把再使用className的属性间接去实现一个类似的class选择器的功能 if (context.getElementsByClassName) { // 如果支持这个方法的话 return context.getElementsByClassName(className); } else { // 不支持的话就间接获取 var doms = context.getElementsByTagName('*'), res = []; // 使用自己定义的方法去实现一个类选择器 doms.each(function () { if (this.className === className) { // 只要是找到了这个class的集合,就放入到一个数组里面 res.push(this); } }); return res; } }, /** * 使用管道思想实现一个层次选择器 * @return {Array} */ $cengci: function () { var self = this; // 主要功能:实现一个层次选择器 // 输入字符串: str = '#className div a p' 选择所有的className 下面的P标签 // 1. 获取穿过来的参数(数组元素去重) var args = Array.prototype.slice.call(arguments)[0].toString().split(' '), index, first, item, selector, res = [], // 存储了本次的结果信息 context = []; // 存储了上一次的上下文信息【管道思想!】, context = 'tag .class #id' // 思考: 为了实现一个层次选择器, 如何实现一个吧上一次选择的元素全部存储起来??? // 2. 开始解析参数信息 args.each(function () { // 每次重复之前,先把本次需要存储的数组清空(res里面存储了每次的最新数据) res = []; // 对获取到的每一项进行处理 item = this.trim(); first = item.charAt(0); index = item.indexOf(first); selector = item.slice(index + 1); // 使用管道思想实现一个层次选择器!!! switch (first) { case '.': // class 选择器 if (context.length) { // 说明这一次的class类选择器中的元素不是第一次出现 context.each(function () { pushArray(self.$class(selector, this)); }); } else { // 如果是第一次出现的话 pushArray(self.$class(selector)); } // 把上一次执行的结果存起来 context = res; break; case '#': // ID选择器 // 由于ID选择器获取的元素始终是唯一的,因此直接放进去即可 res.push(self.$id(selector)); // 把上一次执行的结果存起来 context = res; break; default: // tag选择器 if (context.length) { // 说明不是第一次出现 context.each(function () { // 注意在使用tag选择器的时候,第二个参数必须是一个ID选择器,或者是一个 // 1. 注意在放入数组的时候,需要逐个遍历然后放进去 pushArray(self.$tag(item, this)); }); } else { // 第一次出现的 pushArray(self.$tag(item)); } // 把上一次执行的结果存起来 context = res; break; } }); /** * 把公共的部分代码封装起来 * @param doms */ function pushArray(doms) { if (doms) { [].slice.call(doms).each(function () { res.push(this); }); } } return context; }, /** * group选择器 * @return {Array} */ $group: function () { var self = this; // '.moshou,#moshou,span,.dream' // 1. 获取传过来的参数 var args = [].slice.call(arguments), arr = args[0].split(',').unique(), // 这里在拿到这个分割后的字符串后,开始进行数组元素去重 item, index, first, selector; res = []; // 2. 开始遍历参数集合,解析参数信息 arr.each(function () { // 3. 开始遍历得到结果,获取每一项 item = this.trim(); // 4. 开始获取首字母信息,和后面的选择器信息 // 4. 获取指定下标位置对应的字符 first = item.charAt(0); index = item.indexOf(first); selector = item.slice(index + 1); // 开始根据第一个字母向下进行判断,把满足相应条件的放在数组里面 switch (first) { case '.': // class选择器 res.push(self.$class(selector)); break; case '#': // ID 选择器 res.push(self.$id(selector)); break; default: // TAG选择器(直接就是first本身,这里不用再判断了使用selector这个变量了) res.push(self.$tag(item)); break; } }); return res; }, /** * 多组+层次选择器 * @return {Array} */ $select: function () { // str = '#tag , .calss' var args = [].slice.call(arguments)[0].toString().split(','), ret = [], self = this; // 遍历args数组,对数组的每一项采用层次选择器 args.each(function () { // 1. 对于逗号分隔的部分采用层次选择,获取层次选择器的结果信息, 是一个数组集合 var res = self.$cengci(this); // 2. 遍历层次选择器的集合,把信息放入到一个新的数组里面, 就是得到的多组选择器的结果信息 pushArray(res); }); // 层次选择器 function pushArray(doms) { if (doms.length) { doms.each(function () { ret.push(this); }); } } return ret; } }); })(xframe);

优秀的个人博客,低调大师

【JavaScript框架封装】实现一个类似于JQuery的事件框架的封装

版权声明:本文为博主原创文章,未经博主允许不得转载。更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/details/81123753 // 事件框架 (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法) xframe.extend({ /** * 实现一个浏览器的基本事件的绑定 * @param type * @param fn * @return {on} */ on: function (type, fn) { // 注意这里的初始的下标编号是长度减一 var i = this.length - 1; // 可以实现兼容版本的IE浏览器和W3c浏览器的支持 if (document.addEventListener) { // w3c(这里使用的方式是从后向前遍历, 使得每一个DOM加载完毕之后再去添加事件) for (; i >= 0; i--) { this[i].addEventListener(type, fn, false); } } else if (document.attachEvent) { // IE for (; i >= 0; i--) { this[i].attachEvent('on' + type, fn); } } else { // 其他的浏览器 for (; i >= 0; i--) { // 获取json数据的两种方式,绑定事件的方式也可以 this[i]['on' + type] = fn; } } return this; }, /** * 实现事件的解除绑定 * @param type * @param fn * @return {un} */ un: function (type, fn) { // 注意这里的初始下标编号 var i = this.length - 1; if (document.removeEventListener) { // W3c for (; i >= 0; i--) { this[i].removeEventListener(type, fn, false); } } else if (document.detachEvent) { // IE浏览器 for (; i >= 0; i--) { this[i].detachEvent(type, fn); } } else { // 其他浏览器的话,就直接默认绑定的所有事件置为null for (; i >= 0; i--) { // 移出所有绑定的事件 this[i]['on' + type] = null; } } return this; }, /** * 实现单个元素的事件绑定 * @param fn * @return {click} */ click: function (fn) { this.on('click', fn); return this; }, /** * 实现鼠标移动进来和出去的事件响应(鼠标悬浮事件) * @param fnOver * @param fnOut * @return {hover} */ hover: function (fnOver, fnOut) { var i = this.length; // 还是采用的是从后向前遍历的方式 for (; i >= 0; i--) { if (fnOver && typeof fnOver === 'function') { this.on('mouseover', fnOver); } if (fnOut && typeof fnOut === 'function') { this.on('mouseout', fnOut); } } return this; }, /** * 如果被选元素可见,则隐藏这些元素,如果被选元素隐藏,则显示这些元素。 * toggle方法,切换,接收任意个参数,不断在参数间循环.例:点击显示隐藏 * @return {toggle} */ toggle: function () { // 实现一个事件的切换f1, f2 var self = this, _arguments = arguments, i = 0, len = this.length; // 把所有的事件响应函数存起来 for (; i < len; i++) { addToToggle(this[i]); } /** * 鼠标点击之后逐个调用自己绑定的事件 * @param obj */ function addToToggle(obj) { // 定义一个私有的计数器 var count = 0; // 添加事件 self.on('click', function () { // 使用call去修改this的指向(这里的主要作用是去切换,轮巡切换状态) _arguments[count++ % _arguments.length].call(obj); }); } return this; } }); // 不需要参与链式访问的 xframe.extend(xframe, { /** * 获取事件对象 * @param event * @return {Event} */ getEvent: function (event) { return event ? event : window.event; }, /** * 获取触发事件的元素 * @param event * @return {*|Element|Object} */ getTarget: function (event) { var event = this.getEvent(event); return event.target || event.srcElement; }, /** * 阻止事件冒泡 * @param event */ stopPropagation: function (event) { var event = this.getEvent(event); if (event.stopPropagation) { // W3c event.stopPropagation(); } else { // IE event.cancelBubble = true; } }, /** * 阻止默认的行为 * @param event */ preventDefault: function (event) { var event = this.getEvent(event); if (event.preventDefault) { // w3c event.preventDefault(); } else { // IE event.returnValue = false; } }, /** * 获取鼠标滚轮的运动的详细信息 * @param event * @return {*} */ getDelta: function (event) { var event = this.getEvent(event); if (event.wheelDelta) { // w3c return event.wheelDelta; } else { // ie // Firefox的值有所不同,因此首先要将这个值的符号反向,然后再乘以40,就可以保证与其它浏览器的值相同了 return -event.detail * 40; } } }); })(xframe);

优秀的个人博客,低调大师

【JavaScript框架封装】实现一个类似于JQuery的属性框架的封装

版权声明:本文为博主原创文章,未经博主允许不得转载。更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/details/81123810 // 属性框架 (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法) xframe.extend({ /** * 获取/设置某一个元素的属性信息 * @return {*} */ attr: function () { // 获取属性信息:两种格式,1. 取值模式 2.设置模式 var args = arguments; if (args.length === 0) { // 没有参数的话,就直接返回本身 return this; } else if (args.length === 1) { // 一个参数的话需要进行判断 if (typeof args[0] === 'string') { // 取值模式 return this[0].getAttribute(args[0]); } else if (typeof args[0] === 'object') { // json对象的话也算是一个设置模式 for (var item in args[0]) { Array.prototype.slice.call(this).each(function () { this.setAttribute(item, args[0][item]); }); } } } else if (args.length === 2) { Array.prototype.slice.call(this).each(function () { this.setAttribute(args[0], args[1]); }); } // 注意这里的this实际上返回的是一个xframe实例对象,但是xframe.eatend(xframe, {})这里的this实际上是一个xframe(selector, context)函数, 还没有实例化呢 return this; }, /** * 判断DOM元素节点是不是拥有某一个属性 * @param val * @return {boolean} */ hasClass: function (val) { if (!this[0]) { return false; } // 默认只会获取第一个元素的相关信息 return this[0].className === val.trim() ? true : false; }, /** * 添加一个class class='xiugang 18 nan' * @param val */ addClass: function (val) { // 处理传进来的字符串两边的空格 val = val.trim(); [].slice.call(this).each(function () { // 只要原来的DOM节点上面没有这个属性的话,就直接添加上去 if (val !== this.className) { this.className += ' ' + val; } }) return this; }, /** * 注意熟练掌握replace()函数的使用 * @param val */ removeClass: function (val) { val = val.trim(); [].slice.call(this).each(function () { if (val === this.className) { // 使用后面替换前面的 this.className = this.className.replace(val, ''); } }) return this; }, /** * 如果有的话就直接删除,没有的话就添加一个 * @param val * @return {toggleClass} */ toggleClass: function (val) { val = val.trim(); [].slice.call(this).each(function () { if (val === this.className) { // 如果有的话就直接删除 this.className.replace(val, ''); } else { // 没有的话就添加一个 this.className += ' ' + val; } }); return this; } }); // 不需要参与链式访问的 xframe.extend(xframe, {}); })(xframe);

优秀的个人博客,低调大师

【JavaScript框架封装】实现一个类似于JQuery的内容框架的封装

版权声明:本文为博主原创文章,未经博主允许不得转载。更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/details/81123820 // 内容框架 (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法) xframe.extend({ /** * .html()用为读取和修改元素的HTML标签 对应js中的innerHTML * @return {html} */ html: function () { var arg = arguments, len = arg.length, arr = Array.prototype.slice.call(this); if (this.length < 1) { return this; } // 分为取值模式和设置模式 if (len === 0) { // 取值模式 return this[0].innerHTML; } else if (len === 1) { // 设置模式 arr.each(function () { this.innerHTML = arg[0]; }); } return this; }, /** * 用于获取文本信息 * @return {*} */ text: function () { var args = arguments, len = args.length; if (this.length === 0) { return this; } if (len === 0) { // 取值模式 return this[0].innerText; } else if (len === 1) { // 设置模式 this.each(function () { this.innerText = args[0]; }); } return this; }, /** * 用于获取表单中的数值(input, form) * @return {*} */ val: function () { // val();设置或者获取表单字段的值(前提是表单设置了value属性); var args = arguments, len = args.length; if (this.length === 0) { return this; } if (len === 0) { return this[0].value; } else if (len === 1) { this.each(function () { this.value = args[0]; }); } return this; } }); // 不需要参与链式访问的 xframe.extend(xframe, {}); })(xframe);

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册