Titre mis à jour pour mieux refléter ce que j'essaie de faire. En résumé, il existe différents constructeurs pour différents éléments dom, et ils ne semblent pas tous partager un prototype commun. Je cherche un moyen d'ajouter une propriété de fonction à chaque élément DOM en modifiant ces prototypes, mais je ne suis pas sûr de la façon de les trouver.Modifier les prototypes de tous les éléments DOM possibles
Par exemple, je pourrais faire quelque chose comme ceci:
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, je voudrais le faire sans énumérer tous les éléments HTML unique. Quelqu'un peut-il penser à un meilleur moyen?
(question originale suit)
Goal - faire getElementsByClassName
travailler sur un nœud DOM dans un navigateur.
Cela a déjà été fait (en quelque sorte), mais voici ma photo.
La question que j'ai est, est-il un bon moyen de faire fonctionner cela avec des éléments créés dynamiquement? 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'à présent (modifier - mise à jour par la 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);
}
}
}());
Il fonctionne bien sur le contenu chargé avant le chargement du script, mais de nouveaux éléments dynamiquement créés n'obtenir une méthode getElementsByClassName
. Des suggestions (en plus de setInterval, s'il vous plaît)?
Y a-t-il une raison pour laquelle vous avez décidé de ne pas utiliser un framework tel que jQuery pour cela? Si oui, vous pourriez vouloir dire que dans votre question ou vous obtiendrez beaucoup de "utiliser jQuery!" réponses. –
J'espère qu'il sera évident que je n'ai pas l'intention d'utiliser jQuery pour cela. Doigts croisés. –
@Greg Sans code JQuery dans le code affiché et aucune présence de tag JQuery, je pense que c'est suffisant ... –