2010-09-10 10 views
0

Un élément de navigateur possède un attribut onpopupshowing, qui est une chaîne composée de plusieurs instructions javascript.Comment convertir une chaîne javascript en une fonction javascript, en préservant le bon "ceci"?

Je veux "remplacer" ce bit de javascript.

S'il s'agissait d'une fonction, je l'assignerais à une variable, assignerais ma fonction "overriding" à l'attribut element, et (si besoin) j'appellerais la fonction originelle de mon override, comme ceci:

var oldfunc; 
function myoverrridingfunc() { my statement; oldfunc(); my other statement; } 

oldfunc = element.getAttribute("onpopupshowing") 
element.setAttribute("onpopupshowing", myoverrridingfunc); 

mais element.getAttribute ("onpopupshowing") n'est pas une fonction, il est une chaîne.

Je pourrais utiliser l'objet Function pour transformer la chaîne en fonction, mais la chaîne inclut des références à this. Comment puis-je conserver le droit this?

Quelle est la meilleure façon d'intercepter/contourner ce bit de script? Note: ceci ne doit fonctionner que dans Firefox, pas dans une version de java/ECMAscript.

Merci.

Répondre

1
var oldfuncStr = element.getAttribute("onpopupshowing"); 
element.removeAttribute("onpopupshowing"); 
var oldfunc = new Function(oldfuncStr); 
element.addEventListener("popupshowing", function() 
{ 
    myStatement; 
    oldfunc.call(this); 
    otherStatement; 
}, false); 

call est spécifiquement pour la spécification this. J'ai testé dans Firefox, mais avec onclick événement plutôt que onpopupshowing.

+0

Merci pour votre réponse. Quelques questions: le code original a besoin du paramètre d'événement. Est-ce aussi simple que oldfunc.call (this, event)? Aussi, pourquoi addEventListener, plutôt que d'assigner une fonction anonyme à onpopshowing avec setAttribute? Merci pour votre patience. – tpdi

+0

@tpdi, oui, c'est ainsi que les arguments supplémentaires sont passés à 'call'. L'utilisation des attributs on est généralement déconseillée pour plusieurs raisons, y compris la limite d'un par élément. Mais cela fonctionnera probablement bien ici. –

0

Peut-être êtes-vous en train de trop réfléchir. Pourquoi ne pas simplement placer vos instructions JavaScript entre guillemets et les assigner à l'attribut? Si l'attribut attend des instructions JavaScript sous la forme d'une chaîne, je ne m'attendrais pas à ce que l'affectation d'une référence de fonction fonctionne même de toute façon. (le fait-il?)

Questions connexes