Originariamente inviato da Kronil è che la funzione javascript in questione si basa su degli eventi che accadono nella pagina html (scelta radio button oppure scelta di un'opzione in una select)... nn è che essendo esterno magari "non vede" questi eventi?
<script type = "text/javascript" src = "schedareg.js"></script>
e non funziona.
allora ora ti spiego, i file esterni vengono caricati e se eseguono funzioni queste vengono eseguite nel momento in cui il parser javascript le raggiunge, questo potrebbe voler dire che per qualche motivo l'html non è stato completamente caricato, e che dunque se una funzione riferisce a questi elementi il js non funzionerebbe per il semplice fatto che al momento in cui tu vuoi usare il dom, quest' ultimo non è caricato..
detto ciò come si risolve?
Semplice, basta far si che le funzioni che vengono richiamate (e che fanno riferimento al DOM)
partano quando il dom è effettivamente caricato, ossia nella buona parte dei casi basta fare una funzione che parte all onload e spostare li le tue funzioni.
esempio
codice:
//Supponiamo tu adesso abbia qualcosa di sto tipo:
function miafunzione(){
document.getElementById("mioDiv").innerHTML="Funziono!";
}
//esempio errato, parte prima del caricamento del DOM!!!
miafunzione();
devi trasformarla in :
codice:
function miafunzione(){
document.getElementById("mioDiv").innerHTML="Funziono!";
}
onload=function(){
miafunzione();
}
ora questo può portare ad un problema se hai già un evento onload associato, poichè
rischieresti di sovrascrivere l'evento onload.
esempio:
codice:
//Queste 2 funzioni magari sono in un altro script e tu non lo sai :dottò:
function hello(){
alert("hello");
}
onload=hello;
function miafunzione(){
document.getElementById("mioDiv").innerHTML="Funziono!";
}
onload=function(){
miafunzione();
}
questo causa un problema, solo una delle due funzioni partirà, e piu precisamente partirà solo quella che viene per ultima, visto che sovrascrive quella prima
e questo come capperi si risolve?
pure questo è semplice, basta salvare l'eventuale evento onload prima di aggiungere quello nuovo:
codice:
//Queste 2 funzioni magari sono in un altro script e tu non lo sai :dottò:
function hello(){
alert("hello");
}
onload=hello;
function addOnload(f){
var oldOnload=window.onload;
onload=function(){
if(oldOnload)oldOnload();
if(f)f();
}
}
function miafunzione(){
document.getElementById("mioDiv").innerHTML="Funziono!";
}
addOnload(function(){
miafunzione();
});
sono puntiglioso, questa sotto è una cosa avanzata, nel senso che difficilmente sarà il tuo caso, ma per completezza la elenco:
...Ci sarebbe un altro problema, causato dal fatto che se, per esempio, ci fossero delle immagini molto grande l'onload partirebbe solo dopo che tutte le immagini son state scaricate, per questo devi affidarti ad una soluzione un po piu' drastica, cioè utilizzare una serie di trucchetti, che ha ben riassunto il caro e vecchio Andr3a qui:
http://www.3site.eu/jstests/onContent/onContent.js
dopo aver incluso questa funzione potrai finalmente risolvere il tutto con quest' ultima implementazione del codice sopra:
codice:
function onContent(f){//(C)webreflection.blogspot.com
var a=onContent,b=navigator.userAgent,d=document,w=window,c="onContent",e="addEventListener",o="opera",r="readyState",
s="<scr".concat("ipt defer src='//:' on",r,"change='if(this.",r,"==\"complete\"){this.parentNode.removeChild(this);",c,".",c,"()}'></scr","ipt>");
a[c]=(function(o){return function(){a[c]=function(){};for(a=arguments.callee;!a.done;a.done=1)f(o?o():o)}})(a[c]);
if(d[e])d[e]("DOMContentLoaded",a[c],false);
if(/WebKit|Khtml/i.test(b)||(w[o]&&parseInt(w[o].version())<9))(function(){/loaded|complete/.test(d[r])?a[c]():setTimeout(arguments.callee,1)})();
else if(/MSIE/i.test(b))d.write(s);
};
//Queste 2 funzioni magari sono in un altro script e tu non lo sai :dottò:
function hello(){
alert("hello");
}
onContent(hello);
function miafunzione(){
document.getElementById("mioDiv").innerHTML="Funziono!";
}
onContent(function(){
miafunzione();
});