2017-07-05 3 views
2

J'ai des problèmes avec mon widget jqm. Quand je fais cela $("div[id=leftSideList]").leftlist('refresh'), son travail bien. Mais, si j'enveloppe du code ci-dessous sur constraction comme celui-cithis.each n'est pas une fonction dans le widget jqm

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

et utiliser it _list('leftlist')('refresh'). Son retour me erreur Uncaught TypeError: this.each n'est pas une fonction

Répondre

1

La question est parce que la fonction de retour (ou leftlistrightlist) a perdu son champ d'application; this dans la fonction ne fait plus référence à l'élément div[id="leftSideList"], d'où l'erreur.

Vous pouvez résoudre ce problème en utilisant $.proxy, mais il est incroyablement laid et pas vraiment une solution viable pour un environnement de production:

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 - Notez que cette utilise construit dans les méthodes jQuery que vous n'avez pas fourni la source de leftlist() et rightlist().

Une meilleure solution serait d'éviter complètement cette abstraction totalement inutile. Il ne vous offre aucun avantage, autre que de garder l'élément sélectionné cohérent.

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

_list('leftlist', 'refresh') 

Notons enfin que l'utilisation div[id=leftSideList] est redondant et lent. Vous pouvez simplement utiliser #leftSideList à la place. La seule raison pour laquelle vous utiliserez le sélecteur d'attribut est si vous avez plusieurs éléments avec le même attribut id - qui est invalide et un problème que vous devez corriger dès que possible.

+1

Merci beaucoup! Cela fonctionne exelent. Et merci de nous conseiller sur mon code –