2010-09-13 4 views
3

Pourquoi cela ne fonctionne-t-il pas? Peut-être que quelqu'un pourrait m'éclairer: Pprototype et document.getElementById()

var balloon = function(){ 

}; 
balloon.prototype.iHeight = document.getElementById("wrapper").clientHeight; 

window.onload = function(){ 
    var oBalloon = new balloon(); 
} 

J'essaie juste de comprendre un peu mieux le prototype.

+0

qu'est-ce que vous essayer de faire? – jrharshath

+1

@ Ici, il a dit .. "Im essayant juste de comprendre le prototype un peu mieux." – RobertPitt

+0

Hmm, point pris. Je concède. – jrharshath

Répondre

1

prototypes ne sont autorisés après que l'objet a été initialisé afin de modifier votre code à ce qui suit:

Semble après quelques recherches, je me suis trompé, le problème ressemble est le fait que votre utilisation de document.* avant la fenêtre a chargé, document.* est seulement disponible une fois que le <body> a été chargé dans le DOM.

si GetElementById() ne fonctionnera une fois l'élément réel que vous essayez de sélectionner est dans le dom

var ById = function(i){return document.getElementById(i);} 
var balloon = function(){} 

window.onload = function(){ 
    //All elements have loaded now 
    var oBalloon = new balloon(); 
    //The below code should work fine 
    balloon.prototype.iHeight = ById("wrapper").clientHeight; 
} 

De ci-dessus, vous pouvez voir ce document est seulement utilisé une fois la fenêtre chargée

+0

Pas tout à fait correct. 'balloon' a déjà été initialisé par la déclaration de fonction. 'prototype' va bien où il l'avait. – palswim

+0

Oui, mon erreur était que les prototypes peuvent être ajoutés à un objet indépendamment de son état, mais ne peuvent être accessibles qu'une fois l'objet construit. – RobertPitt

2

Votre code est probablement en cours d'exécution avant le chargement du DOM, lorsqu'il n'y a pas d'élément wrapper.

0

Peut-être que vous voulez essayer:

var balloon = function(){ 
}; 
balloon.prototype.iHeight = function(){ return document.getElementById("wrapper").clientHeight; } 

Ensuite, vous pouvez l'appeler plus tard, après le chargement DOM.

Vous en avez besoin dans une fonction car sinon JavaScript essayera de calculer la valeur au moment de la définition.

window.onload = function(){ 
    var oBalloon = new balloon(); 
    var height = oBalloon.iHeight(); // iHeight would be undefined if you tried to calculate it earlier 
} 

Vous pouvez simplement supprimer la méthode prototype tout à fait et définir la propriété dans le gestionnaire onload:

window.onload = function(){ 
    var oBalloon = new balloon(); 
    oBalloon.iHeight = document.getElementById("wrapper").clientHeight; 
} 

Ensuite, vous ne régler qu'une seule fois, mais aussi garantir le DOM aura chargé et la propriété sera valide d'ici là.

Qu'est-ce que vous aviez est équivalent à:

var balloon = function(){}; 
var tmp = document.getElementById("wrapper").clientHeight; // at this point, this is not definted: tmp = undefined 
balloon.prototype.iHeight = tmp; // undefined 
window.onload = function(){ 
    var oBalloon = new balloon(); 
} 
+0

Cela fonctionne mais pourquoi doit-il être enveloppé dans une fonction? – Baijs

+0

C'est parce que votre code est probablement en cours d'exécution avant le chargement du DOM. Le code que vous avez fonctionne correctement, mais vous devez l'exécuter après le chargement du DOM. – cleek

0

Le code que vous avez publié fonctionne très bien. Êtes-vous sûr d'avoir un élément dont l'identifiant est wrapper?

Questions connexes