2012-02-16 3 views
0

J'ai un fichier javascript avec des classes qui contiennent des fonctions de méthode. Je me demandais comment procéder pour appeler une méthode d'instance de classe à partir d'un événement onClick. Comment appeler la fonction DisplayData sur classInstance à partir d'un événement onClick? Par exemple:Méthode d'instance de classe d'appel onclick javascript

<button onClick="classInstance.DisplayData()">Click Me!</button> 

Ce qui ne fonctionne pas, mais m'aide à clarifier ce que je cherche à faire. Aucune suggestion?

+0

Si vous voulez le faire correctement et éviter de causer un gâchis, ne pas utiliser les gestionnaires d'événements en ligne ('onclick' et amis). Ils n'appartiennent tout simplement pas à votre code HTML. En savoir plus sur 'addEventListener()' et tout votre code deviendra beaucoup plus propre et gérable. – kapa

Répondre

4

http://jsfiddle.net/EyMCQ/1/

Comme vous remarquez, cela ne fonctionne pas, parce que le var vous avez déclaré, reste dans le cadre du bloc d'exécution. Si vous supprimez la variable var, cela fonctionnera car classInstance est maintenant dans la portée globale.

function MyClass() { 
    this.instanceData = "Display Me"; 

    this.DisplayData = function() { 
     alert(this.instanceData); 
    } 
} 

classInstance = new MyClass();​ 

et l'appeler comme ceci:

<button onClick="classInstance.DisplayData.call(classInstance)">Click Me!</button>​ 

http://jsfiddle.net/EyMCQ/2/

+2

La déclaration de classInstance sans le mot-clé var ne fonctionne pas. À moins que vous ne parliez d'utiliser une fonction globale pour afficher le texte, ce que je ne veux pas faire. Il doit provenir d'une instance de classe, de sorte que le projet peut encore être facilement géré lorsqu'il grandit à plus grande échelle. –

+0

Dans ce cas, vous pouvez jeter un oeil à l'aide d'une bibliothèque javascript pour vous aider à attacher des événements en interrogeant le dom et en attribuant un comportement à l'intérieur de la classe. Le bloc de code que vous avez écrit convient bien à la lecture en JavaScript, mais il est recommandé de séparer la logique de comportement de la mise en page (MVC). Donc, si vous deviez utiliser jQuery en tant que bibliothèque, vous ajouteriez une classe à votre élément en cours de clics, l'interrogeriez en utilisant

$('.myClass').click(function() { alert('hello');});
sankargorthi

+0

Cette réponse présente plusieurs problèmes: 1. Vous préconisez de compter sur * [The Horror of Implicit Globals] (http://blog.niftysnippets.org/2008/03/horror-of-implicit-globals.html) *, ce qui est toujours une mauvaise idée. Si vous voulez créer un global, faites le * explicitement * ('window.classInstance = ...'). 2. Il n'y a absolument aucune raison pour 'classInstance.DisplayData.call (classInstance)'; c'est ** exactement ** la même chose que 'classInstance.DisplayData()'. 3. Cela ne tient pas compte du fait que le code de l'OP utilise 'document.write', ce qui ne fonctionnera pas (comme ils le veulent) après le chargement de la page. –

1

Votre code fonctionne très bien en supposant qu'il est à portée globale, sauf que vous ne pouvez pas utiliser document.write après la page est chargée. Donc:

function MyClass() 
{ 
    this.instanceData = "Display Me"; 

    this.DisplayData = function() 
    { 
     alert(this.instanceData); // <=== only change here 
    } 
} 

var classInstance = new MyClass(); 

... fonctionne bien avec votre attribut onclick. Live example | source

document.write est principalement pour l'utilisation pendant le chargement de la page. Si vous l'appelez après le chargement de la page, cela implique un document.open qui efface le document en cours et le remplace par avec le contenu que vous écrivez. Si vous souhaitez ajouter à la page après le chargement de la page, utilisez createElement et appendChild, définissant le contenu de l'élément via innerHTML. Par exemple:

var p = document.createElement('p'); 
p.innerHTML = "Hi there"; 
document.body.appendChild(p); 

... ajoute un paragraphe contenant "Hi there" à la page.

Cependant, je vous invite à ne pas utiliser onclick attributs et tels, notamment parce qu'ils ont besoin d'accéder à des variables et des fonctions globales, et je plaide pour éviter d'avoir des variables globales et fonctions dans la mesure où vous pouvez (et vous pouvez presque évitez-les complètement). Au lieu de cela, utilisez les méthodes modernes de raccordement des gestionnaires d'événements: addEventListener et (pour prendre en charge IE8 et versions antérieures) attachEvent.

donc changer votre exemple pour que cela ne crée pas de GLOBALS:

(function() { 
    function MyClass() 
    { 
     this.instanceData = "Display Me"; 

     this.DisplayData = function() 
     { 
      alert(this.instanceData); 
     } 
    } 

    var classInstance = new MyClass(); 

    // ...and hook it up 
    var button = document.getElementById("theButton"); 
    if (button.addEventListener) { 
     button.addEventListener('click', function() { 
      classInstance.DisplayData(); 
     }, false); 
    } 
    else if (button.attachEvent) { 
     button.attachEvent('onclick', function() { 
      classInstance.DisplayData(); 
     }); 
    } 
    else { 
     // Very old browser, complain 
    } 
})(); 

(. Notez que le nom de l'événement "clic" avec addEventListener, "onclick" avec attachEvent)

Ce prend le bouton ressemble à ceci:

<button id="theButton">Click Me!</button> 

... et que votre code est exécuté après que le bouton a déjà été mis sur la page (par exemple, votre script est at the bottom of the page ou s'exécute en réponse à un événement).

Maintenant, il est difficile de vérifier s'il faut utiliser addEventListener ou attachEvent à chaque fois. En outre, vous pouvez ne pas vouloir tous les éléments avec lesquels vous devez travailler pour avoir un id. C'est là que l'utilisation d'une bonne bibliothèque JavaScript comme jQuery, Prototype, YUI, Closure, ou any of several others est utile. Ils adoucissent les événements (et beaucoup d'autres idiosyncrasies) pour vous, et fournissent des fonctionnalités utiles pour localiser les éléments autrement que par id (dans la plupart des cas, prenant en charge presque tous les sélecteurs CSS, même sur les anciens navigateurs qui n'ont pas querySelector/querySelectorAll construit en

-1

Toutes les réponses ci-dessus semblent trop compliquer la situation un peu

J'utilise simplement ceci:..

MyClass = new function() { 
    this.instanceData = "Display Me"; 

    this.DisplayData = function() { 
     alert(this.instanceData); 
    }; 
}; 

Et voici le bouton:

<button onClick="MyClass.DisplayData()">Click Me!</button> 

Et est un violon ici que la démonstration: Fiddle

+0

La question porte sur les classes, pas sur les fonctions js. – Jersh