4

だから私には難問があり、誰かがすでに答えを持っていることを願っています. jQuery のソースを読んでも、ここで実際に何が起こっているのかまだ理解できていません。

 $('#div')      //returns a jQuery object
 $( $('#div') ) // returns an identical jQuery object
 $( $( $( $( $( $('#div') ) ) ) ) ) // returns the same idential object

プラグイン開発で、文字列セレクターまたは jQuery オブジェクトが予期されるかどうかわからないインスタンスに遭遇しました。これらのインスタンスでは、必要な jQuery オブジェクトが保証されるように、単にセレクターまたは jQuery オブジェクトを jQuery に渡していました。うまく機能しますが、あまりにも魔法のように感じます。私がこれを行うと、実際に何が起こっているのでしょうか? より良い方法はありますか?

4

2 に答える 2

1

基本私は関数で$(...)これがいくつかの基本ケースとして存在すると思います。

  • Arg は String 型で、これを渡し、HTML Dom 要素を検索または作成してから、これを JQuery オブジェクトにカプセル化します。
  • Arg は HTML Dom タイプであり、オブジェクトを JQuery オブジェクトにカプセル化します
  • Arg は JQuery Object で、そのまま返す

しかし、実際にはもっと多くのケースが存在し、その前に大量のデバッグとエラー チェックが行われます。

http://jsapi.info/jquery/1.8.0/jQuery.fn.initで詳細を 参照してください。コードからわかること.

var x = $('#div');
var y = $(x);

xとの内容は等しいが、とyの記憶は等しくない。xy

私たちが持っているとしましょう:

class $ {
  var x;
  $($ t) {
    this.x = t.x
  }
}

これは、私たち全員$が同じ本質的価値を持っていると呼ぶ場合に機能しますが、実際には2つの異なるオブジェクトと同じではありません.

于 2012-09-19T20:48:13.257 に答える
1

この質問に答える前に、 $(...) が配列のようなプロパティを持つ特別なオブジェクトを返すことを理解する必要があります。ドキュメントから:

jQuery ファクトリ関数 $() は、配列の多くのプロパティ (長さ、[] 配列アクセス演算子など) を持つ jQuery オブジェクトを返しますが、配列とまったく同じではなく、配列の構築の一部が欠けています。 -in メソッド (.pop() や .reverse() など)。

それで、これが起こることです。

  1. セレクターのタイプに関係なく、new jQuery.fn.init( selector, context, rootjQuery );が呼び出されるため、新しいオブジェクトが作成され、そのプロパティがこのinit()コンストラクターに設定されます。

  2. $(...) の引数は、空、DOMElement、文字列、または関数 (isFunction 経由) のチェックを受けます

すべてのチェックが失敗し、最終的に次のコードが呼び出されます。

if (selector.selector !== undefined ) {
    this.selector = selector.selector;
    this.context = selector.context;
}
return jQuery.makeArray( selector, this );

関数 makeArray() は、提供されたセレクターを配列のようなオブジェクトに変換します。this.lengthプロパティを設定するだけthis.ret[0]=..., this.ret[1]=...で、jQuery プロトタイプ (別名 ) に基づくオブジェクトのままで、配列のように「感じる」ことができます$.fn。上記のコードは、プロトタイプにthis含まれるまったく新しいオブジェクトであることを思い出してください。$.fnさらに、.selectorプロパティ.contextはオリジナルからこれにコピーされます。

たとえば、.prevObjectプロパティは失われますが、メソッドの連鎖によっては新しいプロパティが追加される可能性があることに注意してください。

全体として、時間とメモリが必要であり.selector、誰かがプラグインに jQuery オブジェクトを渡すタイミングを単純にチェックすることはおそらく理にかなっています。反対に、元のインスタンスと同じ動作をする新しいインスタンスが役立つ場合があります。

于 2012-09-19T21:56:43.927 に答える