jQuery1.6 c新しいアダプタ

7176 ワード

実はjQuery 1.5にはこれがあります.cssHooksか、もっと前のjQueryです.event.Special、またはSizzle.selectors内のより多くのオブジェクト.それらの共通の特徴は多くの関連する関数を含んで、cssHooksはcss属性の取得と設定を専門に処理して、例えばIEのopacity、event.specialは、submit、change、focus、mouseenterなどの特別なイベントとカスタムイベント、Sizzleをロードおよびアンインストールするために使用する.selectorsの中のフィルタと候補セット取得器は言うまでもありません.JSがオブジェクトをテーブルとして検索するのはif文とswitch文よりずっと速いため、加えて、アダプタのこのモードは新しい機能を拡張するのに非常に有利で、jQuery 1のためです.6はそれを大きくしました.
jQueryのattributesモジュール(githubはこのように分割されているが,結合がこんなに高いのはモジュールとは言い難い)では,このようなオブジェクトが3つ追加され,valHooks,attrHooks,propHooks,それぞれvalに対応し,attrとpropの3つの方法がある.propは新たに追加され、jQueryが属性と特性を区別する決意を示しているが、IE 6/7はそれらを区別できないため、attrは基本的にpropの機能をカバーしている.
それぞれの運用を見てみましょう.

// jQuery.style   
      if ( value !== undefined ) {
        //================= ==============
        // If a hook was provided, use that value, otherwise just set the specified value
        if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
          // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
          // Fixes bug #5509
          try {
            style[ name ] = value;
          } catch(e) {}
        }
 
      } else {
        // If a hook was provided get the non-computed value from there
        if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
          return ret;
        }
 
        // Otherwise just get the value from the style object
        return style[ name ];
      }

// jQuery.fn.val   
      if ( !arguments.length ) {
        if ( elem ) {
          hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];

          if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
            return ret;
          }

          return (elem.value || "").replace(rreturn, "");
        }

        return undefined;
      }
     //=============== ============	
      hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
      // If set returns undefined, fall back to normal setting
      if ( !hooks || ("set" in hooks && hooks.set( this, val, "value" ) === undefined) ) {
        this.value = val;
      }


// jQuery.attr   
     hooks = jQuery.attrHooks[ name ] || ( jQuery.nodeName( elem, "form" ) && formHook );

      if ( value !== undefined ) {

        if ( value === null || (value === false && !rspecial.test( name )) ) {
          jQuery.removeAttr( elem, name );
          return undefined;

        } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
          return ret;

        } else {

          // Set boolean attributes to the same name
          if ( value === true && !rspecial.test( name ) ) {
            value = name;
          }

          elem.setAttribute( name, "" + value );
          return value;
        }

      } else {

        if ( hooks && "get" in hooks && notxml ) {
          return hooks.get( elem, name );

        } else {

          ret = elem.getAttribute( name );

          // Non-existent attributes return null, we normalize to undefined
          return ret === null ? undefined : ret;
        }
      }

// jQuery.prop   
           hooks = jQuery.propHooks[ name ];

		if ( value !== undefined ) {
			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
				return ret;

			} else {
				return (elem[ name ] = value);
			}

		} else {
			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== undefined ) {
				return ret;

			} else {
				return elem[ name ];
			}
		}

//jQuery.event.add
      if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
        // Bind the global event handler to the element
        if ( elem.addEventListener ) {
          elem.addEventListener( type, eventHandle, false );

        } else if ( elem.attachEvent ) {
          elem.attachEvent( "on" + type, eventHandle );
        }
      }
//jQuery.event.remove
      if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
        jQuery.removeEvent( elem, type, elemData.handle );
      }

やはり章法があることがわかります.これらのアダプタは、特定のプロパティ、スタイル、イベントを処理するために使用されます.これらのプロパティ、スタイル、イベントは、ブラウザの特徴を嗅ぎ、対応する解決策をアダプタに追加することができます.これらのアダプタがあれば、jQueryはif elseの判定を多く省くことができ、正式版がリリースされたとき、これらの方法がどれだけ速くなったかを喜んで発表することができます.
attr=function(el,name,value){//書き込み方法var set=value!==undefined;if(el.nodeType==1){var notxml=!dom.isXML(el);//HTMLでは、いくつかの属性名をマッピングする必要がありますname=notxml&&dom.props[name]|name;//safariこの値if(name=="selected"&& !dom.support.optSelected ) { var parent = el.parentNode,i = -2 while(i++ ){ parent.selectedIndex; parent = parent.parentNode; } } if (name === "style"&& notxml && !dom.support.attrStyle) { if ( set ) { el.style.cssText = ""+ value; } return el.style.cssText; } if (el[ name ] !== undefined && notxml ) { if ( set ) { try{ if ( value === null ) { el.removeAttribute( name ); } else { el[ name ] = value; } }catch(e){}; }//注意formElement[name]はformElementに等しい.elements[name]は、その管轄下のフォーム要素if(el.tagName====「FORM」&&el.getAttributeNode(name){returnel.getAttributeNode(name).nodeValue;//を返します.フォーム要素とhrefが指定されたリンク要素if(name===="tabIndex"){var attributeNode=el.getAttributeNode("tabIndex");return attributeNode&&attributeNode.specified?attributeNode.value:(dom.isFormElement(el)|el.href)?0:undefined;if(el[name] !== el.getAttribute( name, 2 )){ return el.getAttribute( name, 2 ) } return el[ name ]; } if ( set ) { el.setAttribute( name, ""+ value ); } var attr = el.getAttribute( name ); return attr === null ? undefined : attr; }else if(el.nodeType === 9 || el.setTimeout){ if ( set ) { el[ name ] = value; } return el[ name ]; }else{ return undefined; } }
posted on 2011-04-27 09:18 司徒正美読書(...)コメント(…)編集 コレクション