在阅读attr、remove方法时,看到一些对浏览器兼容性做处理的hooks。接下来看一下这些hooks都做了哪些兼容性处理

1、attrHooks。主要处理IE6-9 input的type属性无法写入的问题。

  attrHooks: {
    type: {
      set: function( elem, value ) {

        // 如果value是radio,并且elem是input
        if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
          var val = elem.value;
          elem.setAttribute( "type", value );
          if ( val ) {
            elem.value = val;
          }
          return value;
        }
      }
    }
  }

  当用户调用attr(elem, name, value)方法为elem添加属性时,jQuery通过调用jQuery.ttrHooks[name],看是否该元素的该属性是否存在对应的hooks,

  如果存在则返回该hooks,则调用该hooks的set方法为elem设置属性。

2、boolHook 处理属性值是ture或false的情况

  boolHook = {
    set: function( elem, value, name ) {

      // 如果value是false,直接删除该属性
      if ( value === false ) {
        jQuery.removeAttr( elem, name );

      // 否则将该属性的值设置为何名称相同。例如:checked=“checked”
      } else {
        elem.setAttribute( name, name );
      }

      // 返回属性名
      return name;
    }
  };

3、propHooks 处理通过prop方法获取元素属性时的情况。jQuery中直接给propHooks的属性只有tabIndex,但后续又动态加入很多。

  propHooks: {

    // tabIndex属性是指定按tab键时,光标focus的先后顺序,主要指定给表单元素或链接。
    tabIndex: {

      get: function( elem ) {

        // 如果该元素有tabindex属性,或者该元素时可focus元素,或者是链接,返回elem的tabIndex,否则返回-1
        return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
          elem.tabIndex :
          -1;
      }
    }
  }

4、为propHooks增加了selected属性

  if ( !jQuery.support.optSelected ) {
    jQuery.propHooks.selected = {
      get: function( elem ) {
        var parent = elem.parentNode;
        if ( parent && parent.parentNode ) {
          parent.parentNode.selectedIndex;
        }
        return null;
      }
    };
  }

5、valHooks

  valHooks: {
    option: {

      // 处理获取option值的兼容性。
      get: function( elem ) {
        var val = elem.attributes.value;
        return !val || val.specified ? elem.value : elem.text;
      }
    },

    // 处理得到或设置select值的兼容性问题,对原生js不熟悉,读起来好费劲。。。
    select: {
      get: function( elem ) {
        var value, option,

        // 得到select中所有的options
        options = elem.options,

        // 得到被选中的option的index
        index = elem.selectedIndex,

        // 用于后面初始化values提供依据,检测elem是单选select还是复选
        one = elem.type === "select-one" || index < 0,

        // 如果one为true则values初始化null,否则初始化为空数组
        values = one ? null : [],

        // 初始化max(有多少个option)
        max = one ? index + 1 : options.length,
        i = index < 0 ?
          max :
          one ? index : 0;

        // Loop through all the selected options
        for ( ; i < max; i++ ) {
          option = options[ i ];

          if ( ( option.selected || i === index ) &&
          ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
          ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {

            value = jQuery( option ).val();

            // 如果是单选select,返回value

            if ( one ) {
              return value;
            }

            // 否则,如果是多选select,将value放入values数组中

            values.push( value );
          }
        }

        // 当是多选select时,返回所有的values

        return values;
      },

      // 设置select的值

      set: function( elem, value ) {
        var optionSet, option,

          // 拿到所有的option
          options = elem.options,

          // 将value转换成数组
          values = jQuery.makeArray( value ),

          // 得到option的个数
          i = options.length;

        // 遍历所有的option

        while ( i-- ) {
          option = options[ i ];

          // 如果当前option的value在values数组中
          if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {

            // 则设置optionSet为true
            optionSet = true;
          }
        }

        // 遍历之后,如果optionSet仍为是false,说明没有被选中的option,设置select值失败
        if ( !optionSet ) {
          elem.selectedIndex = -1;
        }
        return values;
      }
    }
  }, 

  // 处理获取或设置radio和checkbox值的兼容性
  jQuery.each([ "radio", "checkbox" ], function() {
    jQuery.valHooks[ this ] = {
      set: function( elem, value ) {

        // 如果value是数组
        if ( jQuery.isArray( value ) ) {

          // 如果该属性的value在数组中,则将该元素设置为被选中
          return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
        }
      }
    };

    // 如果浏览器不支持checkOn(?)
    if ( !jQuery.support.checkOn ) {
      jQuery.valHooks[ this ].get = function( elem ) {
        return elem.getAttribute("value") === null ? "on" : elem.value;
      };
    }
  });

6、propFix 建立html属性和js中对应属性的对应关系(html属性都是小写,js中采用的是驼峰标识)

  // 首先直接添加两个特殊的属性对应关系

  propFix: {
    "for": "htmlFor",
    "class": "className"
  },

  // 然后遍历数组,建立html(小写)和js(驼峰)的对应关系

  jQuery.each([
    "tabIndex",
    "readOnly",
    "maxLength",
    "cellSpacing",
    "cellPadding",
    "rowSpan",
    "colSpan",
    "useMap",
    "frameBorder",
    "contentEditable"
  ], function() {

    // 将小写的形式作为键,驼峰的形式作为值

    jQuery.propFix[ this.toLowerCase() ] = this;
  });

jQuery属性操作(三)的更多相关文章

  1. jquery——属性操作、特殊效果

    1. attr().prop() 取出或者设置某个属性的值 <!DOCTYPE html> <html lang="en"> <head> &l ...

  2. jQuery属性操作

    jQuery 的属性操作的核心部分其实就是对底层 getAttribute().setAttributes()等方法的一系列兼容性处理 ...if ( notxml ) { name = name.t ...

  3. jQuery源代码学习之八——jQuery属性操作模块

    一.jQuery属性模块整体介绍 jQuery的属性操作模块分四个部分:html属性操作,dom属性操作,类样式操作,和值操作. html属性操作(setAttribute/getAttribute) ...

  4. python全栈开发day48-jqurey自定义动画,jQuery属性操作,jQuery的文档操作,jQuery中的ajax

    一.昨日内容回顾 1.jQuery初识 1).使用jQuery而非JS的六大理由 2).jQuery对象和js对象转换 3).jQuery的两大特点 4).jQuery的入口函数三大写法 5).jQu ...

  5. jQuery属性操作(二)

    挂载到$上的几个属性操作方法分析,发现属性操作用到了sizzle封装的方法 attr: function( elem, name, value ) {        var hooks, ret,   ...

  6. web前端----jQuery属性操作

    知识点总结 1.属性 属性(如果你的选择器选出了多个对象,那么默认只会返回出第一个属性). attr(属性名|属性值) - 一个参数是获取属性的值,两个参数是设置属性值 - 点击加载图片示例 remo ...

  7. 前端之JQuery:JQuery属性操作

    Jquery2--属性相关的操作 知识点总结 1.属性 属性(如果你的选择器选出了多个对象,那么默认只会返回出第一个属性). attr(属性名|属性值) - 一个参数是获取属性的值,两个参数是设置属性 ...

  8. jQuery 属性操作和CSS 操作

    如有在jQuery方法中涉及到函数,此函数必定会返回一个数值(函数由于运行次数不同触发一些不同效果) jQuery 属性操作方法(以下方法前些日子学习过,不再赘述) addClass() attr() ...

  9. jQuery属性操作总结

    jquery属性包括以下几个: attr(name|pro|key,val|fn) removeAttr(name) prop(n|p|k,v|f)1.6+ removeProp(name)1.6+ ...

  10. jQuery属性操作(四)

    通过阅读jQuery为属性操作封装的基本方法和为处理兼容性问题提供的hooks,发现jQuery在属性操作方面并没有做过多的设计,只是处理一下兼容性问题,然后调用基础的DOM操作方法.以下是对JQue ...

随机推荐

  1. jquery选择器玩得不6啊,只能慢慢写判断了,唉..........................

    jquery选择器玩得不6啊,只能慢慢写判断了,唉..........................

  2. HTTP常见的Post请求

    零.HTTP协议是什么样的?  HTTP的请求报文分为三部分:请求行.请求头.请求体 如下2张图表示的意思一致: 图一 图二  本文章的重点是请求体(请求数据),请求行和请求头的部分请参考: http ...

  3. 关于TensorFlow多种安装方式

    Tensorflow的官网其实给出了很详细的安装教程,细分包括: Pip install: Install TensorFlow on your machine, possibly upgrading ...

  4. 移动端H5地图离线瓦片方案(1)(2)

    2在作者另一篇 移动端H5地图离线瓦片方案   文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 移动端的网速和 ...

  5. Bulestacks模拟器Bulestacks.prop文件里中英文对照表

    打开“Bulestacks.prop”文件后可以看到以下内容,根据中英文对照表来修改即可. # begin build properties (开始设置系统性能)# autogenerated by ...

  6. 64位系统web项目导出excel问题分析及解决方法汇总

    最近在web项目中做了一个导出Excel功能.在导出的时候报错:检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败. 一 ...

  7. False 'Sharing Violation' Xcopy error message

    今天想要将QC的新工具自动拷贝到p4 用户机器上使用,为了避免每次通知大家升级啊!!! 于是,我在程序里调用了bat文件,执行拷贝操作,想在默默的情况下替换更新新版本工具,结果我测试发现没能成功更新版 ...

  8. [Arch] 02. Design principle and Software Pattern

    Ref: 软件设计的七大原则 有时间的话,还需进一步深入理解. Figure, 重要的前五个原则 单一职责原则 (Simple responsibility pinciple SRP) 类的设计趋向于 ...

  9. js 或 且 非

    给定 x=6 以及 y=3,下表解释了逻辑运算符: 运算符 描述 例子 && and (x < 10 && y > 1) 为 true || or (x== ...

  10. linq to xml 增删查改

    一.XML基本概述 XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的场所都有它的身影.Xml是Internet环境 ...