11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous !

Je suis en train de coder un framework JS (une sorte de Dojo mais en beaucoup plus light) et j'aimerais pouvoir redéfinir le comportement de certaines fonctions javascript pour éviter des incompatibilités navigateur.

Par exemple : getElementsByName
Sous ie cette fonction ne se comporte pas pareil que sous mozilla.
Je voulais donc la surcharger pour la rendre compatible partout.

J'ai réussi "en partie" en faisant comme ceci :

document.getElementsByName = function(nom)
{
    alert(nom) ;  // Petit debug pour voir si c'est bien appelé

    /* Reste du traitement */
}


La fonction est bien surchargée mais le problème c'est qu'on peut aussi avoir à l'appeler depuis un autre objet que document.

Savez vous si il est possible de la surcharger pour tous les objets javascript l'utilisant ? Je pense par exemple à la surcharger sur un objet dont héritent tous les éléments JS pour que ça se "propage" partout, mais je ne sais pas lequel. J'ai essayé sur Object mais sans résultat.

Quelqu'un aurait une idée ?

Je sais qu'il existe cette solution là :

getElementByName(objet, nom) ;

mais je cherche justement à l'éviter car elle détourne l'utilisation "normale" de la méthode d'objet d'origine.

Merci d'avance à ceux qui participeront au schmilimilimick Smiley cligne
Salut,

A mon avis, tu n'arriveras jamais à trouver une solution robuste et fonctionnant correctement sur la plupart des navigateurs. Il y a néanmoins un message qui propose quelque chose dans le sujet sur les fonctions JS utiles.

Pour ma part, je te déconseille d'essayer de modifier des propriétés d'objets qui sont partagés par tous les scripts d'une page. L'expérience montre que ça peut avoir des effets de bord désastreux.
Oui je vois ce que tu veux dire, j'y ai aussi pensé.

Seulement je me dis que si j'arrive à faire une surcharge comme ça qui va s'appliquer sur tous les types d'objets, si je veux limiter les effets de bord j'ai juste à rajouter un préfix ou un suffix à mon nom de méthode et ça règle le soucis.

En fait là le vrai problème on peut peut être plutôt le tourner comme ça : "comment rajouter une méthode à tous les objets JS" Smiley cligne J'aurais mieux fait de l'exprimer comme ça dès le départ mais bon c'est pas grave, ça a permis d'imager ce que je cherche à faire.

Je vais regarder ton lien de ce pas.
Ca dépend ce que tu entends par "objets js", parce qu'il faut bien distinguer deux choses : les objets correspondant à l'arbre DOM du document et les objets instances des classes du js classique (=String, Number, Date, etc.)

Le truc c'est que Object.prototype ne fonctionne pas sur les objets provenant de l'arbre DOM (enfin je ne crois pas)

Pour l'arbre DOM, il y a HTMLElement... et il faut utiliser une astuce pour que ça marche avec IE (cf. scripts utiles)
Sylvain71 a écrit :
Bonjour à tous !

Je suis en train de coder un framework JS (une sorte de Dojo mais en beaucoup plus light) et j'aimerais pouvoir redéfinir le comportement de certaines fonctions javascript pour éviter des incompatibilités navigateur.

Par exemple : getElementsByName
Sous ie cette fonction ne se comporte pas pareil que sous mozilla.
Je voulais donc la surcharger pour la rendre compatible partout.

J'ai réussi "en partie" en faisant comme ceci :

document.getElementsByName = function(nom)
{
    alert(nom) ;  // Petit debug pour voir si c'est bien appelé

    /* Reste du traitement */
}


La fonction est bien surchargée mais le problème c'est qu'on peut aussi avoir à l'appeler depuis un autre objet que document.

Savez vous si il est possible de la surcharger pour tous les objets javascript l'utilisant ? Je pense par exemple à la surcharger sur un objet dont héritent tous les éléments JS pour que ça se "propage" partout, mais je ne sais pas lequel. J'ai essayé sur Object mais sans résultat.

Quelqu'un aurait une idée ?

Je sais qu'il existe cette solution là :

getElementByName(objet, nom) ;

mais je cherche justement à l'éviter car elle détourne l'utilisation "normale" de la méthode d'objet d'origine.

Merci d'avance à ceux qui participeront au schmilimilimick Smiley cligne
Yop,
Tu vises quoi comme rapport poids/fonctionnalités ?
Sinon il existe toujours la technique de la brute-force...

var tab = document.getElementsByTagName("*");
for (var i=0; i < tab.length; i++) {
//...
}

Bonjour les pages qui rament...
Finalement j'ai lâché l'affaire, en voulant résoudre un problème de compatibilité ça m'en entrainait plein d'autres Smiley cligne

J'ai utilisé la solution du paramètre passé en plus :
getElementByName(objet, nom) ;


C'est beaucoup moins élégant mais c'est plus "passe partout".