Zmienne globalne w JavaScript w wielu plikach


132

Część mojego kodu JavaScript znajduje się w zewnętrznym pliku o nazwie helpers.js. W kodzie HTML, który wywołuje ten kod JavaScript, potrzebuję wiedzieć, czy została wywołana pewna funkcja z helpers.js.

Próbowałem utworzyć zmienną globalną, definiując:

var myFunctionTag = true;

W zakresie globalnym zarówno w moim kodzie HTML, jak iw helper.js.

Oto jak wygląda mój kod HTML:

<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>

Czy to, co próbuję zrobić, jest w ogóle wykonalne?


1
Cóż, właśnie ustawiłeś wartość false w drugim <script>bloku tagów. Po prostu wypróbowałem 2 różne podejścia (bez deklarowania var przed plikiem helpers.js) i oba działały. Napiszę odpowiedź, ale wygląda na to, że w Twoim pytaniu brakuje kluczowych informacji.
Stephen P

window.onload = function () {// Start Your Code} Byłoby najlepszym rozwiązaniem - a to mówi Slowpoke :)
Schoening

Odpowiedzi:


127

Musisz zadeklarować zmienną przed dołączeniem pliku helpers.js. Po prostu utwórz tag skryptu powyżej dołączenia dla helpers.js i zdefiniuj go tam.

<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>

10
nie działa dla mnie, ponieważ próbując uzyskać dostęp z innego js załadowanego w innym html, mówi, że zmienna nie jest zadeklarowana
ACV

16

Zmienną można zadeklarować w .jspliku i po prostu odwołać się do niej w pliku HTML. Moja wersja helpers.js:

var myFunctionWasCalled = false;

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

I stronę do przetestowania:

<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>

Zobaczysz, że test alert()wyświetli dwie różne rzeczy, a wartość zapisana na stronie będzie inna za drugim razem.


16

OK, chłopaki, oto mój mały test. Miałem podobny problem, więc postanowiłem przetestować 3 sytuacje:

  1. Jeden plik HTML, jeden zewnętrzny plik JS ... czy to w ogóle działa - czy funkcje mogą się komunikować poprzez globalną zmienną?
  2. Dwa pliki HTML, jeden zewnętrzny plik JS, jedna przeglądarka, dwie zakładki: czy będą kolidować przez globalną zmienną?
  3. Jeden plik HTML, otwarty przez 2 przeglądarki, czy zadziała i czy będą przeszkadzać?

Wszystkie wyniki były zgodne z oczekiwaniami.

  1. To działa. Funkcje f1 () i f2 () komunikują się poprzez globalną zmienną (var znajduje się w zewnętrznym pliku JS, a nie w pliku HTML).
  2. Nie przeszkadzają. Najwyraźniej odrębne kopie pliku JS zostały wykonane dla każdej karty przeglądarki, każdej strony HTML.
  3. Wszystko działa niezależnie, zgodnie z oczekiwaniami.

Zamiast przeglądać samouczki, łatwiej mi było go wypróbować, więc tak zrobiłem. Mój wniosek: za każdym razem, gdy umieścisz zewnętrzny plik JS na swojej stronie HTML, zawartość zewnętrznego JS zostanie „skopiowana / wklejona” do strony HTML przed renderowaniem strony. Lub na swojej stronie PHP, jeśli chcesz. Proszę, popraw mnie, jeśli się mylę. Dzięki.

Moje przykładowe pliki to:

ZEWNĘTRZNY 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>

2
HTML 1 i HTML 2 są identyczne (z wyjątkiem tytułu strony) ... mimo to utworzyłem dwa pliki, aby mieć je fizycznie oddzielne.
Martin

1

Myślę, że powinieneś używać „lokalnej pamięci” zamiast zmiennych globalnych.

Jeśli obawiasz się, że „pamięć lokalna” może nie być obsługiwana w bardzo starych przeglądarkach, rozważ użycie istniejącej wtyczki, która sprawdza dostępność „pamięci lokalnej” i używa innych metod, jeśli jest ona niedostępna.

Użyłem http://www.jstorage.info/ i póki co jestem z niego zadowolony.


1

Możesz utworzyć obiekt json taki jak:

globalVariable={example_attribute:"SomeValue"}; 

w plikuA.js

I uzyskaj do niego dostęp z plikuB.js, na przykład: globalVariable.example_attribute


1

Cześć, aby przekazać wartości z jednego pliku js do innego pliku js, możemy użyć koncepcji lokalnego przechowywania

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

Plik Two.js.

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

 alert(test);
}

Plik Three.js

localStorage.name = 1;

1

Jeśli używasz węzła:

  1. Utwórz plik, aby zadeklarować wartość, powiedzmy, że nazywa się values.js:
export let someValues = {
  value1: 0
}

Następnie po prostu zaimportuj go w razie potrzeby u góry każdego pliku, w którym jest używany (np. file.js):

import { someValues } from './values'

console.log(someValues);

-1

// Plik Javascript 1

localStorage.setItem('Data',10);

// Plik Javascript 2

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

Nie zapomnij połączyć plików JS w html :)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.