2010-06-25 2 views
4

OK Experts jQuery: Donc ... Je viens d'un arrière-plan Prototype.Énumération à l'aide d'un tableau JS dans jQuery

je fais le code suivant tout le temps (ou une variante similaire):

MyObject.prototype.someFunction = function() 
{ 
    var myArray = ["a","b","c"]; 
    myArray.each(function(arrayEntry) 
    { 
     this.printPart(arrayEntry); 
    }, this); 
} 

MyObject.prototype.printPart = function(part) 
{ 
    console.log(part); 
} 

Je suis à la recherche à travers les docs jQuery - Je ne vois pas comment faire cela.

Est-ce possible?

En particulier, je suis intéressé par:

  • Itère javascript tableaux (objets seraient bien aussi).
  • Maintien de la portée. Notez le paramètre "this" final à chaque fonction.

Répondre

5

Vous cherchez $.each(array, function(i, element) { ... })

qui gère aussi les objets, dans ce cas, vous obtenez (key, value) dans les arguments.

modifier — malheureusement il n'y a rien comme prototype de inject, et je manque vraiment que beaucoup. Mais il y a map dans jQuery et c'est un peu comme collect dans Prototype.

modifier à nouveau — Comme le souligne dans @ Nick son commentaire, Prototype et jQuery en désaccord quant à la meilleure façon de traiter la manipulation « ce ». Généralement, jQuery invoque des fonctions de "gestionnaire" avec "ceci" pointant vers l'objet pertinent évident. Le prototype est plus inusité dans la mesure du possible.

+0

+1 - Bien que vous aurez besoin de stocker ce 'this' est (contrairement prototype), étant donné que' $ .each() 'crée une fermeture où' this' est l'élément courant dans son rappel. –

+0

@Nick oui en effet, c'est vrai. Il est vraiment étonnant de constater à quel point les styles de programmation sont différents selon les deux bibliothèques. C'est pourquoi je gémis et roule mes yeux lorsque quelqu'un demande à quel point il sera difficile de "convertir un site de Prototype à jQuery" ... – Pointy

+0

Hé aussi, si ces choses Prototype vous manquent vraiment, jetez un œil à la bibliothèque Underscore.js - Il est fait pour jouer sympa avec jQuery, et il ajoute des trucs sympas. – Pointy

1

Vous n'avez pas forcément besoin de tout faire dans jQuery. Ajoutez simplement une méthode forEach si elle n'existe pas déjà, et utilisez-la à la place. C'était tellement bon que ECMAScript 5ème édition. l'a adopté comme standard (inspiré de la méthode de Prototype), mais tous les navigateurs ne l'ont pas encore fait :). Voici une mise en œuvre par la spécification que vous pouvez utiliser jusqu'à ce que tous les navigateurs ont nativement (taken from MDC):

Modifier: Les dernières versions de Chrome, Safari, Firefox, Opera et déjà l'appui. Pas d'accès IE, désolé.

if (!Array.prototype.forEach) 
{ 
    Array.prototype.forEach = function(fun /*, thisp*/) 
    { 
    var len = this.length >>> 0; 
    if (typeof fun != "function") 
     throw new TypeError(); 

    var thisp = arguments[1]; 
    for (var i = 0; i < len; i++) 
    { 
     if (i in this) 
     fun.call(thisp, this[i], i, this); 
    } 
    }; 
} 

Ensuite, utilisez votre code tel qu'il est (changement each à forEach):

var myArray = ["a","b","c"]; 

myArray.forEach(function(arrayEntry) { 
    this.printPart(arrayEntry); 
}, this);