jquery 获取textarea文本值详解

今天用jquery获取textarea文本值,遇到这么一个问题:

一开始用val()方法报错,后面使用text(),可以运行,但是获取的值永远为空,最后在改成val(),可以正常使用。

于是乎:为了把这个问题弄清楚,开始了遥远的解读jQuery源码之旅

步骤:

1. 给textarea设置默认值,分别输出text()和value()值

2. 改变textarea的文本值,在分别输出text()和value()值

例子:

代码:

 1 <!doctype html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="utf-8">
 5     <title>dom属性测试</title>
 6 </head>
 7 <body>
 8     <div id="js-div">
 9         <textarea id="js-textarea" >hhhh</textarea>
10         <button type="button" id="js-button">显示文本</button>
11
12         <input value="hello world" id="js-input">
13     </div>
14 <script type="text/javascript" src="../demo-plugin/public/js/jquery.js"></script>
15 <script type="text/javascript">
16     var   $textArea = $(‘#js-textarea‘),
17         textArea   = $textArea.val();
18
19         console.log(‘val:‘,textArea);
20         console.log(‘text:‘,$textArea.text());
21
22         $(‘#js-button‘).click(function () {
23
24             console.log(‘changed val:‘,$textArea.val());
25             console.log(‘changed text:‘,$textArea.text());
26         });
27 </script>
28 </body>
29 </html>

运行结果截图:

从上面的例子可以看出:

1. text()方法只能够获取到textarea的初始化文本值。

2. val() 方法不仅可以获取textarea的初始化文本值,当文本值改变时,也能正常获取到。

接下来,看jquery源码:

1. text()方法:

    text: function( text ) {
        if ( typeof text != "object" && text != null )
            return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );

        var ret = "";

        jQuery.each( text || this, function(){
            jQuery.each( this.childNodes, function(){
                if ( this.nodeType != 8 )
                    ret += this.nodeType != 1 ?
                        this.nodeValue :
                        jQuery.fn.text( [ this ] );
            });
        });

        return ret;
    },

从jquery源码中可以看出,text()方法是通过遍历元素的childNodes,获取每个子节点的nodeValue,拼接成字符串返回。

2. val()方法:

val: function( value ) {
        if ( value == undefined ) {

            if ( this.length ) {
                var elem = this[0];

                // We need to handle select boxes special
                if ( jQuery.nodeName( elem, "select" ) ) {
                    var index = elem.selectedIndex,
                        values = [],
                        options = elem.options,
                        one = elem.type == "select-one";

                    // Nothing was selected
                    if ( index < 0 )
                        return null;

                    // Loop through all the selected options
                    for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
                        var option = options[ i ];

                        if ( option.selected ) {
                            // Get the specifc value for the option
                            value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value;

                            // We don‘t need an array for one selects
                            if ( one )
                                return value;

                            // Multi-Selects return an array
                            values.push( value );
                        }
                    }

                    return values;

                // Everything else, we just grab the value
                } else
                    return (this[0].value || "").replace(/\r/g, "");

            }

            return undefined;
        }

        return this.each(function(){
            if ( this.nodeType != 1 )
                return;

            if ( value.constructor == Array && /radio|checkbox/.test( this.type ) )
                this.checked = (jQuery.inArray(this.value, value) >= 0 ||
                    jQuery.inArray(this.name, value) >= 0);

            else if ( jQuery.nodeName( this, "select" ) ) {
                var values = value.constructor == Array ?
                    value :
                    [ value ];

                jQuery( "option", this ).each(function(){
                    this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
                        jQuery.inArray( this.text, values ) >= 0);
                });

                if ( !values.length )
                    this.selectedIndex = -1;

            } else
                this.value = value;
        });
    },

这里由于是获取值,所以只需要看if(value == ‘undefined‘){...}分支,

根据代码,可以知道,当元素为input时,走的是else 分支,由语句:

return (this[0].value || "").replace(/\r/g, "");

可以看出,返回的元素的value值。

说了一堆,一定很疑惑分析这个有什么用,别走开,接下来更精彩:

页面初始化时:打印$(‘#js-textarea‘),看看控制台都输出什么东西:

上面两张图可以看出,在为改变textarea的文本值时,textarea的value属性值=初始值,nodeValue值为null,text()方法返回的是childNodes里面每个节点的nodeValue值拼接起来的字符串,注意区分。

接着看childNodes里面的内容:

可以看出,textarea有一个text文本节点,这个文本节点的nodeValue = 初始值。

接下来:改变文本框的文本值,输出$(‘#js-textarea‘),见证奇迹的时刻到了:

先看textarea的value属性值:

value值改变,那么子节点text的nodeValue值有没有变化呢,看截图

从上图可以看出:很遗憾,textarea的childNodes里面text文本节点的nodeValue值并没有发生变化。

为什么会出现这个现象,我也还不知道,不过这个测试结果说明了,为什么val()方法可以正常取值,而text()取值会出现问题。

后记:经过研究,发现自闭合标签childNodes长度为0,而其他标签至少有一个text文本节点,至于原理,还不是很清楚,等弄清楚了再说,哈哈。

时间: 2024-10-05 06:44:10

jquery 获取textarea文本值详解的相关文章

获取textarea文本框所选字符光标位置索引,以及选中的文本值;textarea高度自适应,随着内容增加高度增加;获取输入框中的光标位置

获取textarea文本框所选字符光标位置索引,以及选中的文本值 $.fn.selection = function () { var s, e, range, stored_range; if (this[0].selectionStart == undefined) { var selection = document.selection; if (this[0].tagName.toLowerCase() != "textarea") { var val = this.val()

jquery获取一组文本框的值

$("#btn5").click(function()  {    var str="";$("[name='checkbox'][checked]").each(function() '用来获取数组{        str+=$(this).val()+",";    '用来遍历数组    //alert($(this).val());    }) jquery获取一组文本框的值,布布扣,bubuko.com

JavaScript or jQuery 获取option value值 以及文本内容的方法

1.html <div class="form-group"> <label>保险公司</label> <select class="form-control" id="testSelect"> <option value="平安">平安保险</option> <option value="太平洋">太平洋保险</op

JQuery中$.ajax()方法参数详解

url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 delete也可以使用,但仅部分浏览器支持. timeout: 要求为Number类型的参数,设置请求超时时间(毫秒).此设置将覆盖$.ajaxSetup()方法的全局设 置. async:要求为Boolean类型的参数,默认设置为true,所有请求均为异步请求. 如果需要发送同步请求,请将此选项

JQuery中$.ajax()方法参数详解 (转)

url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 delete也可以使用,但仅部分浏览器支持. timeout: 要求为Number类型的参数,设置请求超时时间(毫秒).此设置将覆盖$.ajaxSetup()方法的全局设 置. async:要求为Boolean类型的参数,默认设置为true,所有请求均为异步请求. 如果需要发送同步请求,请将此选项

jQuery实现textarea文本框带有半透明文本提示效果

jQuery实现textarea文本框带有半透明文本提示效果:textarea文本框一般用于编辑大段的文本,比如编辑器或者简单的留言回复之类的功能,有的在textarea文本框的有默认的提示语言,下面就介绍一下如何使用jQuery实现此功能.代码如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content

Android基础入门教程——2.3.1 TextView(文本框)详解

Android基础入门教程--2.3.1 TextView(文本框)详解 标签(空格分隔): Android基础入门教程 本节引言: 学习完Android中的六大布局,从本节开始我们来一个个讲解Android中的UI控件,本节给大家带来的UI控件是:TextView(文本框),用于显示文本的一个控件,另外声明一点,我不是翻译API文档,不会一个个属性的去扣,只学实际开发中常用的,有用的,大家遇到感觉到陌生的属性可以查询对应的API!当然,每一节开始都会贴这一节对应API文档的链接:TextVie

jQuery().on方法的使用详解

从厦门回来之后,两周没写博客了,主要是没时间,先放一张在厦门的靓照 本文 原文链接 ,希望能帮到这些前端小白.用法:此方法可以在匹配元素上绑定一个或者多个事件处理函数. 使用off()方法可以删除on()方法绑定的事件. 语法结构一 1 $(selector).on(events,[selector],[data],fn) events:一个或多个用空格分隔的事件类型和可选的命名空间. selector:可选.一个选择器字符串,用以过滤选定的元素,该选择器的子元素将调用处理程序. data:可选

css文本格式详解

一.css文本主体内容: 二.css文本详解:  1.文本缩进 语法: text-indent:<length>|<percentage> 默认值为0. 属性值详解: <length>:用长度值指定文本的缩进.可以为负值.   <percentage>:用百分比指定文本的缩进.可以为负值. <inherit>:继承父级text-indent属性值. 用法: 检索或设置对象中的文本的缩进. 内联对象要使用该属性必须先使该对象表现为块级或内联块级.