2017-07-05 8 views
2

jqmウィジェットに問題があります。 私はそれを$("div[id=leftSideList]").leftlist('refresh')とすると、うまく動作します。しかし、私はこのthis.eachはjqmウィジェットの関数ではありません。

function _list (key) { 
      switch (key) { 
       case 'leftlist': 
        return $("div[id=leftSideList]").leftlist; 
       case 'rightlist': 
        return $("div[id=leftSideList]").rightlist; 
      } 
     } 

ようconstractionに以下のコードをラップし、it _list('leftlist')('refresh')を使用している場合。 そのは私にエラー捕捉されない例外TypeErrorを返す:this.eachが返される関数(leftlistまたはrightlist)はその範囲を失ったために問題がある機能

答えて

1

ではありません。関数内のthisは、div[id="leftSideList"]要素を参照していないため、エラーになります。

ただしそれは本当に生産の設定のための実行可能な解決策ではない、信じられないほど醜いと、$.proxyを使用することで、この問題を解決することができます

function _list(key) { 
    switch (key) { 
    case 'leftlist': 
     return $.proxy($("div[id=leftSideList]").leftlist, $("div[id=leftSideList]")); 
    case 'rightlist': 
     return $.proxy($("div[id=leftSideList]").rightlist, $("div[id=leftSideList]")); 
    } 
} 

Working example - あなたが提供しなかったとして、これはjQueryの方法で構築された使用しますソースはleftlist()およびrightlist()である。

完全に不要な抽象化を完全に回避することが、より良い解決策になります。選択した要素の一貫性を保つこと以外には、何のメリットもありません。

function _list(key, action) { 
    return $("div[id=leftSideList]")[key](action); 
} 

_list('leftlist', 'refresh') 

最後に、div[id=leftSideList]を使用すると、冗長で遅くなります。代わりに#leftSideListを使用してください。属性セレクタを使用する唯一の理由は、同じid属性を持つ複数の要素がある場合です。これは無効であり、できるだけ早く修正する必要がある問題です。

+1

ありがとうございます!それは優秀な仕事です。私のコードについてのアドバイスをありがとう –

関連する問題