検索
ホームページデータベースmysql チュートリアルjquery源码解析:proxy,access,swap,isArraylike详解

jquery源码解析:proxy,access,swap,isArraylike详解

Jun 07, 2016 pm 03:38 PM
accessjqueryproxyswapソースコード解析する

jQuery的工具方法,其实就是静态方法,源码里面就是通过extend方法,把这些工具方法添加给jQuery构造函数的。 jQuery.extend({ ...... guid: 1, //唯一标识符,跟事件有关。举个例子:function show(){alert(this);}, $("#input1").click(show),$("#input2

jQuery的工具方法,其实就是静态方法,源码里面就是通过extend方法,把这些工具方法添加给jQuery构造函数的。

jQuery.extend({ 

  ...... 

  guid: 1,    

  //唯一标识符,跟事件有关。举个例子:function show(){alert(this);}, $("#input1").click(show),$("#input2").click(function(){$("#input1").off()}),这里的show方法是事件方法,所以通过off取消掉事件绑定,可以很容易找到事件方法show。但是如果把 $("#input1").click(show)改成 $("#input1").click($.proxy(show,window)),这时show不是事件方法,而是普通方法,那么通过off取消的时候,它是怎么找到这个普通方法show的,其实就是通过guid,因为guid会累加,所以是唯一的,因此可以找到。请看下个方法就知道详情了。

  proxy: function( fn, context ) {    

    //改变方法(函数)执行的this指向。举例:$.proxy(show,document),想给show传参的话,有两种方式:var fn = $.proxy(show,document,1,2);fn(3,4)。最终show执行时就会变成show(1,2,3,4),proxy返回一个函数,调用fn时,就会执行show方法。
    var tmp, args, proxy;

    if ( typeof context === "string" ) {   //这里处理特殊调用情况,比如:$.proxy(obj,"show")(正常写法$.proxy(obj.show,obj)),show方法执行时,this指向的obj,并且show是obj的属性方法.var obj = { show: function(){}}。
      tmp = fn[ context ];
      context = fn;
      fn = tmp;
    }

    if ( !jQuery.isFunction( fn ) ) {
      return undefined;
    }

    args = core_slice.call( arguments, 2 );  //传入的参数,相当于例子的[1,2]
    proxy = function() {
      return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );  //把[3,4]和[1,2]合并成[1,2,3,4]
    };

    proxy.guid = fn.guid = fn.guid || jQuery.guid++;

    //第一次时,fn.guid(show.guid)是undefined,proxy.guid = fn.guid = 1,show.guid =1, 

    //function() {return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) )}.guid=1,唯一标识,取消绑定时,可以用到。

    return proxy;
  },

  //$().css(),$().attr(),通过参数的不同,实现get/set。参数的个数,以及参数的类型。$("div").css("width"),获得第一个div元素的width,$("div").css("width",100)设置所有的div元素的width。$("div").css({width:100,height:200}),也是设置所有的div元素,尽管只有一个参数,但是类型不一样。JQuery中有很多这种方法,所以统一用access实现。

  access: function( elems, fn, key, value, chainable, emptyGet, raw ) {

    //elems操作的元素,可能是一个集合。fn是一个回调函数(有区别的在回调函数中处理,比如,css设置样式,attr设置属性)。key和value就是属性名和属性值。chainable为true,设置,为false就获取。
    var i = 0,
      length = elems.length,
      bulk = key == null;

    if ( jQuery.type( key ) === "object" ) {//处理这种类型$("div").css({width:100,height:200})
      chainable = true;
      for ( i in key ) {
        jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
      }

    }

    else if ( value !== undefined ) {   //处理这种$("div").css("width",100)
      chainable = true;

      if ( !jQuery.isFunction( value ) ) {
        raw = true;    //字符串(数字)时
      }

      if ( bulk ) {   //如果没有key值
        if ( raw ) {   //如果value是字符串(数字)
          fn.call( elems, value );   //调用回调方法
          fn = null;   //把回调方法赋为空

        }

        else {     //如果是函数,这里面的不用深入理解
          bulk = fn;
          fn = function( elem, key, value ) {
            return bulk.call( jQuery( elem ), value );
          };
        }
      }

      if ( fn ) {    //如果没有key值,并且value是字符串(数字),这里就为null,不会执行
        for ( ; i           fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
        }
      }
    }

    return chainable ?     //获取时,chainable为false
        elems :     //设置时,chainable为true,直接返回元素,进行后续的链式操作

          bulk ?   
            fn.call( elems ) :  //没有key值时,就回调
              length ? fn( elems[0], key ) : emptyGet;  //有key值时,判断元素有没有元素,有的话就获取第一个元素的key值(属性名的值),没有元素的话,就返回emptyGet。
  },

  now: Date.now,  //当前时间距离1970年的毫秒数,相当于(new Date()).getTime()

  //以下方法是处理这种情况的:

  //

$("#div1").get(0).offsetWidth取到的是0,因为它是display:none,不存在DOM树中。$("#div1").width()取到的是100,为啥jQuery可以。因为jQuery会对display:none的元素进行处理,变成

  swap: function( elem, options, callback, args ) {  //css的转换,内部使用
    var ret, name,
      old = {};

    for ( name in options ) {    

      //保存老样式,插入新样式。这里假设options={width:100px;height:100px;background:red;display:block;visibility:hidden;position:absolute}

      //elem.>
      old[ name ] = elem.style[ name ]; 
      elem.style[ name ] = options[ name ];
    }

    ret = callback.apply( elem, args || [] );  

    //通过插入的新样式来获取元素的css值,callback = function(args){ if(args不是[]) return this[args]},args= offsetWidth;

    for ( name in options ) {       //恢复老样式
      elem.style[ name ] = old[ name ];
    }

    return ret;
  }

  ......

})

最后讲一下这个方法:

function isArraylike( obj ) {//判断是否是数组,类数组,带length的json,是的话就返回真
  var length = obj.length,
  type = jQuery.type( obj );

  if ( jQuery.isWindow( obj ) ) {  //担心window对象有length属性
    return false;
  }

  if ( obj.nodeType === 1 && length ) {  

  //元素节点对象,并且有length属性,返回真。document.getElementsByTagName("div")和body.childNodes都不是这种情况。可能用于内部调用,这里如果有谁知道的,可以告诉我。

    return true;
  }

  return type === "array" || type !== "function" &&   //不能是函数,因为函数也可能有length属性
    ( length === 0 ||typeof length === "number" && length > 0 && ( length - 1 ) in obj );

    //typeof length === "number" && length > 0 && ( length - 1 ) in obj )处理{0:"a",1:"b",length:2}这种情况。length === 0处理arguments为空的时候,就是不传入函数任何数据,这时函数中的arguments的length为0,但是是类数组。document.getElementsByTagName("div")和body.childNodes也是类数组。
}

 

 

加油!

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
MySQLで利用可能なさまざまなストレージエンジンは何ですか?MySQLで利用可能なさまざまなストレージエンジンは何ですか?Apr 26, 2025 am 12:27 AM

mysqloffersvariousstorageEngines、それぞれのfordifferentusecases:1)Innodbisidealforapplicationsingingidcomplianceanceandhighconcurrency、support transactions andforeignkeys.2)myisamisbestforread-havyworkloads、transactionsupptort.3)

MySQLの一般的なセキュリティの脆弱性は何ですか?MySQLの一般的なセキュリティの脆弱性は何ですか?Apr 26, 2025 am 12:27 AM

MySQLの一般的なセキュリティの脆弱性には、SQLインジェクション、弱いパスワード、不適切な許可構成、および非合事ソフトウェアが含まれます。 1。SQL注射は、前処理ステートメントを使用することで防ぐことができます。 2。強力なパスワード戦略を強制的に使用することにより、弱いパスワードを回避できます。 3.不適切な許可構成は、ユーザー許可の定期的なレビューと調整を通じて解決できます。 4.未使用のソフトウェアは、MySQLバージョンを定期的にチェックして更新することでパッチを適用できます。

MySQLでスロークエリをどのように識別できますか?MySQLでスロークエリをどのように識別できますか?Apr 26, 2025 am 12:15 AM

MySQLの遅いクエリを識別することは、遅いクエリログを有効にし、しきい値を設定することで実現できます。 1.スロークエリログを有効にし、しきい値を設定します。 2.スロークエリログファイルを表示および分析し、詳細な分析のためにMySQLDumpSlowやPT-Query-Digestなどのツールを使用します。 3.インデックスの最適化、クエリの書き換え、およびselect*の使用を回避することで、遅いクエリの最適化を実現できます。

MySQLサーバーの健康とパフォーマンスをどのように監視できますか?MySQLサーバーの健康とパフォーマンスをどのように監視できますか?Apr 26, 2025 am 12:15 AM

MySQLサーバーの健康とパフォーマンスを監視するには、システムの健康、パフォーマンスメトリック、クエリの実行に注意する必要があります。 1)システムの健康を監視する:Top、HTOP、またはShowGlobalStatusコマンドを使用して、CPU、メモリ、ディスクI/O、ネットワークアクティビティを表示します。 2)パフォーマンスインジケーターの追跡:クエリ番号あたりのクエリ番号、平均クエリ時間、キャッシュヒット率などのキーインジケーターを監視します。 3)クエリ実行の最適化を確保します:スロークエリログを有効にし、実行時間が設定されたしきい値を超えるクエリを記録し、最適化します。

mysqlとmariadbを比較対照します。mysqlとmariadbを比較対照します。Apr 26, 2025 am 12:08 AM

MySQLとMariaDBの主な違いは、パフォーマンス、機能、ライセンスです。1。MySQLはOracleによって開発され、Mariadbはフォークです。 2. Mariadbは、高負荷環境でパフォーマンスを向上させる可能性があります。 3.MariaDBは、より多くのストレージエンジンと機能を提供します。 4.MySQLは二重ライセンスを採用し、MariaDBは完全にオープンソースです。既存のインフラストラクチャ、パフォーマンス要件、機能要件、およびライセンスコストを選択する際に考慮する必要があります。

MySQLのライセンスは、他のデータベースシステムと比較してどうですか?MySQLのライセンスは、他のデータベースシステムと比較してどうですか?Apr 25, 2025 am 12:26 AM

MySQLはGPLライセンスを使用します。 1)GPLライセンスにより、MySQLの無料使用、変更、分布が可能になりますが、変更された分布はGPLに準拠する必要があります。 2)商業ライセンスは、公的な変更を回避でき、機密性を必要とする商用アプリケーションに適しています。

MyisamよりもInnodbを選びますか?MyisamよりもInnodbを選びますか?Apr 25, 2025 am 12:22 AM

Myisamの代わりにInnoDBを選択する場合の状況には、次のものが含まれます。1)トランザクションサポート、2)高い並行性環境、3)高いデータの一貫性。逆に、Myisamを選択する際の状況には、1)主に操作を読む、2)トランザクションサポートは必要ありません。 INNODBは、eコマースプラットフォームなどの高いデータの一貫性とトランザクション処理を必要とするアプリケーションに適していますが、Myisamはブログシステムなどの読み取り集約型およびトランザクションのないアプリケーションに適しています。

MySQLの外国キーの目的を説明してください。MySQLの外国キーの目的を説明してください。Apr 25, 2025 am 12:17 AM

MySQLでは、外部キーの機能は、テーブル間の関係を確立し、データの一貫性と整合性を確保することです。外部キーは、参照整合性チェックとカスケード操作を通じてデータの有効性を維持します。パフォーマンスの最適化に注意し、それらを使用するときに一般的なエラーを避けてください。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター