jQuery原生框架-----------------dom操作
// 扩展DOM操作方法
jQuery.fn.extend({
// 设置或者获取元素的内容
html: function( html ) {
/*
* 实现思路:
* 1、不传参,返回第一个元素的内容
* 2、传参
* 2.1、参数类型为null,遍历所有元素,依次清除它们的内容
* 2.2、参数类型为字符串,遍历所有元素,依次重置它们的内容
* 3、链式编程返回this
* */
// 不传参,返回第一个元素的内容
if( arguments.length === 0 ) {
return this.get(0).innerHTML;
}
// 传参,进一步判断
else {
// null,清除所有
if( html === null ) {
this.each( function() {
this.innerHTML = '';
});
}
// string,重置
else if( jQuery.isString( html ) ) {
this.each( function() {
this.innerHTML = html;
});
}
}
// 链式编程
return this;
},
// 升级版本,复用porp实现innerHTML的获取与设置
_html: function( html ) {
if( arguments.length === 0 ) {
return this.prop( 'innerHTML' );
}else {
if( html === null ) {
html = '';
}
return this.prop( 'innerHTML', html );
}
},
// 升级版本,复用porp实现innerHTML的获取与设置
__html: function() {
if( arguments[0] === null ) {
arguments[0] = '';
}
return this.prop.apply( this, [].concat.apply( ['innerHTML'], arguments ) );
},
// 设置或者获取元素的文本
text: function( text ) {
/*
* 实现思路:
* 1、不传参,遍历所有元素,依次得到他们的文本,累加在一起返回
* 2、传参
* 2.1、参数类型为null,遍历所有元素,依次清除它们的内容
* 2.2、参数类型为字符串,遍历所有元素,依次重置它们的文本
* 3、链式编程返回this
* */
var textTotal = '';
// 不传参,返回所有元素的文本
if( arguments.length === 0 ) {
this.each( function() {
textTotal += this.innerText;
});
return textTotal;
}
// 传参,进一步判断
else {
// null,清除所有
if( text === null ) {
this.each( function() {
this.innerText = '';
});
}
// string,重置
else if( jQuery.isString( text ) ) {
this.each( function() {
this.innerText = text;
});
}
}
// 链式编程
return this;
},
// 升级版本,获取采用map,设置复用prop
_text: function( text ) {
if( arguments.length === 0 ) {
// 利用静态map方法遍历所有的元素,得到所有元素的文本组成的数组,
// 然后利用数组的join方法把它们连在一起。
return jQuery.map( this, function() {
return this.innerText;
}).join('');
}
else {
// 这里可以复用prop实现
return this.prop( 'innerText', text === null? '': text );
}
},
// 清除所有元素的内容
empty: function() {
return this.html( null );
},
// 删除所有元素
remove: function() {
return this.each( function() {
this.parentNode.removeChild( this );
});
},
// 把所有元素添加到指定的目标
appendTo: function( target ) {
// target可能是DOM、selector、jQ实例,
// 那我们借助jQuery统一包装一下,最终得到的都是jQ实例。
var $target = jQuery( target );
/*
* 实现思路:
* 1、遍历所有目标,再遍历所有元素,
* 2、依次把所有元素添加到所有目标中(只有一个目标添加的元素是本体,其余的是clone版本)。
* 3、收集所有被添加的元素(包含clone版本),交由pushStack处理,然后返回其值。
* */
var $content = this,
temp, result = [];
// 遍历所有目标
$target.each( function( i ) {
// 这里的this是每一个目标
var self = this;
// 遍历所有被添加的元素
$content.each( function() {
// 这里的this是每一个被添加的元素
// 只有第一个目标添加的是元素本体,以后添加的是元素clone版本
temp = i === 0? this: this.cloneNode( true );
self.appendChild( temp );
// 收集所有被添加的元素,最后要返回
result.push( temp );
});
});
// 交由pushStack包装成新实例返回,新实例记录了上一级链
return this.pushStack( result );
},
// 给所有元素添加子元素
append: function( content ) {
/*
* 实现思路:
* 1、如果content是字符串,遍历所有元素,累加innerHTML
* 2、如果不是,统一使用jQuery包装成实例
* 3、遍历所有目标,再遍历所有要添加的元素
* 4、依次把所有元素添加到所有目标中(只有一个目标添加的元素是本体,其余的是clone版本)
* 5、链式编程返回this
* */
if( jQuery.isString( content ) ) {
this.each( function() {
this.innerHTML += content;
});
}else {
jQuery( content ).appendTo( this );
}
// 链式编程
return this;
},
// 把所有元素添加到目标的最前面
prependTo: function( target ) {
/*
* 实现思路:
* 0、把target使用jQuery统一包装成jQ实例
* 1、遍历所有目标,再遍历所有元素,
* 2、依次把所有元素添加到所有目标的最前面(只有一个目标添加的元素是本体,其余的是clone版本)。
* 3、收集所有被添加的元素(包含clone版本),交由pushStack处理,然后返回其值。
* */
var $target = jQuery( target );
var temp, result = [];
// 遍历目标
for( var i = 0, len = $target.length; i < len; i++ ) {
// 遍历被添加元素
for( var j = 0, lenJ = this.length; j < lenJ; j++ ) {
// 给第一个目标加本地,以后clone
temp = i === 0? this[ j ]: this[ j ].cloneNode( true );
$target[i].insertBefore( temp, $target[i].firstChild );
result.push( temp );
}
}
return this.pushStack( result );
},
_prependTo: function( target ) {
/*
* 实现思路:
* 0、把target使用jQuery统一包装成jQ实例
* 1、遍历所有目标,再遍历所有元素,
* 2、依次把所有元素添加到所有目标的最前面(只有一个目标添加的元素是本体,其余的是clone版本)。
* 3、收集所有被添加的元素(包含clone版本),交由pushStack处理,然后返回其值。
* */
var $content = this,
temp, result = [];
// 遍历所有的目标
jQuery( target ).each( function( i ) {
// 这里的this,指向每一个目标元素
var target = this;
// 遍历所有被添加的元素
$content.each( function() {
// 这里的this,指向每一个被添加的元素
// 只有第一个目标添加是本体,以后是clone版本
temp = i === 0? this: this.cloneNode( true );
// 把元素添加到目标的最前面
target.insertBefore( temp, target.firstChild );
// 保存被添加的元素
result.push( temp );
});
});
return this.pushStack( result );
},
// 给所有元素的最前面添加子元素
prepend: function( content ) {
/*
* 实现思路:
* 1、如果content是字符串,遍历所有元素,累加到innerHTML的最前面
* 2、如果不是,先保证成jQ实例,然后借用prependTo添加到this
* 3、链式编程返回this
* */
if( jQuery.isString( content ) ) {
this.each( function() {
this.innerHTML = content + this.innerHTML;
});
}else {
jQuery( content ).prependTo( this );
}
return this;
},
// 获取所有元素的子元素
children: function() {
var result = [];
// 遍历所有元素
this.each( function() {
// 把所有的子元素添加存储result中
result.push.apply( result, this.children );
});
return this.pushStack( result );
},
// 获取所有元素的下一个兄弟元素
next: function() {
var result = [];
// 遍历所有元素
this.each( function() {
var nextNode = this;
// 找到元素下一个兄弟元素为止
while ( nextNode = nextNode.nextSibling ) {
if( nextNode.nodeType === 1 ) {
result.push( nextNode );
break;
}
}
});
return this.pushStack( result );
},
// 获取所有元素的下一个兄弟元素
_next: function() {
return this.pushStack( this.map( function() {
var nextNode = this;
while( nextNode = nextNode.nextSibling ) {
if( nextNode.nodeType === 1 ) {
return nextNode;
}
}
}));
},
// 在所有元素的前面添加兄弟元素
before: function( sibling ) {
/*
* 实现思路:
* 1、如果参数是字符串,那么调用parseHTML解析成DOM节点
* 2、统一包装成实例
* 3、遍历所有参照的兄弟元素,遍历所有被添加的兄弟元素
* 4、获取每一个参照元素的父元素,在参照元素的前面插入被添加的兄弟元素(第一个父添加的是本体,以后是clone)
* 5、链式编程返回this
* */
if( jQuery.isString( sibling ) ) {
sibling = jQuery.parseHTML( sibling );
}
var $sibling = jQuery( sibling );
// 遍历所有的参照元素
return this.each( function( i ) {
var refer = this;
// 遍历所有被添加的元素
$sibling.each( function() {
// 第一个父元素添加本体,以后clone
refer.parentNode.insertBefore( i === 0? this: this.cloneNode( true ), refer );
});
});
},
// 在所有元素的后面添加兄弟元素
after: function( sibling ) {
if( jQuery.isString( sibling ) ) {
sibling = jQuery.parseHTML( sibling );
}
var $sibling = jQuery( sibling );
// 遍历所有的参照元素
return this.each( function ( i ) {
var refer = this;
// 遍历所有被添加的元素
$sibling.each( function() {
// 第一个父元素添加本体,以后clone
refer.parentNode.insertBefore( i === 0? this: this.cloneNode( true ), refer.nextSibling );
});
});
}
});
jQuery原生框架-----------------dom操作的更多相关文章
- jQuery原生框架-----------------属性操作
// 添加一个处理兼容获取样式的静态方法jQuery.getStyle = function( dom, styleName ) { // dom不是dom,styleName不是字符串,直接打走 i ...
- jQuery系列 第七章 jQuery框架DOM操作
第七章 jQuery框架的选择器 jQuery框架继承和优化了JavaScript访问DOM对象的特性,我们使用jQuery框架提供的api可以更加方便的操作DOM对象. 7.1 创建DOM节点 使用 ...
- dom core,html dom,css dom,jquery 中的dom操作
前端开发中为达到某种目的,往往有很多方法:dom core,html dom,jquery; dom core/jquery主要通过函数调用的方式(getAttribute("属性名&quo ...
- JQuery中的DOM操作
JQuery中有很多DOM操作,但是因为之前没有总结过,所以用来用去都是那几个,一写html中的表单交互,尤其是那些复杂的表单交互,就是一大坨的js,我自己看着都费劲. 所以我感觉有必要总结一下 &l ...
- Jquery基础之DOM操作
转自:http://www.cnblogs.com/bro-ma/p/3063942.html JQuery中的DOM操作主要对包括:建[新建].增[添加].删[删除].改[修改].查[查找][像数据 ...
- jQuery选择器和DOM操作——《锋利的jQuery》(第2版)读书笔记1
第1章 认识jQuery jQuery有以下优势: 轻量级: 强大的选择器: 出色的DOM操作的封装: 可靠的事件处理机制: 完善的Ajax: 不污染顶级变量: 出色的浏览器兼容性: 链式操作方式: ...
- jQuery中的DOM操作<思维导图>
DOM是Document Object Model的缩写,意思是文档对象模型.DOM是一种与浏览器.平台.语言无关的接口.使用该接口可以轻松地访问页面中所有的标准组件.简单来说,DOM解决了Netsc ...
- Jquery:jquery中的DOM操作<一>
之前两天学习了Jquery强大的选择器,今天学习了一部分Jquery对DOM的操作,下面我将把自己今天的成果分享给大家,那些菜鸟们,你们是否需要巩固之前所学? 首先需要知道,DOM操作分为3个方面:D ...
- jQuery中的DOM操作总结
jQuery中的DOM操作 DOM是Document Object Medel的缩写,它的意思是文档对象模型,根据W3C的官方说法,DOM是一种跟浏览器,平台以及语言都没有关系的一种规范,也就是一种接 ...
随机推荐
- 如何将本地文件上传到github托管
Github开源代码库以及版本控制系统,可以托管各种git库,可以将个人Blog或小型项目托管到github,方便看起来又高大上的样子,哈哈哈,下面就看一下实践过程和成果吧!一:注册账号:地址: ([ ...
- 关于C语言结构体,指针,声明的详细讲解。——Arvin
关于结构体的详细分析 只定义结构体 struct Student { int age; char* name; char sex;//结构体成员 };//(不要忘记分号) Student是结构体的名字 ...
- ViewPager onPageChangeListener
今天在做项目的时候,由于要处理viewPager页面滑动的事件,所以对其进行了一个小小的研究: 首先ViewPager在处理滑动事件的时候要用到OnPageChangeListener OnPageC ...
- VB用windows API激活子窗体
http://files.cnblogs.com/files/liuzhaoyzz/%E6%BF%80%E6%B4%BB%E5%AD%90%E7%AA%97%E4%BD%93.rar setforeg ...
- 【转】 C++模板详解
C++模板 模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数.返回值取得任意类型. 模板是一种对类型进行参数化的工具: 通常有 ...
- 【javascript】作用域和闭包浅析
作用域 分全局作用域和局部作用域 全局作用域:函数外部定义的变量,可以被整个program的各成员参照利用. 局部作用域:函数内部定义的变量,仅供该函数的各成员参照利用. var val=1; //全 ...
- Entity framework在用于WCF时创建数据模型的问题
众所周知,WCF的传输对象,在创建时需要在类名上标识[DataContract]以及在属性上标识[DataMember],当我们在使用Entity framework时(不考虑Code first的情 ...
- Github windows客户端简单使用教程
1. 首先到官网下载Github客户端,官网地址:https://desktop.github.com/ 2. 点击上图红框的按钮开始下载客户端. 3. 双击下载好的客户端,开始安装. 双击之后出现一 ...
- js数据类型
JavaScript数据类型是非常简洁的,它只定义了6中基本数据类型 null:空.无.表示不存在,当为对象的属性赋值为null,表示删除该属性 undefined:未定义.当声明变量却没有赋值时会显 ...
- Xcode真机调试出现The account '***' has no team with ID '***'的解决方案
前段时间,想用真机调试的时候出现 The account '***' has no team with ID '***'的问题, 以前页真机调试过,没有这种情况,于是我登陆开发者中心,进去发现说我的账 ...