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

jQuery的属性操作模块总共有4个部分,本篇说一下第2个部分:DOM属性部分,用于修改DOM元素的属性的(属性和特性是不一样的,一般将property翻译为属性,attribute翻译为特性)

DOM属性的静态方法接口如下:

  • prop(elem, name, value)    ;设置或读取DOM属性,有两种用法,如下

      ·$.prop(elem,name,value)      ;传入第三个参数表示设置elem元素的name属性值为value
      ·$.prop(elem,name,)          ;第三个参数为传入或者设置为undefined则表示获取elem的name属性

jQuery/$ 实例方法(可以通过jQuery实例调用的):

 writer by:大沙漠 QQ:22969969

  • prop(name, value)    ;设置或读取DOM属性,有以下用法

      .prop(obj)             ;参数1是对象时   

      .prop(name)          ;参数1是字符串时,参数2未指定或者设置为undefined时,表示获取第一个匹配元素属性为name的值

      .prop(name,value)     ;为每个匹配元素的谁能够设置一个值

  • removeProp(name)  从每个匹配元素上移除一个name属性,name可以是一个或多个dom属性名(用空格分开)

举个栗子:

  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. </head>
  8. <body>
  9. <input type="text">
  10. <button id="b1">设置值</button>
  11. <button id="b2">获取值</button>
  12. <script>
  13. let input = document.getElementsByTagName('input')[0],
  14. b1 = document.getElementsByTagName('button')[0],
  15. b2 = document.getElementsByTagName('button')[1];
  16. b1.onclick = ()=>{
  17. $('input').prop('value',555) //设置输入框的值为555 等于$.prop(input,'value',555)
  18. }
  19. b2.onclick = ()=>{
  20. let result = $('input').prop('value'); //获取输入框的值 等于:let result = $.prop(input,'value');
  21. console.log(result);
  22. }
  23. </script>
  24. </body>
  25. </html>

渲染如下:

 我们点击设置值按钮值就会变为555了:

然后点击获取值,就会获输入框这个DOM对象的value值:

 

源码分析


$.prop实现如下:

  1. jQuery.extend({
  2. prop: function( elem, name, value ) { //设置或读取DOm属性。elem是要读取、设置的DOM元素,name是要操作的DOM属性名、value是要操作的DOM属性值
  3. var ret, hooks, notxml,
  4. nType = elem.nodeType;
  5. if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { //如果elem为空 或者是文本、注释、属性节点
  6. return; //直接返回,不接着处理
  7. }
  8. notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); //是否为xml文档元素
  9. if ( notxml ) { //如果不是xml文档元素
  10. name = jQuery.propFix[ name ] || name; //修正DOM属性名
  11. hooks = jQuery.propHooks[ name ]; //修正扩展DOM属性修正对象
  12. }
  13. if ( value !== undefined ) { //如果value不为空,则设置值
  14. if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { //优先调用修正方法set()
  15. return ret;
  16. } else {
  17. return ( elem[ name ] = value ); //设置值,并将值返回
  18. }
  19. } else { //如果value为空则读取name的值
  20. if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { //优先调用修正方法get()
  21. return ret;
  22. } else {
  23. return elem[ name ]; //获取对应的值
  24. }
  25. }
  26. },
  27. /**/
  28. })

挺简单的吧,对于jQuery实例来说,它和HTMl特性部分一样,如下:

  1. jQuery.fn.extend({
  2. prop: function( name, value ) { //设置或读取DOM属性
  3. return jQuery.access( this, name, value, true, jQuery.prop );   //也是借用了$.access工具方法
  4. },
  5. removeProp: function( name ) { //从每个匹配元素上移除一个DOM属性
  6. name = jQuery.propFix[ name ] || name; //如果属性名name需要修正,则修正属性
  7. return this.each(function() {
  8. // try/catch handles cases where IE balks (such as removing a property on window)
  9. try {
  10. this[ name ] = undefined; //先设置为undefined
  11. delete this[ name ]; //再删除属性
  12. } catch( e ) {}
  13. });
  14. },
  15. /**/
  16. })

我们可以看到,jQuery实例的prop方法也是借用了$.access工具方法,$.access在HTML特性部分已经讲过了,这里不说了。

原文链接:http://www.cnblogs.com/greatdesert/p/11672526.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号