1. // DOM框架(选择器框架)
  2. (function (xframe) {
  3. // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法)
  4. xframe.extend({
  5. /**
  6. * 向现有的元素集合中添加元素节点(修改this的内容)
  7. * @param dom
  8. * @return {add}
  9. */
  10. add: function (dom) {
  11. // 1. 项伪数组中添加元素
  12. this[this.length] = dom;
  13. // 2. 数组的长度也需要改变了
  14. this.length++;
  15. return this;
  16. },
  17. /**
  18. * 向现有的元素节点中添加dom节点(对使用选择器获取的一系列元素都添加孩子节点child)
  19. * @param child,这里创建的实际上是一个JQuery对象
  20. */
  21. append: function (child) {
  22. // 这里获取的实际上就是只有一个的
  23. var doms = typeof child === 'string' ? $(child) : $(child[0]),
  24. arr = Array.prototype.slice.call(doms);
  25. //console.log(typeof doms[0], typeof arr[0]);
  26. // 2. 调用自己的方法将一个伪数组转换为数组,并开始遍历
  27. /*for (var i = 0; i < this.length; i++){
  28. for (var j = 0; j < doms.length; j++){
  29. // 注意这里的操作, 由于在每次添加一个新的元素之后, this的长度就会增加,因此这里在修改之前先把this.length修改一下
  30. this[i].appendChild(doms[j]);
  31. }
  32. }*/
  33. /*this.each(function (element) {
  34. arr.forEach(function (childNode) {
  35. element.appendChild(childNode);
  36. });
  37. });*/
  38. // 这里的处理目的是,如果穿过来的DOM节点只是有一个的话需要创建和this长度相同的DOM元素
  39. if (arr.length !== this.length) {
  40. arr = [];
  41. // 相当于是把本身复制几份
  42. Array.prototype.slice.call(this).each(function () {
  43. arr.push(doms[0]);
  44. });
  45. }
  46. // 开始向父亲节点添加元素
  47. Array.prototype.slice.call(this).forEach(function (element, index) {
  48. element.appendChild(arr[index]);
  49. });
  50. // 开始向我获取的this节点里面添加数据
  51. /*for (var i = 0; i < this.length; i++){
  52. for (var j = 0; j < arr.length; j++){
  53. if (this[i].childNodes){
  54. continue;
  55. }
  56. // 注意这里的操作, 由于在每次添加一个新的元素之后, this的长度就会增加,因此这里在修改之前先把this.length修改一下
  57. this[i].appendChild(arr[j]);
  58. }
  59. }*/
  60. },
  61. /**
  62. * 把选择器中的节点添加到父容器中
  63. * @param parent
  64. */
  65. appendTo: function (parent) {
  66. // 1. 获取所有的父容器
  67. var doms = $(parent),
  68. self = this;
  69. // 2. 向父容器中添加孩子节点
  70. Array.prototype.slice.call(this).forEach(function (element, index) {
  71. doms[index].appendChild(self[index]);
  72. });
  73. return this;
  74. },
  75. /**
  76. * 获取指定下表下面的DOM节点
  77. * @param num
  78. * @return {null}
  79. */
  80. get: function (num) {
  81. return this[num] ? this[num] : null;
  82. },
  83. /**
  84. * 获取一个类似于JQuery的对象实例
  85. * @param num
  86. * @return {jQuery|HTMLElement}
  87. */
  88. eq: function (num) {
  89. // 1. 获取一个JQuery对象,首先先获取这个DOM元素节点
  90. var dom = this.get(num);
  91. // 2. 把这个DOM节点转换为一个JQuery对象
  92. return $(dom);
  93. },
  94. /**
  95. * 获取第一个JQuery对象
  96. * @return {*|jQuery|HTMLElement}
  97. */
  98. first: function () {
  99. return this.eq(0);
  100. },
  101. /**
  102. * 获取最后一个JQuery对象
  103. * @return {*|jQuery|HTMLElement}
  104. */
  105. last: function () {
  106. return this.eq(this.length - 1);
  107. },
  108. /**
  109. * 获取一个DOM节点的所有子节点
  110. * @return {array}
  111. */
  112. children: function () {
  113. // 获取一个元素的所有的孩子节点
  114. // 1. 定义一个伪数组, 用于存储所有的孩子节点, 然后获取默认的第一个元素的所有孩子节点
  115. var children = this[0].children,
  116. len = children.length,
  117. that = {},
  118. i = 0;
  119. // 初始化定义的这个伪数组
  120. that.length = len;
  121. for (; i < len; i++) {
  122. that[i] = children[i];
  123. }
  124. return that;
  125. },
  126. /**
  127. * 从当前DOM元素节点向下寻找一层元素节点
  128. * @param str
  129. * @return {}
  130. */
  131. find: function (str) {
  132. var res = [],
  133. self = this,
  134. doms;
  135. this.each(function () {
  136. switch (str.charAt(0)) {
  137. case '.':
  138. // 类选择器
  139. doms = $.$class(str.substring(1), self[i]);
  140. pushArray(doms);
  141. break;
  142. default:
  143. // 标点选择器
  144. doms = $.$tag(str, self[i]);
  145. pushArray(doms);
  146. break;
  147. }
  148. });
  149. function pushArray(doms) {
  150. if (doms.length) {
  151. self.toArray(doms, function () {
  152. res.push(this);
  153. });
  154. }
  155. }
  156. // 【注意:】为了能够返回一个JQuery对象,这里需要再次进行处理
  157. var that = this;
  158. that.length = this.length;
  159. this.each(function (index) {
  160. // 这里需要再次构造一个伪数组对象,从而实现链式访问的功能
  161. that[index] = res[index];
  162. });
  163. // 这里在修改that的时候实际上会间接地把this这个变量修改了
  164. return that;
  165. },
  166. /**
  167. * 获取一个元素的父类节点
  168. * @return {parent}
  169. */
  170. parent: function () {
  171. // 获取父节点,并且返回一个JQuery对象
  172. var parent = this[0].parentNode;
  173. this[0] = parent;
  174. this.length = 1;
  175. // 由于每一个元素只会有一个父类节点,因此长度为1
  176. return this;
  177. },
  178. /**
  179. * 获取一个元素在同一个级别的元素里面的下表编号
  180. * @return {number}
  181. */
  182. index: function () {
  183. // 获取元素本身在同一个级别下面的元素下表编号
  184. var srcNode = this[0],
  185. children = srcNode.parentNode.children,
  186. self = this,
  187. defaultRes = -1;
  188. self.toArray(children, function (index) {
  189. // 这里的this指向的就是每一个元素, index指向的就是元素的下表编号
  190. if (children[index] === srcNode) {
  191. defaultRes = index;
  192. }
  193. });
  194. // 返回查询到的结果下标
  195. return defaultRes;
  196. }
  197. });
  198. // 不需要参与链式访问的
  199. xframe.extend(xframe, {
  200. /**
  201. * 创建一个DOM元素节点
  202. * @param type
  203. * @param value
  204. * @param html
  205. * @return {*}
  206. */
  207. create: function (type, value, html) {
  208. var dom = document.createElement(type);
  209. return xframe().add(dom).attr(value).html(html);
  210. },
  211. /**
  212. * 直接的孩子节点
  213. * @param dom
  214. * @param tag
  215. * @return {jQuery|HTMLElement}
  216. */
  217. directChildren: function (dom, tag) {
  218. var res = [],
  219. tag = tag;
  220. if (typeof dom === 'string') {
  221. dom = $(dom);
  222. }
  223. // 如果是一个元素集合的处理方法
  224. if (dom.length) {
  225. Array.prototype.slice.call(dom).each(function () {
  226. getDOM(this.children);
  227. });
  228. } else {
  229. // 如果只是一个元素的处理方法
  230. getDOM(dom.children);
  231. }
  232. /**
  233. * 主要用于把满足已知条件的DOM元素集合统一放入到一个新的res数组里面去
  234. * @param doms
  235. */
  236. function getDOM(doms) {
  237. Array.prototype.slice.call(doms).each(function () {
  238. if (this.tagName.toLowerCase() === tag.toLowerCase()) {
  239. res.push(this);
  240. }
  241. });
  242. }
  243. // 如果获得了这个直接子节点,就直接返回这个对象
  244. return $(res);
  245. },
  246. });
  247. })(xframe);

【JavaScript框架封装】实现一个类似于JQuery的DOM框架的封装的更多相关文章

  1. 【JavaScript框架封装】实现一个类似于JQuery的基础框架、事件框架、CSS框架、属性框架、内容框架、动画框架整体架构的搭建

    /* * @Author: 我爱科技论坛 * @Time: 20180715 * @Desc: 实现一个类似于JQuery功能的框架 * V 1.0: 实现了基础框架.事件框架.CSS框架.属性框架. ...

  2. 分析一个类似于jquery的小框架

    在网上下了一个类似于jQuery的小框架,分析源码,看看怎么写框架. 选择器Select //用沙箱闭包其整个代码,只有itcast和I暴漏在全局作用域 (function( window , und ...

  3. 【JavaScript框架封装】实现一个类似于JQuery的缓存框架的封装

    // 缓存框架 (function (xframe) { /** * 实现了缓存框架的临时存储功能(内存存储) * @type {{data: Array, get: (function(*): *) ...

  4. 【JavaScript框架封装】实现一个类似于JQuery的动画框架的封装

    // 动画框架 (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法) xframe.extend({}); // 不需要参与链式访问的 ...

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

    // 选择框架 (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法) xframe.extend({}); // 不需要参与链式访问的 ...

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

    // 属性框架 (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法) xframe.extend({ /** * 获取/设置某一个元素 ...

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

    // 事件框架 (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法) xframe.extend({ /** * 实现一个浏览器的基本 ...

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

    // 内容框架 (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法) xframe.extend({ /** * .html()用为读 ...

  9. 分析一个类似于jquery的小框架 (2)

    核心构造函数 (function ( window, undefined ) { // 定义Itcast构造函数 function Itcast ( selector ) { return new I ...

随机推荐

  1. Optimization on content service with local search in cloud of clouds

    曾老师的这篇文章发表于Journal of Network and Computer Applications,主要解决的是利用启发式算法决定如何在cloud of clouds中进行副本分发,满足用 ...

  2. Spring Boot项目@RestController使用重定向redirect

    Spring MVC项目中页面重定向一般使用return "redirect:/other/controller/";即可.而Spring Boot使用了@RestControll ...

  3. nginx 、tomcat 集群配置、shiro Session 共享

    一.nginx.config 配置 #user nobody; worker_processes ; #error_log logs/error.log; #error_log logs/error. ...

  4. Thread和ThreadGroup

    Thread和ThreadGroup 学习了:https://www.cnblogs.com/yiwangzhibujian/p/6212104.html  这个里面有Thread的基本内容: htt ...

  5. hadoop-2.6.0集群开发环境配置

    hadoop-2.6.0集群开发环境配置 一.环境说明 1.1安装环境说明 本例中,操作系统为CentOS 6.6, JDK版本号为JDK 1.7,Hadoop版本号为Apache Hadoop 2. ...

  6. ROS探索总结(十九)——怎样配置机器人的导航功能

    1.概述 ROS的二维导航功能包.简单来说.就是依据输入的里程计等传感器的信息流和机器人的全局位置,通过导航算法,计算得出安全可靠的机器人速度控制指令. 可是,怎样在特定的机器人上实现导航功能包的功能 ...

  7. H3C子接口配置要点及实例说明

     类型一:以太网子接口配置要点(单臂路由)  第一步:在路由器对端的交换机上配置好vlan信息(如vlan10/vlan20)  第二步:将交换机上与路由器直接相连的以太口配置成trunk口并同意 ...

  8. c17---指针

    // // main.c // 指针基本概念 #include <stdio.h> // 基本数据类型作为函数的参数是值传递, 在函数中修改形参的值不会影响到外面实参的值 void cha ...

  9. 排序系列 之 希尔排序算法 —— Java实现

    基本思想: 希尔排序的实质就是分组插入排序,又称缩小增量法. 将整个无序序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本 ...

  10. String不可变性

    今天分析一下String,String有很多实用的特性,比如说“不可变性”,是工程师精心设计的艺术品.用final就是拒绝继承,防止内部属性或方法被破坏. 一,什么是不可变? String不可变很简单 ...