2010-04-26 5 views
0

Je comprends maintenant que le code suivant ne fonctionnera pas parce que j'affecte window.onload au résultat de la fonction, pas la fonction elle-même. Mais si j'enlève les parenthèses, je suspecte que je dois explicitement appeler une fonction séparée pour traiter la config avant l'onload. Alors, où j'ai maintenant:Passer les valeurs par défaut dans window.onload?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<HEAD> 
<script type="text/javascript" src="lb-core.js"></script> 
<script type="application/javascript"> 
var lbp = { 
    defaults: { 
     color: "blue" 
    }, 
    init: function(config) { 
     if(config) { 
      for(prop in config){ 
       setBgcolor.defaults[prop] = config[prop]; 
      } 
     } 
     var bod = document.body; 
     bod.style.backgroundColor = setBgcolor.defaults.color; 
    } 
} 
var config = { 
    color: "green" 
} 
window.onload = lbp.init(config); 
</script> 
</HEAD> 
<body> 
<div id="container">test</div> 
</body> 
</HTML> 

J'imagine que je dois changer pour:

var lbp = { 
    defaults: { 
     color: "blue" 
    }, 
    configs: function(config){ 
      for(prop in config){ 
       setBgcolor.defaults[prop] = config[prop]; 
      } 
    }, 
    init: function() { 
     var bod = document.body; 
     bod.style.backgroundColor = setBgcolor.defaults.color; 
    } 
} 
var config = { 
    color: "green" 
} 

lbp.configs(config); 
window.onload = lbp.init; 

Ensuite, pour les gens à utiliser ce script et passent dans une configuration, ils auraient besoin d'appeler ces deux lignes de fond séparément (configs et init). Existe-t-il une meilleure façon de le faire?

Remarque: Si votre réponse consiste à regrouper une fonction de window.onload, veuillez également confirmer qu'il n'est pas dangereux d'affecter window.onload dans les scripts. D'après ce que j'ai compris, un autre script venant après le mien pourrait, en fait, écraser ce que j'avais chargé de charger. Avec cela en considération, il est préférable de s'attendre à ce que votre utilisateur de script appelle lui-même la fonction à l'initialisation.

Répondre

2

Utilisez une fonction anonyme pour transmettre des options, comme ceci:

window.onload = function() { lbp.init(config); }; 

Si vous êtes inquiet au sujet de s'écraser prendre la route discrète, like this.

Vous pouvez également utiliser une bibliothèque pour vos besoins javascript, par exemple, j'utilise jQuery pour cela, et il ressemblerait à ceci:

$(function() { lbp.init(config); }); 

Obtenir une bibliothèque seulement cela est exagéré, mais si vous avez beaucoup de javascript en cours, je vous suggère de prendre un look at what's available.

+0

Serait-il mauvais de coder ceci dans init et de l'appeler sans parens? Par exemple, je pourrais tester lbpConfig, et si elle existe, alors je pourrais appliquer ses paramètres? Ce script ne sera pas initialisé plusieurs fois sur la même page ... – Matrym

+0

re: bibliothèques - J'aime jQuery, mais j'essaie d'apprendre old school javascript. J'essaye également de construire ceci sans dépendances, ainsi les gens peuvent choisir leurs propres bibliothèques en l'employant. – Matrym

+0

@Matryn - Cela dépend de ce que vous voulez, je suppose, vous pouvez faire '.init (config || {})' et ça passera config si ça va exister, vide/pas d'options si ce n'est pas le cas. –

0

Vous pouvez renvoyer une fonction anonyme à la suite de l'appel de init. Quelque chose comme ceci:

var lbp = { 
    defaults: { 
     color: "blue" 
    }, 
    init: function(config) { 
     for(prop in config){ 
      setBgcolor.defaults[prop] = config[prop]; 
     } 
     return function() { 
      var bod = document.body; 
      bod.style.backgroundColor = setBgcolor.defaults.color; 
     }; 
    } 
} 
window.onload = lbp.init({color: "green"}); 
Questions connexes