blog

jQueryラップDOMライブラリ

オブジェクトと一緒に呼び出される関数は、その関数の中のthisがその前にあるのと同じオブジェクトになります。例...

Jul 9, 2020 · 8 min. read
シェア

チェーン式

jQueryスタイルとも呼ばれるwindow.jQuery()は、次のようなグローバル関数です。

jQuery(セレクタ)は対応する要素を取得するために使用されますが、それらの要素を返すのではなく、対応する要素を操作するオブジェクトを返します。

準備

これはイメージの配列です

セレクタを受け取り、そのセレクタに基づいていくつかの要素を取得し、その要素を操作するメソッドを持つオブジェクトを返します。

要素を返すべきでしたが、ここではjQueryはオブジェクトを返します。

apiはaddclassというキーとfunctionという値を持つオブジェクトです。

簡略化されたes6は新しい構文を提供します。

addClass() { console.log(elements) }

メソッドの実装

class="test" を持つすべての要素の classList に red を追加します。

続けて、このapiを返せるか、return nullをreturn apiに置き換えてください。

私は一度addclass return apiを呼び出すapiコールを理解することはできません、呼び出しを続行し、その後return

マジック操作

オブジェクトで呼び出される関数は、その関数の中の """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""例えば

obj.fn(p1)  
obj.fn.call(obj,p1) //関数内のthisは obj

上記のthisはapiではないので、thisを返すだけではダメなのでしょうか?""""

結果は変わりません

オブジェクトを宣言し、そのオブジェクトを返した後、そのオブジェクトをただ返すことは可能でしょうか?

  • 要約すると、jQueryのコアとなるアイデアは次のようなものです。
    • 関数を提供し、この関数はセレクタを受け付け、このセレクタを与えると要素を取得しますが、要素を返すわけではありません。
    • .addClassフロントを渡すためにthisを返します。このオブジェクトは、あなたが呼び出しを渡すたびに、連鎖操作の実装は、それが呼び出されるものは問題ではありません、あなただけの省略することもできます。

ルックアップ

jQuery('#xxx')

戻り値は要素ではなく、apiオブジェクトです。

xxxの.red要素を検索します。

jQuery('#xxx').find('.red');

まずfindはセレクタを受け取る関数で、要素からセレクタを見つけなければなりません。

新しい検索要素を格納するために新しい配列を作成し、要素の各項目を繰り返し処理します。

戻り値は配列であり、jQueryは要素を操作するので、それらを連鎖させることはできません。

return this はどうでしょうか?

配列ではなく要素を操作するtestにredが追加されます。
一見うまくいっているように見えますが、新たな問題が発生しました。
api1がtestを操作し、api2がchildを操作し、最後にchildに追加されたapi1がどのように操作するかです!その後、要素を変更すると、同じ要素を使用して、apiオブジェクトを保持するすべての参照に影響を与えます。

jQuery関数をリパッケージし、jQueryは、いくつかの要素を取得することではありません、それは新しいapiを返すように、jQueryにこれらの要素を渡すと、このapiと最後のapiの構造は同じですが、要素を保存することは同じではありません!

jQueryは1つのセレクタしか受け付けません。ここでは配列が与えられているので、オーバーロードされた
  • ここではいくつかのステップを実行します。
    • 1.jQueryが別途構築した新しいapiを取得します。
    • 2. jQueryはセレクタだけでなく、配列も受け取ることができます。
    • 3.オーバーロードは、セレクタならelements要素、配列なら配列がelementsに代入されます。
    • 4.プロモーションのスコープは、もし{}宣言のスコープでのみ{}のスコープで、一度宣言されたconstは変更できません。

簡易コード

次の操作は、終了メソッドを使用して、子の後にテストに戻ります。

このメソッドを達成するために、テスト本体に黄色を追加させることです。
コードの2行を追加するだけで、非常に単純な、非常に曲がりくねった、次の図は、少し理解を助けるために

ここで終了は、apiではなく、配列に置かれ、apiは、配列の

ここに文章を挿入すると、oldApiにもapiがあり、配列を操作することができます。

実行結果

反復と操作

jQuery('#xxx').a(fn); 各要素でfnを実行することで、トラバーサルを進めることができます。

each()は関数を受け取り、要素の各項目に対して反復処理を行い、2つの引数elements[i],iをfnに渡して関数を呼び出します。

.test 内の div を .child 内に出力します。

一旦区切り、addClassとfindをeach()で書き換えます。

  • find

  • addClass

getDad

jQuery('#xxx').parent();

は、配列を操作することができますapiをプリントアウトし、行うには良いの配列ではなく、その上の要素をプリントアウトするprintメソッドを追加します。
3つのテストは、3つのボディに対応することは正しいですが、それを改善し、同じお父さんよりも、印刷するだけです
判断のためのif文を使用して、プッシュのみ、それ以外の場合は何もしない場合です

息子を取得

jQuery('#xxx').children();

子を直接プッシュすると、すべての子の配列ではなく、構造化された配列の配列が得られます。
新しい構文として、省略記号のようなexpandがあります。
(... (node.children[0],node.children[1],node.children[2]...node.children[i]).node.children)===です。

兄弟の取得

jQuery('#xxx').c();

ランキング

jQuery('#xxx').index();

ブラザー

jQuery('#xxx').next();

ゲット・ブラザー

jQuery('#xxx').foo();

window.b = window.foo;

jQueryは長すぎるので、エイリアスを付けてください。

がついているものはすべてjQueryオブジェクトです。

追加

  • $('<div><span>1</span></div>');戻り値は新しい要素ではなく、apiオブジェクトです。
  • $('<div><span>1</span></div>').appendTo(...)appendTo は新しい要素を別の要素に追加します。

document.body を取得します。

$

末っ子の追加

  • $('body').append($('<div>1</div>'));
  • $('body').append('<div>1</div>');もっと簡単

長男を追加

$('dody').prepend(div或$div);

兄を追加

$('#test').after(div或$div);

兄弟を追加

$('#test').before(div或$div);

削除

  • $div.remove()
  • $div.empty()

変更

  • $div.text(?)テキストの内容を読み書きします
  • $div.html(?)html コンテンツを読み書きします
  • $div.attr('title',?)属性の読み書き
  • $div.b({ 'color': 'red' });スタイルの読み書き $div.styleがベター
  • $div.a('blue') / removeClass / hasClass;
  • $div.on('click',fn)
  • $div.b('click', fn);

プロトタイプの使用

最後のステップでは、すべてのオブジェクトを$.prototypeに格納し、各オブジェクトはプロトタイプのアドレスのみを格納すればよいので、メモリを節約できます!

最後のコード

github.com/dom...

Read next

ES6ラーニング・ノート I: letコマンドとconstコマンド

変数が宣言されたとき、初期値は未定義で、値が代入されずに使用され、変数の値は1です。 デフォルトでは const を使用し、変数の値を変更する必要がある場合は let を使用します。

Jul 9, 2020 · 2 min read