经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » jQuery » 查看文章
jQuery 源码分析(十五) 数据操作模块 val详解
来源:cnblogs  作者:大沙漠  时间:2019/10/25 9:37:35  对本文有异议

jQuery的属性操作模块总共有4个部分,本篇说一下最后一个部分:val值的操作,也是属性操作里最简单的吧,只有一个API,如下:

  • val(vlaue)        ;获取匹配元素集合中第一个元素的当前值,或者设置匹配元素集合中每个元素的值,有三种用法:
  1. val()            ;没有参数,获取第一个匹配元素的当前值
  2. val(value)         ;为每个匹配元素设置value值        ;如果为null则表示设置值为空
  3. val(func)          ;设置每个匹配元素为函数func返回的值    ;该函数接受两个参数:分别是当前元素在集合中的下标和当前value值。

就是修改DOM元素的value属性,常用于 设置/获取 输入框里的值,举个栗子:

 writer by:大沙漠 QQ:22969969

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <script src="http://libs.baidu.com/jquery/1.7.1/jquery.min.js"></script>
  7. <style>
  8. .color{color: #f00;}
  9. .back{background: #ccc;}
  10. </style>
  11. </head>
  12. <body>
  13. <input type="text" id="input">
  14. <button id="b1">设置值</button>
  15. <button id="b2">获取值</button>
  16. <script>
  17. let b1 = document.getElementById('b1'),
  18. b2 = document.getElementById('b2');
  19. b1.onclick = ()=> $('input').val(123)
  20. b2.onclick = ()=> console.log($('input').val())
  21. </script>
  22. </body>
  23. </html>

渲染如下:

我们设置了一个输入框,然后添加了两个按钮,分别用于设置值和获取值,点击设置值后会调用$('input').val(123)去设置对应的值123,如下:

 点击获取值时就会获取该输入框的值,控制台输入如下:

 一般在提交表单的时候,可以通过val()去获取值,在进行验证的时候,比如某个输入框只能填写数字,如果发现用户输入了非数字的字符,我们过滤后可以再调用val(v)去设置一下值。

 

源码分析


val()的实现比较简单,如下:

  1. jQuery.fn.extend({
  2. val: function( value ) { //获取匹配元素集合中第一个元素的当前值,或者设置匹配元素集合中每个元素的值。
  3. var hooks, ret, isFunction,
  4. elem = this[0]; //elem是第一个匹配元素的引用
  5.  
  6. if ( !arguments.length ) { //如果未传入参数,则获取第一个匹配元素的当前值
  7. if ( elem ) {
  8. hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; //如果需要修正,则修正该值
  9.  
  10. if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
  11. return ret;
  12. }
  13. ret = elem.value;
  14. return typeof ret === "string" ? //否则直接读取DOM属性value
  15. // handle most common string cases
  16. ret.replace(rreturn, "") :
  17. // handle cases where value is null/undef or number
  18. ret == null ? "" : ret;
  19. }
  20. return;
  21. }
  22. isFunction = jQuery.isFunction( value ); //value是否为函数
  23.  
  24. return this.each(function( i ) {
  25. var self = jQuery(this), val;
  26. if ( this.nodeType !== 1 ) { //如果当前元素不是元素节点,则直接返回
  27. return;
  28. }
  29. if ( isFunction ) { //如果value是函数,则在每个匹配元素上执行该函数,并取其返回值作为待设定的值。
  30. val = value.call( this, i, self.val() ); //在函数内部,this指向当前元素,函数有两个参数,分别是当前元素在集合中的下标和当前value值。
  31. } else {
  32. val = value;
  33. }
  34. // Treat null/undefined as ""; convert numbers to string
  35. if ( val == null ) { //如果val是null,则转换为空字符串
  36. val = "";
  37. } else if ( typeof val === "number" ) { //如果val是数字格式,则/转换为字符串
  38. val += "";
  39. } else if ( jQuery.isArray( val ) ) { //如果val是数组格式
  40. val = jQuery.map(val, function ( value ) { //则调用jQuerymap将val转化为字符串最后返回
  41. return value == null ? "" : value + "";
  42. });
  43. }
  44. hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
  45. // If set returns undefined, fall back to normal setting
  46. if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { //优先调用对应的修正对象的修正方法set()
  47. this.value = val; //如果没有修正对象,则直接设置value值。
  48. }
  49. });
  50. },
  51. /**/
  52. })

就是设置/获取对应DOM对象引用的value值来实现的。

 

原文链接:http://www.cnblogs.com/greatdesert/p/11673027.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号