2011-03-07 3 views
0

J'essaie d'utiliser une fonction JavaScript avec un gestionnaire d'événements pour jQuery, mais elle nécessite un élément d'information supplémentaire. J'ai essayé de l'ajouter à un objet avec les données, et en utilisant this, mais this est nulle quand il est exécuté. Je crois que cela a quelque chose à voir avec la fonction de copie en JavaScript. Comment puis-je transmettre mes informations supplémentaires?Transférer des arguments supplémentaires dans l'événement javascript

<script type="text/javascript"> 
var WIDTH_ATTR = 'initWidth'; 

function resizeHandler(event, ui){ 
    var change = ui.size.width - this.master.attr(WIDTH_ATTR); 
    this.slave.width(slave.attr(WIDTH_ATTR) - change); 
}; 

function splitResize(master, slave, masterHandles){ 
    var s = new SharedResize(master, slave); 
    master.resizable({ handles: masterHandles, resize: s.resizeHandler }); 
} 

function SharedResize(master, slave){ 
    this.master = master; 
    this.slave = slave; 
    this.resizeHandler = resizeHandler; 
    master.attr(WIDTH_ATTR, master.width()); 
    slave.attr(WIDTH_ATTR, slave.width()); 
} 

// initialise plugins 
$(function(){ 
    try { 
     $('ul.sf-menu').superfish(); 
     splitResize($('#Content'), $('#InfoPanel')); 
    }catch(ex){ 
     alert(ex.message); 
    } 
}); 
</script> 

Ce code donne une erreur de

 
Line:13 
'this.master' is null or not an object. 

Lorsqu'un Resize est tentée. Puis-je faire en sorte que ce schéma fonctionne, ou existe-t-il un autre moyen d'associer le gestionnaire d'événements à mes données?

Répondre

1

Essayez ce changement:

function splitResize(master, slave, masterHandles){ 
    var s = new SharedResize(master, slave); 
    master.resizable({ handles: masterHandles, 
     resize: function(event, ui) { s.resizeHandler(event, ui); } }); 
} 

Avec cela, le gestionnaire « redimensionner » sera une fonction anonyme qui, à son tour, appelle votre gestionnaire avec le contexte (l'instance « SharedResize »).

+0

grâce qui fonctionne! J'ai dû ajuster votre fermeture, mais ça m'a assez proche. J'ai mis à jour votre réponse pour refléter mes changements. –

+0

Oh ok bien - je n'étais pas sûr de ce que vous vouliez dire par "les paramètres supplémentaires" chose :-) – Pointy

+0

mon but original était de passer directement 'master' et' slave' directement au gestionnaire de redimensionnement. Je vois comment je pourrais le faire maintenant, en utilisant une fermeture, mais la version de l'objet est déjà écrite. –

1

Vous pouvez faire ce que Pointy suggéré ou vous pouvez le faire:

function SharedResize(master, slave){ 
    this.master = master; 
    this.slave = slave; 
    this.resizeHandler = function(event, ui){ 
     var change = ui.size.width - this.master.attr(WIDTH_ATTR); 
     this.slave.width(slave.attr(WIDTH_ATTR) - change); 
    }; 
    master.attr(WIDTH_ATTR, master.width()); 
    slave.attr(WIDTH_ATTR, slave.width()); 
} 
Questions connexes