2009-01-17 5 views
0

ok, les gens ici sont ma bibliothèque antigravité incroyable. J'essaie de le définir comme un littéral d'objet, ce que je lis tous les cool gamins font pour encapsuler leurs bibliothèques. Les tests de base indiquent que cela fonctionne correctement, mais je n'arrive pas à voir document.body depuis l'intérieur de mon objet.Object littéral + document.body.onclick ne fait pas ce que j'attends

ce qui devrait arriver est quand je clique sur la page "Ça marche" devrait alerter. Au lieu de cela, j'ai un document.body = erreur nulle. ce qui donne? Où est mon corps? pourquoi ne puis-je pas définir un événement de souris pour cela? J'ai gaspillé toute ma journée de vendredi avec ça! Gah!

antigrav={ 
activate:function(){ 
    // turn on antigrav 
    document.body.onmousedown = antigrav.startPan(); 
}, 

startPan:function(event){ 
    alert('it is working!'); 
}, 

} 

document.onload=antigrav.activate(); 
+0

Les enfants cool ajoutent également des écouteurs d'événements. ;) Voir: http://www.quirksmode.org/js/events_advanced.html – Prestaul

+0

Donc, j'ai entendu des rumeurs sur les enfants cool qui font cela, mais comment est-ce mieux que d'assigner des fonctions à des événements élémentaires? myel.onclick = foo; semble beaucoup plus facile que myel.addEventListener ('onclick', foo, false), non? –

Répondre

4

Vous voulez probablement faire

document.onload=antigrav.activate; 

Avec parenthèses, vous définissez document.onload au résultat de en cours d'exécution antigrav.activate(), au lieu de vous indiquer que vous voulez antigrav.activate de fonctionner comme le gestionnaire document.onload. Par conséquent, activate() était exécuté pour effectuer l'affectation, avant que le document ne soit chargé, donc document.body n'était pas encore défini.

Vous voulez faire la même chose pour l'affectation de gestionnaire onmousedown:

document.body.onmousedown = antigrav.startPan; 

Essayer ceci, j'ai eu aussi de passer à window.onload ...

Aussi, méfiez-vous des virgules dans les définitions littérales d'objet. Firefox est d'accord avec eux, mais IE s'étouffe. Donc, tout à fait:

var antigrav={ 
    activate:function(){ 
     // turn on antigrav 
     document.body.onmousedown = antigrav.startPan; 
    }, 
    startPan:function(event){ 
     alert('it is working!'); 
    } 
}; 
window.onload=antigrav.activate; 
+0

Tout cela semble raisonnable et prometteur, mais maintenant le script ne fait rien du tout. :( –

+0

mis à jour avec plus de correctifs –

+0

Ce sont de bonnes corrections, mais je voudrais supprimer le document.onload entièrement et juste ajouter une balise de script au bas de votre document qui appelle "antigrav.activate();". Pas besoin de attendez que le chargement soit terminé, tant que le dom est terminé, vous pouvez ouvrir votre script en toute sécurité – Prestaul

0

ok ici est l'état actuel:

var antigrav={ 
activate:function(){ 
    // turn on antigrav 
    alert('started'); 
    document.body.onmouseup = antigrav.startPan; 
    // make flash shield 
}, 

startPan:function(event){ 
    alert('dude, you are panning!'); 
}, 


} 
antigrav.activate(); 
//document.onload=window.antigrav.startPan; 

il devient aussi loin que « alert ('commencé'), mais encore lancers francs "erreur: document.body est nul" les lignes commentées ont le même résultat ...

+0

en utilisant window.onload semble fonctionner ... voir la dernière modification ci-dessus –

0

Ok, les gens, je suis un imbécile, mais vous étiez très utile de toute façon.

le/réel/problème, et rien à voir avec quoi que ce soit, et r eveals une bizarrerie bizarre du comportement body.onclick:

dans mon/HTML/j'avais essayé de mettre en place un gros document pour tester mes clics sur:

<html> 
<script src="antigrav.js"></script> 
<body onload='test()'> 
<!--<body onload="antigrav.activate();" >--> 

    yo, fool, this is the body! 

    <div style="position:absolute; top:2000px; left:2000px;"> 
     it is mad wide and tall! 
    </div> 

</body> 
</html> 

Pour étirer le corps, je mis un div plus à 2000px, 2000px. les barres de défilement sont là, le corps doit être énorme, non? En réalité, tout cet espace entre le div a/rien du tout/dedans - y compris un élément du corps, je suppose? Vous devez cliquer sur le texte pour déclencher document.body.onclick ...

Bizarrement, (et c'est le "bizarre bizarre" révélé) si vous donnez la balise body onclick = "foo()", puis foo() est déclenché lorsque vous cliquez n'importe où sur la page, y compris la zone de corps inexistante. Je n'ai aucune idée pourquoi c'est, mais c'était surtout le problème. merci pour votre aide, vous avez également souligné d'autres bonnes techniques.

Questions connexes