3

これは私のコードです:

<div class='a'>
  <div class='b'>Test</div>
</div>

$(['.b']).each(function () {
  console.log($('.a').find(this).text()); // Expecting to print "Test"
});

console.logが印刷されることを期待していますTestが、そうではありません。これは jQuery のバグですか?

4

3 に答える 3

6

ここにはいくつかの問題があります。

  1. 配列を使用して jQuery を呼び出すと (あなたが行っているように)、jQuery はそれが DOM 要素の配列であることを期待します。
  2. を使用する場合は、汎用オブジェクトまたは配列を反復処理する静的バージョン$.eachを使用してください。

これらの両方が言われても、プリミティブ値を含む配列を使用することにはまだ問題があります。$.each次のコードは、あなたが見たのと同じ問題を示しています。

$.each([".b"], function () {
    console.log($('.a').find(this).text()); // Expecting to print "Test"
});

のコールバック関数内.eachthisは、String オブジェクトがあり、文字列プリミティブではありません。これを理解するには、内部で何.eachが行われているかを確認する必要があります。

for (; i < length;) {
    if (callback.apply(object[i++], args) === false) { // <----
        break;
    }
}

重要なのは への呼び出しapplyです。ECMAScript 仕様によると、プリミティブ値が に渡されるapplyと、値のtoObjectメソッドが呼び出されます。

thisArg が null または未定義の場合、呼び出された関数にはグローバル オブジェクトが this 値として渡されます。それ以外の場合、呼び出された関数は ToObject(thisArg)として this 値として渡されます。

これは、コードが機能しなかった理由を説明しています.String.findオブジェクトではなく、文字列プリミティブを期待しています。

これが、プリミティブ値の使用について実際に言及しているドキュメントの理由です。$.eachthis

( this キーワードを使用して値にアクセスすることもできますが、Javascript は、 this 値が単純な文字列または数値であっても、常にオブジェクトとしてラップします。 )

したがって、コードの問題を解決する方法はelement、コールバック関数に渡される引数を利用することです。

$.each([".b"], function (_, item) {
    console.log($('.a').find(item).text()); // Expecting to print "Test"
});
于 2013-01-12T16:31:26.933 に答える
2

this配列をループするときは、inside each を使用しないでください。オブジェクトまたは要素のコレクションでは正常に機能しますが、配列では失敗します。

の 2 番目の引数を使用eachして配列要素にアクセスします

$(['.b']).each(function (index, item) {
  console.log($('.a').find(item).text()); // Expecting to print "Test"
});

デモhttp://jsfiddle.net/KbuZK/

于 2013-01-12T16:12:26.487 に答える
1

それは、あなたが JavaScript の暗黒面にいるからです。

JavaScript では、実際に何にバインドされていても、this常にObjectso thatになります。プリミティブ文字列がコンテキストにバインドされている場合でも(これは を与えると予想されます)、実際にはオブジェクトであり. この動作の詳細な説明は次のとおりです。typeof this === "object"thisthistypeof this === "string"thisStringtypeof this === "object"

非オブジェクトの配列を反復処理するときは、コールバック関数の 2 番目の引数を値として使用する必要があります。

$(['.b']).each(function (index, value) {
  console.log($('.a').find(value).text()); // Expecting to print "Test"
});
于 2013-01-12T16:12:48.120 に答える