Bonjour,
Il y a certaines fonctions que j'aimerais bien essayé de "prototyper", quand il s'agit d'agir sur une Fonction, un String, un Array ou un Number, il n' y a pas de problème particulier, en revanche quand il s'agit d'un objet de type Element tout ce complique.
Imaginons un prototype de la fonction addEvent (dont l'utilité peut être mise en doute, mais ce n'est pas le sujet), normalement il suffirais de faire ça :
Mais cela ne marchera pas complètement parce qu' Internet Explorer ne reconnais pas le type d'objet Element.
Donc ce que je cherche c'est une manière de contourner le problème, pour l'instant la seul solution que j'ai trouvé est la suivante :
Il faut tout d'abord créer une fonction Element pour les navigateurs qui ne reconnaissent pas cet Element :
jusque là rien de méchant, là ou je trouve que cela devient confus c'est que je suis obligé de passer par une fonction pour pouvoir appliquer mon prototype a mon élément (une fonction dollar par exemple) :
Ensuite seulement je peux utiliser ma fonction:
C'est, il faut bien l'avouer, un peu foireux, tout d'abord parce que l'intérêt que ce soit au niveau de la sintaxe comme au niveau des performance (qui sont les deux intérêts principaux du prototypage) ici sont quasi nul
Effectivement entre $(el).addEvent('click',function(){}) el addEvent(el,'click',function(){}) je préfère la deuxième solution, même si entre $('id_name').addEvent('click',function(){}) et addEvent($('id_name'),'click',function(){}) ça se discute.
La plupart des frameworks le font avec une méthode un peu similaire a celle décrite plus haut mais plus beaucoup plus complète qui permet notamment d'appliquer les prototypes sur window et document, je pourrais m'en inspirer mais c'est d'un niveau d'abstraction qui me dépasse bien souvent. Dans le cas d'un framework c'est justifié par le fait que les fonctions qui sont utilisés pour résoudre le problème sont en partie utilisées par d'autre fonctions.
Donc la question est, existe t'il une solution simple ou bien il est tout simplement inutile de "prototyper" les fonctions sur les objets de type Element?
<edit>
Je viens de me rendre compte à la relecture, que mon exemple n'est pas très approprié, en effet le addEventListener natif prenant comme premier paramètre l'élément il n'est pas trés logique d'en changer le fonctionnement, par contre imaginons des fonctions de traitement de classes prototypées ce serait sympa. Par exemple El.addClass('nomdelaclass') ...
</edit>
Modifié par matmat (18 Apr 2008 - 18:03)
Il y a certaines fonctions que j'aimerais bien essayé de "prototyper", quand il s'agit d'agir sur une Fonction, un String, un Array ou un Number, il n' y a pas de problème particulier, en revanche quand il s'agit d'un objet de type Element tout ce complique.
Imaginons un prototype de la fonction addEvent (dont l'utilité peut être mise en doute, mais ce n'est pas le sujet), normalement il suffirais de faire ça :
Element.prototype.addEvent(type, fn){
if(this.addEventListener){
this.addEventListener(type, fn, false)
}else if(this.attachEvent){
this.attachEvent('on'+type, fn):
}else{
this['on'+type] = fn;
}
}
Mais cela ne marchera pas complètement parce qu' Internet Explorer ne reconnais pas le type d'objet Element.
Donc ce que je cherche c'est une manière de contourner le problème, pour l'instant la seul solution que j'ai trouvé est la suivante :
Il faut tout d'abord créer une fonction Element pour les navigateurs qui ne reconnaissent pas cet Element :
if(!window["Element"]) Element = function() {};
jusque là rien de méchant, là ou je trouve que cela devient confus c'est que je suis obligé de passer par une fonction pour pouvoir appliquer mon prototype a mon élément (une fonction dollar par exemple) :
function $(el){
var element;
if(typeof el == 'string'){
element = (document.getElementById(el))? document.getElementById(el) : null;
}else{
element = (el)? el : null;
}
if(element){
for (var property in Element.prototype) {
if (!(property in element)) element[property] = Element.prototype[property];
}
}
return element;
};
Ensuite seulement je peux utiliser ma fonction:
$(el).addEvent('click',function(){});
C'est, il faut bien l'avouer, un peu foireux, tout d'abord parce que l'intérêt que ce soit au niveau de la sintaxe comme au niveau des performance (qui sont les deux intérêts principaux du prototypage) ici sont quasi nul
Effectivement entre $(el).addEvent('click',function(){}) el addEvent(el,'click',function(){}) je préfère la deuxième solution, même si entre $('id_name').addEvent('click',function(){}) et addEvent($('id_name'),'click',function(){}) ça se discute.
La plupart des frameworks le font avec une méthode un peu similaire a celle décrite plus haut mais plus beaucoup plus complète qui permet notamment d'appliquer les prototypes sur window et document, je pourrais m'en inspirer mais c'est d'un niveau d'abstraction qui me dépasse bien souvent. Dans le cas d'un framework c'est justifié par le fait que les fonctions qui sont utilisés pour résoudre le problème sont en partie utilisées par d'autre fonctions.
Donc la question est, existe t'il une solution simple ou bien il est tout simplement inutile de "prototyper" les fonctions sur les objets de type Element?
<edit>
Je viens de me rendre compte à la relecture, que mon exemple n'est pas très approprié, en effet le addEventListener natif prenant comme premier paramètre l'élément il n'est pas trés logique d'en changer le fonctionnement, par contre imaginons des fonctions de traitement de classes prototypées ce serait sympa. Par exemple El.addClass('nomdelaclass') ...
</edit>
Modifié par matmat (18 Apr 2008 - 18:03)