Variáveis ​​globais em Javascript em vários arquivos


130

Um monte de meu código JavaScript está em um arquivo externo chamado helpers.js. Dentro do HTML que chama esse código JavaScript, preciso saber se uma determinada função do helpers.js foi chamada.

Eu tentei criar uma variável global definindo:

var myFunctionTag = true;

No escopo global, tanto no meu código HTML quanto no helpers.js.

Aqui está a aparência do meu código 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>

O que estou tentando fazer é viável?


1
Bem, você acabou de configurá- lo como false no segundo <script>bloco de tags. Eu apenas tentei duas abordagens diferentes (sem declarar a var antes do arquivo helpers.js) e ambas funcionaram. Vou postar uma resposta, mas parece que algumas informações importantes estão faltando na sua pergunta.
Stephen P

window.onload = function () {// iniciar o seu código} O relator a melhor solução - E esta é Slowpoke fala :)
Schoening

Respostas:


125

Você precisa declarar a variável antes de incluir o arquivo helpers.js. Simplesmente crie uma tag de script acima do include for helpers.js e defina-a lá.

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

9
não funciona para mim, porque quando tentar aceder a partir de outro js carregados em outro html, ele diz que a variável não é declarada
ACV

16

A variável pode ser declarada no .jsarquivo e simplesmente referenciada no arquivo HTML. Minha versão de helpers.js:

var myFunctionWasCalled = false;

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

E uma página para testá-lo:

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

Você verá que o teste alert()exibirá duas coisas diferentes e o valor gravado na página será diferente na segunda vez.


15

OK, pessoal, aqui está o meu pequeno teste também. Como tive um problema semelhante, resolvi testar três situações:

  1. Um arquivo HTML, um arquivo JS externo ... funciona mesmo - as funções podem se comunicar por meio de uma var global?
  2. Dois arquivos HTML, um arquivo JS externo, um navegador e duas guias: eles interferem na var global?
  3. Um arquivo HTML, aberto por dois navegadores, funcionará e eles interferirão?

Todos os resultados foram os esperados.

  1. Funciona. As funções f1 () e f2 () se comunicam via var global (var está no arquivo JS externo, não no arquivo HTML).
  2. Eles não interferem. Aparentemente, cópias distintas do arquivo JS foram feitas para cada guia do navegador, cada página HTML.
  3. Tudo funciona de forma independente, conforme o esperado.

Em vez de navegar nos tutoriais, achei mais fácil testá-lo, por isso o fiz. Minha conclusão: sempre que você incluir um arquivo JS externo em sua página HTML, o conteúdo do JS externo será "copiado / colado" em sua página HTML antes que a página seja renderizada. Ou em sua página PHP, se quiser. Por favor, corrija-me se estiver errado aqui. Thanx.

Meus arquivos de exemplo são os seguintes:

JS EXTERNO:

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>

1
HTML 1 e HTML 2 são idênticos (exceto o título da página) ... ainda assim, criei dois arquivos, apenas para separá-los fisicamente.
Martin

1

Eu acho que você deveria estar usando "armazenamento local" em vez de variáveis ​​globais.

Se você está preocupado com o fato de que o "armazenamento local" pode não ser suportado em navegadores muito antigos, considere usar um plug-in existente que verifique a disponibilidade do "armazenamento local" e use outros métodos se ele não estiver disponível.

Eu usei o http://www.jstorage.info/ e estou feliz com isso até agora.


1

Você pode criar um objeto json como:

globalVariable={example_attribute:"SomeValue"}; 

em fileA.js

E acesse-o em fileB.js como: globalVariable.example_attribute


1

Oi para passar valores de um arquivo js para outro arquivo js, ​​podemos usar o conceito de armazenamento local

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

Arquivo Two.js

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

 alert(test);
}

Arquivo Three.js

localStorage.name = 1;

1

Se você estiver usando o nó:

  1. Crie um arquivo para declarar valor, digamos que seja chamado values.js:
export let someValues = {
  value1: 0
}

Em seguida, importe-o conforme necessário na parte superior de cada arquivo em que é usado (por exemplo, file.js):

import { someValues } from './values'

console.log(someValues);

-1

// arquivo Javascript 1

localStorage.setItem('Data',10);

// arquivo Javascript 2

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

Não se esqueça de vincular seus arquivos JS em html :)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.