Bonjour, je me questionne
J'aimerais savoir comment on peut appliquer Event.observe sur plusieurs objets alors qu'il faut passer le ID de l'objet comme 1er paramètre et que chaque objet doit avoir un ID différent...
Version imprimable
Le code fourni montre l'utilisation du framework Prototype (évocation de Event.observe plutôt que event.observe), qui permet justement de faciliter les traitements multiples par exemple:
$$('class').each(function(iterateur){iterateur.observe('click', fonction});
A noter que la fonction ne prend pas forcément de paramètres et n'oblige pas les parenthèses. Le $$ correspond à une fonction getElementsByClassName
Ce genre de trucs est plutôt nouveau pour moi alors je vais reformuler pour voir si j'ai bien compris.
$$('class') permet d'appliquer l,observateur d'événement sur tous les objets de classe "class".
l'itérateur, quant à lui, est égal à chacun des ID des objets ciblés.
Est-ce bien ça?
Oui, c'est ça :
Le $$ récupère effectivement tous les éléments de classe "class",
le each fait une boucle sur chacun d'eux
iterateur est la référence à l'élément en cours de traitement
Et dans tout ça, aucun élément n'a besoin d'id !
donc l'itérateur est un objet!
Je sent que ça risque de m'aider à optimiser la taille de mes documents HTML du genre liste de 8000 éléments...
'Event' est indéfini
QU'est-ce qui ne va pas avec ça?Code:
1
2
3
4 Event.observe(window, 'load', function() { $$('cellblank').each(function(obj) {obj.observe('click', check(getPieceFromID(obj)))}); });
Si je met event en minuscule alors j'ai le message
'event' à la valeur 'Null' ou n'est pas un objet.
Je n'ai pas cerné la différence encore entre Event et event mais néanmoins je crois que c'est le 'Event' qu'il faut utiliser dans ce cas selon ce que j'ai pu voir lors de mes recherches.
Non, l'itérateur n'est pas un objet.
$$ est (au sens de prototype) un 'enumerable' un tableau en résumé, même si c'est un peu plus complexe que ça, mais dans ce cas, c'est assimilable à un tableau d'éléments.
itérateur est du coup le pointeur qui marque l'élément que tu traites actuellement.
Imagine un tableau que tu génères via par exemple un getElementsByTagName, il s'agit donc bien d'un tableau d'éléments.
Tu construis ensuite une boucle for i=0 i<getElementsByTagName.length, i++ et pour chaque boucle tu traites la valeur getElementsByTagName[i]...
Dans notre cas, each est ta boucle qui traite tout le tableau et iterateur correspond, avec le même nom d'appel à chaque getElementsByTagName[i].
Je ne suis pas sûr d'avoir été suffisamment clair, donc n'hésites pas à poser des questions sur ce que tu n'as pas compris...
Dans ton appel, ce qui ne vas pas c'est que le dernier argument est censé être un appel à une fonction, pas la fonction elle-même.
Pour appeler Event (un objet du framework Prototype), il faut au préalable avoir chargé Prototype.js.
La différence entre event et Event, c'est que event est un objet natif javascript et en particulier un de ceux qui sont les moins compatibles entre navigateurs.
Le but de prototype dans ce genre de cas étant de donner une syntaxe unique gérant tous les navigateurs. (event.observe pour ff et event.attachEvent pour ie entre autre)
Je crois avoir bien saisi ce que tu viens d'expliquer, je me suis aussi documenté un peu sur getElementsByTagName et sur les "tableaux d'itérateurs". Le problème qui se pose, c'est que je ne sais pas comment l'appliquer au code qui me concerne.
J'ai d'abord testé mon code basé sur du code que j'ai trouvé dans un tuto. et le fait de déclarer la fonction à même les paramètres n'empêche pas le fonctionnement de la dite fonction.
Le code que je poste ici ne fonctionne pas, lorsque je remplace la ligne 5 par test(); j'ai bien un message lors du chargement de la page mais je n'ai pas réussi à faire fonctionner mes observateurs d'événements grâce au code qui est présentement à la ligne 5. Qu'est-ce qui cloche?
Code:
1
2
3
4
5
6
7
8 0 function test() { 1 alert("Test"); 2 } 3 4 Event.observe(window, 'load', function() { 5 $$('cellblank').each(function(pointeur) {pointeur.observe('click', test())}); 6 });
c'est censé faire quoi ça :
$$('cellblank').each(function(pointeur) ??
excuse moi j'aurais du préciser :
function(iterateur){iterateur.observe('click', fonction}
sur ta méthode $$('cellblank') avant de faire ton each , as tu une collection ?
ensuite sur $$('cellblank').each(); essaye de faire un alert avec une propriété de tes objets
puis as tu un objet de type iterateur quelque part ??
tout ces points sont a vérifier pour cerner l'erreur
1 - Ok alors où dois-je spécifier la classe des objets ciblés?
2 - prototype-1.6.0.2.js
3 - J'ignore comment obtenir les propriétés de mes objets puisque je ne sais pas comment les récupérer jusqu'à maintenant. Si je comprends bien, il faudrait d'abord que j'aie déclaré un objet de type itérateur pour pouvoir m'en servir.
4 - Non, je n'ai pas déclaré d'objet de type itérateur... comment faire?
D'accord alors une seule question simple : Comment définit-on un itérateur?
les itérateurs ne sont pas encore pris en comptes par tous les navigateurs , aussi essaye d'utiliser une méthode :
http://webreflection.blogspot.com/20...and-other.html
ouff... ça devient trop compliqué pour moi ces trucs là, alors cet itérateur pourrait servir dans la situation présenté plus haut? ... Hmm je vais peut-être essayer d'improviser quelque chose plus tard dans la journée mais j'avoue que j'ai présentement plein d'outils en main dont la forme et l'utilité me sont plutôt inconnus.