Modifier les prototypes de tous les éléments DOM possibles

Titre mis à jour pour mieux refléter ce que j'essaie de faire.

En bref, il existe différents constructeurs pour différents éléments dom, et ils ne semblent pas tous partager un prototype commun. Je recherche un moyen d'ajouter une propriété de fonction à chaque élément DOM en modifiant ces prototypes, mais je ne sais pas comment les trouver.

Par exemple, je pourrais faire quelque chose comme ça:

function enhanceDom (tagNames, methods) { var i=-1, tagName; while (tagName=tagNames[++i]) { var tag=document.createElement(tagName); if (!(tag && tag.constructor)) continue; for (var methodName in methods) { tag.constructor.prototype[methodName]=methods[methodName]; } } } var thingsToEnhance = ['a','abbr','acronym','address'/* on and on... */]; enhance(thingsToEnhance, { doStuff : function(){ /* ... */ }, doOtherStuff : function(){ /* ... */ } /* ... */ }); 

Bien sûr, j'aimerais le faire sans lister tous les éléments html. Quelqu'un peut-il penser à une meilleure façon?

(La question originale suit)

Objectif: faire que getElementsByClassName fonctionne sur n'importe quel nœud DOM dans n'importe quel navigateur.

Il a été fait avant (sorte de), mais voici mon coup dessus.

La question que j'ai, est-ce qu'il existe un bon moyen de faire fonctionner cela avec des éléments dynamiquement créés? Il semble que les éléments HTML DOM ne partagent pas un prototype prévisible commun où getElementsByClassName pourrait être ajouté … Ou est-ce que je manque quelque chose?

Voici ce que j'ai jusqu'ici ( modifier – mis à jour par discussion ).

 (function(){ var fn = 'getElementsByClassName'; // var fn = 'gEBCN'; // test if (typeof document[fn] != 'undefined') return; // This is the part I want to get rid of... // Can I add getByClass to a single prototype // somewhere below Object and be done with it? document[fn]=getByClass; withDescendants(document, function (node) { node[fn]=getByClass; }); function withDescendants (node, callback, userdata) { var nodes = node.getElementsByTagName('*'), i=-1; while (node=nodes[++i]) { callback(node, userdata); } return userdata; } function getByClass (className) { return withDescendants(this, getMatches, { query:new RegExp('(^|\\s+)' + className + '($|\\s+)'), found:[] }).found; } function getMatches (node, data) { if (node.className && node.className.match(data.query)) { data.found.push(node); } } }()); 

Cela fonctionne bien sur le contenu chargé avant le chargement du script, mais de nouveaux éléments créés dynamiquement n'obtiendront pas une méthode getElementsByClassName . Toute suggestion (outre setInterval, s'il vous plaît)?

Je pense que ce que vous voulez peut être réalisé en prototypant l' interface Element , comme

 Element.prototype.getElementsByClassName = function() { /* do some magic stuff */ }; 

Mais ne faites pas cela . Cela ne fonctionne pas de manière fiable dans tous les principaux navigateurs.

Ce que vous faites dans l'exemple dans votre question n'est pas recommandé aussi. Vous êtes en train d'étendre les objets hôtes. Encore une fois, ne faites pas cela .

Vous tomberez exactement dans les pièges auxquels se heurtait Prototype .

Je ne veux pas simplement copier l'article de Kangax, alors lisez ce qui ne va pas avec l'extension du DOM .

Pourquoi voulez-vous cela en premier lieu? Quel est votre but?