状況に応じて、ページ全体を表示するか、ページの特定の部分のみを表示する必要があるjQueryコードがいくつかあります。だから私はもともと次のようなコードを持っていました:
var doSearching = wholePage ? $ : $('#portion').find;
var target = doSearching('#someSelector');
いくつかのデバッグの後、これが問題であることに気付き、知識に基づいた推測を行うと、次のような結果になりました。
var doSearching = $;
if (!wholePage)
{
doSearching = function(selector) {return $('#portion').find(selector);}
}
var target = doSearching('#someSelector');
まあ、それは問題なく動作しますが、最初のスニペットが間違っているが、2番目のスニペットは正しいということで何が起こっているのか本当にわかりません。
何が起こっていますか?
何が問題なのかというと、呼び出し中find
の値に依存しているのですが(内部の内容を知るため)、コードでは直接呼び出しているため、呼び出し中はグローバルオブジェクトになります(ルーズモード)。または(厳密モードでは)、それを期待するjQueryインスタンスではありません。this
find
this
undefined
find
あなたはこれを行うことができます:
var portion = wholePage ? null : $('#portion'); // Or: `var portion = wholePage && $('#portion');` if you like
var doSearching = portion ? portion.find.bind(portion) : $;
var target = doSearching('#someSelector');
用途はそれFunction#bind
を呼び出すときことを保証するdoSearching
、find
と呼ばれているthis
から生じたjQueryオブジェクトを参照する$('#portion')
、そしてそれは内を検索するかを知っているので。
これは基本的に「ラッピング」の例を少し簡潔にしたものですが、1つだけではなくすべての引数を通過させます。
Function#bind
はIE8のような古いブラウザにはないES5機能ですが、それらをサポートすることが重要な場合はポリフィルすることができます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加