Funktionsaufruf klappt nur intern, extern nicht

gianfranco0104

Erfahrenes Mitglied
Habe da eigentlich was simples, will bei mir aber nicht hinhauen, warum auch immer.
Ich habe auf meiner Seite 2 .JS files (erfolgreich) eingebunden. a.js muss nun auf b.js zugreifen. Will aber nicht. Alle anderen Funktionen funktionieren soweit.
Kann es sein, dass Funktion B noch nicht bekannt ist?
über
Javascript:
/*... code vorher dann soll eine IF-Anweisung kommen, iszt sie True starte Funktion aus B.JS*/
if (setdropdown_hub1_vc = true){ dropdown_hub1_vc() }

klappt nicht. Wie kann das sein?
 
Hallo gianfranco0104

Scripts werden geladen und ausgeführt, wenn du sie einbindest, in der Reihenfolge. Du kannst also nichts verwenden, was du nicht schon deklariert hast.

Zudem:
Javascript:
if(setdropdown_hub1_vc = true)
// BESSER
if(setdropdown_hub1_vc === true)
 
Hi Cromon, wenn ich statt einem "=" 3, also "===" nutze, dann bekomme ich keinen Fehler, dass die Funktion nicht geladen wird. Würde es also nicht mitbekommen. Zum eigentlichen Problem.
Habe jetzt mal das Ganze so gemacht und dann klappt es perfekt, ist aber für mich irgendwie unlogisch:

Javascript:
/*...*/
if (setdropdown_hub1_vc = true){ ausfuehren(); }
}
function ausfuehren(){dropdown_hub1_vc(); }

Vorallem müsste ich so für jeden Parameter in den kommenden if-Anweisungen eine eigene Funktion machen, welche dann die eigentliche ausführt - ist doch komisch... :-|

PS mit "===" klappt es auch nicht.
 
1. Wie bindest du die Skripte ein? Zeig deinen HTML-Code.
2. Wie schauen deine Skripte aus? Zeig deinen JS-Code. Zumindest von der Datei, aus der die gewünschte Funktion exportiert werden soll.
3. Kennst du den Unterschied zwischen =, == und ===?
 
Bin mir nicht sicher, ob das ein Problem ist, aber hinter dem Funktionsaufruf steht kein Semikolon:
Code:
{ dropdown_hub1_vc() }
 
Hi Sempervivum

Semikolons sind optional in Javascript, du hast aber recht, dass man sie immer verwenden sollte als wären sie zwingend.

Grüsse
Cromon
 
Sie sind in einigen Fällen optional, in einigen anderen aber nicht!
Also: Verwende Semikoli einfach immer!

Und würde das Semikolon in deinem Fall obligatorisch sein, dann würdest du einen Syntaxfehler bekommen.(Wohlgemerkt gibt es auch Fälle, in denen ein ausgelassenes Semikolon zu einer anderen Interpretation des Codes und somit zu subtilen Bugs führt.)
 
Hi ComFreek

Kommt dir gerade ein Fall in den Sinn in dem das Semikolon nicht optional ist? Gemäss ECMA-Standard wird immer dann wenn ein Token auftritt, das grammatikalisch inkorrekt ist ihm ein Semikolon vorangestellt, wenn es ein Linebreak oder ein } ist. Ich hab mir mal versucht etwas zu überlegen wo ein Semikolon nicht durch einen Linebreak ersetzt werden kann, mir kam aber nichts in den Sinn. Hast du vielleicht eine Idee?

Viele Grüsse
Cromon
 
@ComFreek,
Via html wird die Hauptfunktion mit onClick="loadXMLWizConf(); aufgerufen:
Javascript:
function LoadXML(xmlFile)
    {
        xmlDoc.load(xmlFile);
        return xmlDoc.documentElement;
    }

function loadXMLWizConf()   { 
        var xmlObj = FILENAME; // kommt von einer globalen var
        var Confs = new Array();
        var xmlObj;
        xmlObj = LoadXML(FILENAME);
      
        //attribute wieder auspacken
        var attrCount = 0;
        while (attrCount < xmlObj.childNodes.length) {
            var Projectname = xmlObj.childNodes(attrCount).getAttribute("Projectname");
            var Hub1        = xmlObj.childNodes(attrCount).getAttribute("Hub1");
            var dropdown_hub1_vc = xmlObj.childNodes(attrCount).getAttribute("dropdown_hub1_vc");
            var dropdown_hub1_sc = xmlObj.childNodes(attrCount).getAttribute("dropdown_hub1_sc");
            attrCount++;
        }
      
        //Attribute wieder in den Wizard einfügen
        projektname_input.value = Projektname;
        hub_1                     = Hub1;
        /*dropdown_hub1_vc*/    if (setdropdown_hub1_vc === true){ dropdown_hub1_vc(); }  
/*... weiteres...*/
    }

Die Funktion dropdown_hub1_vc(); , welche aufgerufen werden soll, kommt von einer anderen eingebundenen js:
Javascript:
function dropdown_hub1_vc() {
MM_DW_effectSlide($('#wizard_hub1_dd_div'),'hide','slide','up',500,330);
MM_changeProp('wizard_hub1_dd_inverse','','visibility','hidden','IMG');
MM_changeProp('wizard_hub1_dd','','visibility','visible','IMG');
MM_changeProp('wizard_hub1_vc','','visibility','visible','IMG');
MM_changeProp('wizard_hub1_sc','','visibility','hidden','IMG');
MM_changeProp('wizard_hub1_disp','','visibility','hidden','IMG');
MM_changeProp('wizard_hub1_cv','','visibility','hidden','IMG');
MM_changeProp('wizard_hub1_platzhalter','','visibility','hidden','IMG');
MM_changeProp('wizard_hub1_checkbox_on','','visibility','visible','IMG');
hub_1 = true ;
changedues();
weiter();
setdropdown_hub1_vc = true;
setdropdown_hub1_sc = false;
setdropdown_hub1_disp = false;
setdropdown_hub1_cv = false;
}
 
Zuletzt bearbeitet:
@Cromon Hehe, ich bin gerade dabei, das Buch "JavaScript: The Definitive Guide" (6th Edition) von David Flanagan zu lesen, um mein Wissen auf ES5 aufzufrischen. Da sind einige schöne Beispiele drin:
Javascript:
// Code kopiert von "2.5 Optional Semicolons", S. 25 - 27
var a
a
=
3
console.log(a);
// Interpretation: var a; a = 3; console.log(a);

var y = x + f
(a+b).toString()
// Interpretation: var y = x + f(a+b).toString();

return
true;
// Interpretation: return; true;

x
++
y
// Interpretation: x; ++y;
Das letzte Beispiel dürfte wohl genau das sein, nach dem du gesucht hast ;) Hierbei kannst du nämlich das Semikolon (x++;y) nicht durch einen Zeilenumbruch ersetzen, ohne dass der Sinn geändert wird.

Übrigens sind die Regeln, wann wie mit Zeilenumbrüchen und Semikoli verfahren wird, doch schon ein wenig komplizierter. Zwei Ausnahmen der allgemeinen Regeln ("überprüfen, ob nächste Zeile zusätzlich parsbar ist") sind oben aufgeführt: return (genauso break und continue) und die Inkrement- und Dekrementoperatoren.
 
Zurück