jQuery源码-dom操作之jQuery.fn.text

写在前面

jQuery.fn.text在jQuery是个使用频率比较高的接口,它的作用无非是设置/获取dom节点的内容文本,下文会通过几个简单的例子来说明.text()接口的使用,以及最后会对源码进行分析。这几个接口本身不复杂,理解了textContent属性基本就迎刃而解,妨碍理解的我觉得反而是jQuery.access这样的神级方法。遇到jQuery.access,理解它的作用是设置/读取属性即可。

简单例子

jQuery官方文档是我们永远的好伙伴,可猛戳 http://api.jquery.com/text/,从官方说明来看,有以下几种用法。直接上例子

读取的例子

首先假设页面有这么段html

<div id="node_1">hello</div>
<div id="node_2">a<span>b</span>c</div>

代码如下:

console.log($('#node_1').text());  // 输出 hello
console.log($('#node_2').text());  // abc

从上面可以看出,$(selector).text()返回的是:$(selector)选中的所有节点的所有后代节点的文本内容拼接起来后,要点如下:

1. $(selector)选中的所有节点的集合,假设为A

2. A的所有后代节点,假设为B

3. B的文本内容合起来,就是返回结果

ps:实际返回的结果比上面所说的稍微复杂一点,下面再展开

设置的例子

设置的例子也比较简单,同样假设页面有如下HTML

<div id="node_1">hello</div>
<div id="node_2">a<span>b</span>c</div>

设置例子1

代码如下:

$('node_1').text('hello');
$('node_2').text('world');

原来的HTML变成下面这样子,也就是说,$(node).text( str )操作分有两个表现:

1. node原有子节点被全部删除

2. node的文本内容被设置为str

<div id="node_1">hello</div>
<div id="node_2">world</div>

设置例子二:

紧接例子一,再看下面这段代码,注意点:

1. index为当前处理的元素e在选中集合中的位置,0开始

2. text为e的文本节点

$('div').text(function(index, text){
    return text + index;
});

结果如下:

<div id="node_1">hello0</div>
<div id="node_2">world1</div>

源码分析

textContent这个属性,对 jQuery.fn.text() 接口的理解很关键,如果不熟悉的童鞋可以参考下笔者前几天在MDN翻译的相关页面 Node.textContent

首先是jQuery.fn.text的源码,可见内容是通过jQuery.text、jQuery.access(神一样的方法)实现的:

text: function( value ) {
        return jQuery.access( this, function( value ) {
            return value === undefined ?
                jQuery.text( this ) :
                this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
        }, null, value, arguments.length );
    }

源码分析:设置text

设置text的源码比较简单,从左往右念就是:

1、清空节点原本的内容

2、通过createTextNode方法创建一个text节点(参数为传入的value)

3、将text节点插入node里去

this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );

源码分析:获取text

接下来是jQuery.text(),其实是Sizzle.getText

jQuery.text = Sizzle.getText;

再看Sizzle.getText,代码不算复杂,归纳起来就几点:

1、如果elem为文本节点(TEXT_NODE),那么取elem.nodeValue

2、如果elem为元素节点(ELEMENT_NODE)、文档节点(DOCUMENT_NODE)、文档碎片节点(DOCUMENT_NODE),那么

  2.1 元素节点:取elem.textContent

  2.2 文档节点、文档碎片节点:逐层遍历子节点,获取 textContent 后进行拼接

3、PROCESSING_INSTRUCTION_NODE、COMMENT_NODE被排除在外

getText = Sizzle.getText = function( elem ) {
    var node,
        ret = "",
        i = 0,
        nodeType = elem.nodeType;

    if ( !nodeType ) {
        // If no nodeType, this is expected to be an array
        for ( ; (node = elem[i]); i++ ) {
            // Do not traverse comment nodes
            ret += getText( node );
        }
    } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
// 备注:nodeType === 1 为元素节点,9 为document节点,11为document fragment节点
        // Use textContent for elements
        // innerText usage removed for consistency of new lines (see #11153)
        if ( typeof elem.textContent === "string" ) {
            return elem.textContent;
        } else {
            // Traverse its children
            for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
                ret += getText( elem );
            }
        }
    } else if ( nodeType === 3 || nodeType === 4 ) {
// nodeType === 3为TEXT_NODE,4为CDATA_SECTION_NODE
        return elem.nodeValue;
    }
    // Do not include comment or processing instruction nodes

    return ret;
};

写在后面

jQuery.fn.text 、jQuery.text 其实并不复杂,理解了textContent属性基本就迎刃而解,妨碍理解的我觉得反而是jQuery.access这样的神级方法。遇到jQuery.access,理解它的作用是设置/读取属性即可。

 

时间: 2024-11-05 16:27:48

jQuery源码-dom操作之jQuery.fn.text的相关文章

jQuery源码-dom操作之jQuery.fn.html

写在前面 前面陆陆续续写了jQuery源码的一些分析,尽可能地想要cover里面的源码细节,结果导致进度有些缓慢.jQuery的源码本来就比较晦涩,里面还有很多为了解决兼容问题很引入的神代码,如果不google的话压根不知道那一段段代码为什么会存在于人世. 于是就一直在重复坐着这么件事情,到处谷歌或者请教别人,这段兼容代码是为解决神马问题引入的.好不容易把所有的源码细节搞清楚,喝着咖啡对着电脑欣赏自己的劳动成果,内心却闪过一丝奇怪的感觉:我花了这么长的时间究竟做了什么?就为了搞清楚这段常理无法解

jQuery源码分析-03构造jQuery对象-工具函数_jquery

作者:nuysoft/高云 QQ:47214707 EMail:nuysoft@gmail.com 声明:本文为原创文章,如需转载,请注明来源并保留原文链接. 读读写写,不对的地方请告诉我,多多交流共同进步,本章的的PDF等本章写完了发布. jQuery源码分析系列的目录请查看 http://nuysoft.iteye.com/blog/1177451,想系统的好好写写,目前还是从我感兴趣的部分开始,如果大家有对哪个模块感兴趣的,建议优先分析的,可以告诉我,一起学习. 3.4 其他静态工具函数

jQuery源码-class操作

写在前面 本文写作基于jQuery 1.9.1版本,源码分析系列目录:http://www.cnblogs.com/chyingp/archive/2013/06/03/jquery-souce-code-study.html jQuery中class操作相关的方法 jQuery中共提供了四个操作class的方法,除了toggleClass外,其他从方法名就可以知道方法是干嘛的,下文会分别举具体例子 .addClass(className):添加className .removeClass(cl

jQuery源码分析-03构造jQuery对象-源码结构和核心函数_jquery

作者:nuysoft/高云 QQ:47214707 EMail:nuysoft@gmail.com 毕竟是边读边写,不对的地方请告诉我,多多交流共同进步.本章还未写完,完了会提交PDF. 前记: 想系统的好好写写,但是会先从感兴趣的部分开始. 近期有读者把PDF传到了百度文库上,首先感谢转载和传播,但是据为已有并设置了挺高的财富值才能下载就不好了,以后我整理好了会传到文库上.请体谅一下. 3. 构造jQuery对象 3.1 源码结构 先看看总体结构,再做分解: 复制代码 代码如下: (funct

jQuery 源码分析笔记(6) jQuery.data_jquery

data部分的代码从1381行开始.最开始的几行关键代码: 复制代码 代码如下: jQuery.extend({ // 存储数据的地方,关键实现核心 cache: { }, // 分配ID用的seed uuid: 0, // 为了区别不同的jQuery实例存储的数据,使用前缀+jQuery版本号+随机数作为Key expando: "jQuery" + (jQuery.fn.jquery + Math.random()).replace(/\D/g, ""), //

jQuery 源码分析笔记(5) jQuery.support_jquery

其中jQuery.browser已经提供了根据UserAgent检测的浏览器信息.而jQuery.support 使用特性检测来检查浏览器的功能以及Bug. 和文档一样,首先说明一下,这个模块是很底层的代码,基本不需要在日常开发中使用,但是插件的开发者更需要.因为插件需要兼容各个浏览器.首先看一下 support模块提供了哪些浏览器特性的检测,以下结果是在Chrome 13 Dev下看到的结果.根据浏览器的不同,这里的成员可能会有变化.(PS:再次吐槽IE,大部分属性都是IE比较特别) ajax

jQuery源码-CSS样式相关部分

jquery版本:1.7.2 根据实际需要,对CSS部分无关代码进行适当删除,如有疑问,可参见jquery源码:http://code.jquery.com/jquery-1.7.2.js 因实际工作中暂时没有用到jquery,故对jquery了解很粗浅,文章可能有错漏之处,敬请见谅并指出 本文参考借鉴了nuysoft 的jquery源码分析系列,挺不错的系列文章,推荐下: http://www.cnblogs.com/nuysoft/archive/2011/11/14/2248023.htm

jQuery 源码分析 CSS 操作原理

jquery.fn.css获取当前jQuery所匹配的元素中第一个元素的属性值[$(-).css(cssName),注意这个cssName可以是数组]或给当前jQuery所匹配的每个元素设置样式值[$(-).css(cssname,value) / $(-).css(obj)]; 可以看见函数内部直接调用了jquery.access来处理.access将当前多个元素组成的jQuery对象所匹配的元素分解成单一元素逐个调用第二个参数中的回调function( elem, name, value )

jQuery源码-核心源码结构

从github直接拷贝过来,排版不是很友好,可点击这里查看github上的文章 前端的童鞋对jQuery绝对不会陌生,有不少刚入门的筒子,在不知JS为何物的时候,就已经在用jQuery了.这也应该归功于前端恶劣的生存环境:各自为政的浏览器厂商,依旧严峻的兼容性问题,并不好用的原生API... 使用jQuery的理由有很多,喜欢它的理由也很多,优雅的接口,丰富的插件,完善的文档等.作为一名有进取心的前端攻城狮,大家心理或多或少都有一个框架梦,总用它人写的库,内心总归有些那么不是滋味. 那好吧,干脆