2010-12-13 27 views
0

Grâce à l'aide de @Dimitar Christoff, j'ai réussi à résoudre certains problèmes d'Ajax. A savoir en saisissant uniquement des éléments spécifiques par ID à partir d'une page chargée. Dans l'exemple ci-dessous, ces éléments prédéterminés sont ajoutés à un tableau panels et sont ensuite accessibles en appelant panel[0], panel[1], etc. Le problème est que ces éléments ne peuvent pas toujours être ajoutés au tableau dans le même ordre, donc dans un cas panel[0] peut être effectivement <div id="panel_2"></div> et dans les autres cas, il peut être <div id="panel_1"></div>.Utiliser "filter" pour ajouter des éléments sur une page à un tableau par nom au lieu de l'identifiant

Comment pouvez-vous changer le retour pour ajouter l'élément par nom afin que je puisse appeler à la place panel['panel_0']?

Voici l'exemple: http://jsfiddle.net/brandondurham/SPUFe/

+0

Quelle boîte à outils Javascript utilisez-vous? (Par exemple, quelle est la valeur de $$ dans votre exemple de code?) –

+0

Désolé. Pensé que l'étiquette suffirait. En utilisant Mootools. –

Répondre

1

Eh bien, je ne sais pas la boîte à outils Javascript vous travaillez avec, mais je devine que si elle a une fonction de filtre, il a probablement aussi une diminution de la fonction. Voici un exemple de la façon dont vous pourriez réduire un tableau à un objet (qui peut ensuite être utilisé comme demandé):

var panelsMap = panels.reduce(function (map, el, index, array) { 
    map[el.get("id")] = el; 
    return map; 
}, {}); 

Sinon, vous pouvez faire le travail à l'intérieur de la boucle d'origine. Dans ce cas, cela n'a aucun sens d'utiliser "filter", mais vous pourriez probablement le remplacer par forEach ou quelque chose de similaire. Voici un exemple (qui continue à utiliser le filtre):

onComplete: function() { 
    var weLike = ["panel_1", "panel_2", "panel_3"]; 
    var panels = {}; 
    $$(this.response.elements).filter(function(el) { 
     if ($(el) && el.get && weLike.contains(el.get("id"))) { 
      panels[el.get("id")] = el; 
     } 
     return false; 
    }); 

    alert(panels); 
} 
+0

Parfait! Je vous remercie! –

+0

Avec l'option # 2 ne devrait-il pas être 'var panels = [];'? En outre, après l'exécution du filtre si j'alerte 'panels.length' il alerte 0. –

+0

Non, vous voulez un objet (var panels = {}), pas un tableau (var panels = []). Vous avez dit que vous voulez pouvoir utiliser les panneaux d'expression ['panel_0'], n'est-ce pas? C'est comme ça que vous utiliseriez un objet. S'il s'agissait d'un tableau, vous utiliseriez des indices entiers non négatifs comme des panneaux [0]. En outre, si vous voulez connaître le nombre de mappages, en supposant que vous êtes dans un environnement ECMAScript 5, vous pouvez utiliser l'expression Object.keys (panels) .length –