webentwicklung-frage-antwort-db.com.de

Globale Variablen in Javascript über mehrere Dateien hinweg

Ein Haufen meines JavaScript-Codes befindet sich in einer externen Datei namens helpers.js. Innerhalb des HTML-Codes, der diesen JavaScript-Code aufruft, muss ich wissen, ob eine bestimmte Funktion von helpers.js aufgerufen wurde.

Ich habe versucht, eine globale Variable zu erstellen, indem ich Folgendes definiere:

var myFunctionTag = true;

Im globalen Bereich sowohl in meinem HTML-Code als auch in helpers.js.

Hier ist, wie mein HTML-Code aussieht:

<html>
...
<script type='text/javascript' src='js/helpers.js'></script>    
...
<script>
  var myFunctionTag = false;
  ...
  //I try to use myFunctionTag here but it is always false, even though it has been se t to 'true' in helpers.js
</script>

Ist das, was ich versuche, überhaupt machbar?

116
Goro

Sie müssen die Variable deklarieren, bevor Sie die Datei helpers.js einfügen. Erstellen Sie einfach ein Skript-Tag über dem Include für helpers.js und definieren Sie es dort.

<script type='text/javascript' > 
  var myFunctionTag = false; 
</script>
<script type='text/javascript' src='js/helpers.js'></script>     
... 
<script type='text/javascript' > 
  // rest of your code, which may depend on helpers.js
</script>
112
tvanfosson

Die Variable kann in der Datei .js Deklariert und in der HTML-Datei einfach referenziert werden. Meine Version von helpers.js:

var myFunctionWasCalled = false;

function doFoo()
{
    if (!myFunctionWasCalled) {
        alert("doFoo called for the very first time!");
        myFunctionWasCalled = true;
    }
    else {
        alert("doFoo called again");
    }
}

Und eine Seite zum Testen:

<html>
<head>
<title>Test Page</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<script type="text/javascript" src="helpers.js"></script>
</head>

<body>


<p>myFunctionWasCalled is
<script type="text/javascript">document.write(myFunctionWasCalled);</script>
</p>

<script type="text/javascript">doFoo();</script>

<p>Some stuff in between</p>

<script type="text/javascript">doFoo();</script>

<p>myFunctionWasCalled is
<script type="text/javascript">document.write(myFunctionWasCalled);</script>
</p>

</body>
</html>

Sie werden sehen, dass der Test alert() zwei verschiedene Dinge anzeigt und der Wert, der auf die Seite geschrieben wird, sich beim zweiten Mal unterscheidet.

16
Stephen P

Okay Leute, hier ist auch meine kleine Prüfung. Da ich ein ähnliches Problem hatte, habe ich beschlossen, drei Situationen zu testen:

  1. Eine HTML-Datei, eine externe JS-Datei ... funktioniert das überhaupt - können Funktionen über eine globale Variable kommunizieren?
  2. Zwei HTML-Dateien, eine externe JS-Datei, ein Browser, zwei Registerkarten: Stören sie sich über die globale Variable?
  3. Eine HTML-Datei, die von zwei Browsern geöffnet wird. Funktioniert sie und stören sie?

Alle Ergebnisse waren wie erwartet.

  1. Es klappt. Die Funktionen f1 () und f2 () kommunizieren über die globale Variable (die Variable befindet sich in der externen JS-Datei, nicht in der HTML-Datei).
  2. Sie stören nicht. Anscheinend wurden für jede Browserregisterkarte und jede HTML-Seite unterschiedliche Kopien der JS-Datei erstellt.
  3. Alles funktioniert wie erwartet unabhängig voneinander.

Anstatt Tutorials durchzublättern, fand ich es einfacher, es auszuprobieren, also tat ich es. Mein Fazit: Wenn Sie eine externe JS-Datei in Ihre HTML-Seite einfügen, wird der Inhalt der externen JS in Ihre HTML-Seite "kopiert/eingefügt", bevor die Seite gerendert wird. Oder in Ihre PHP Seite, wenn Sie werden. Bitte korrigieren Sie mich, wenn ich hier falsch liege. Danke.

Meine Beispieldateien folgen:

EXTERNAL JS:

var global = 0;

function f1()
{
    alert('fired: f1');
    global = 1;
    alert('global changed to 1');
}

function f2()
{
    alert('fired f2');
    alert('value of global: '+global);
}

HTML 1:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<script type="text/javascript" src="external.js"></script>
<title>External JS Globals - index.php</title>
</head>
<body>
<button type="button" id="button1" onclick="f1();"> fire f1 </button>
<br />
<button type="button" id="button2" onclick="f2();"> fire f2 </button>
<br />
</body>
</html>

HTML 2

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<script type="text/javascript" src="external.js"></script>
<title>External JS Globals - index2.php</title>
</head>
<body>
<button type="button" id="button1" onclick="f1();"> fire f1 </button>
<br />
<button type="button" id="button2" onclick="f2();"> fire f2 </button>
<br />
</body>
</html>
15
Martin

Um Werte von einer js-Datei an eine andere js-Datei zu übergeben, können wir das lokale Speicherkonzept verwenden

<body>
<script src="two.js"></script>
<script src="three.js"></script>
<button onclick="myFunction()">Click me</button>
<p id="demo"></p>
</body>

Two.js Datei

function myFunction() {
var test =localStorage.name;

 alert(test);
}

Three.js Datei

localStorage.name = 1;
1
Sajith

// Javascript-Datei 1

localStorage.setItem('Data',10);

// Javascript-Datei 2

var number=localStorage.getItem('Data');

Vergessen Sie nicht, Ihre JS-Dateien in HTML zu verlinken:)

0
MrJ

Ich denke, Sie sollten "lokalen Speicher" anstelle von globalen Variablen verwenden.

Wenn Sie befürchten, dass "lokaler Speicher" in sehr alten Browsern möglicherweise nicht unterstützt wird, sollten Sie ein vorhandenes Plug-in verwenden, das die Verfügbarkeit von "lokalem Speicher" überprüft und andere Methoden verwendet, wenn es nicht verfügbar ist.

Ich habe http://www.jstorage.info/ verwendet und bin soweit zufrieden damit.

0
paulo62

Sie können ein JSON-Objekt wie folgt erstellen:

globalVariable={example_attribute:"SomeValue"}; 

in fileA.js

Und greifen Sie von fileB.js wie folgt darauf zu: globalVariable.example_attribute

0
partizanos