Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

RaulMC

Problemas com acesso a variavel global

Recommended Posts

Ola estou montando uma pagina com JS puro porem estou encontrando um erro que não sei como resolver.
Esse e o HTML:

<html>
    <head>
        <title>Map generator</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script src="js/setup.js"></script>
    </head>
    <body onload="bodyReady()">
    </body>
</html>

Setup.js:

            var obj = new Object();
            obj.nImgReady = 1; //numero de imagens carregadas
            var imgObj = [];
            
            
            
            function bodyReady(){
                console.log ( 'Body foi criado ');
            
                window.obj.background = document.createElement("canvas");
                window.obj.body = document.querySelector("body");
                window.obj.virtual = document.createElement("canvas");
                
                for(a=0;a<img.length;a++){
                    imgObj[a] = document.createElement("img");
                    imgObj[a].setAttribute("id", "img"+String(a));
                    imgObj[a].src =  img[a][2];
                    imgObj[a].setAttribute("onLoad", "imgReady()");
                }
        }
            
            function imgReady(){
                obj.nImgReady++;
                if(img.length<=obj.nImgReady){
                        pageReady();
                }
            }
            
            function pageReady(){
                alert("deu certo");
            }

A função "bodyReady()" e chamada pelo "onLoad" do "Body" quando o mesmo e carregado, ela acessa e entende a variavel global "obj.nImgReady", porem quando eu chamo a função "imgReady()" pelo "onLoad" da imagem, quando ela e carregada, a variavel global "obj.nImgReady" aparece como "undefined", quando a função "bodyReady()" era execultada automaticamente sem ser uma função a variavel global "obj.nImgReady" era reconhecida como inteiro pela função "imgReady()".

Não posso criar essa variavel na função pois trata-se de um contagem por isso preciso que seja de um elemento externo, todas as funções que são chamadas apartir da função "imgReady()", não reconhecem a variavel "obj.nImgReady", porem reconhecem normalmente "img.length" e o objeto "obj".

Não posso criar a varivel local na função "bodyReady()" pois o "onload" da imagem não reconheceria, tambem não posso passar por parametro externo da função "(obj)" pois a contagem e assincrona e a variavel armazenada seria copiariam valores errado não ocorrendo acontagem correta por isso optei por uma variavel global.

O codigo acima não esta completo dei uma enchugada, mais o resto não interfere em nada e apenas complemento os elementos ali criados, e definição da lista de imagens por array.

O codigo funcionava normal antes de virar um função porem preciso que funcina como função.

Compartilhar este post


Link para o post
Compartilhar em outros sites

troque:

imgObj[a].setAttribute("onLoad", "imgReady()");
por:

 

imgObj[a].addEventListener("load", imgReady);

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema não e chamada da função "imgReady", testei essa mudança porem continua falando que a variável "obj.nImgReady" não foi definida. Tentei ate usar "window,obj.nImgReady" mas continua a mesma resposta

Obrigado pela ajuda mas acho que não tem jeito de utilizar JavaScript assim provavelmente tem algum tipo de limite de buffer que esta apagando as variáveis do objeto "obj", quanto quanto mais funções dentro de funções eu utilizo, mais variáveis do objeto somem, vou testar substituir o objeto por um array para ver se para de acontecer se não terei que reescrever por loop e muitas comparações.

Consegui resolver mais de um jeito ruim aquele variável, tive que criar uma variável global só para a contagem, por alguma razão quando utilizo varias camadas de função, dados dentro de objetos começam a ficar indefinidos,eu consegui chegar a função "pageReady()", porem quando acesso uma função dentro dela, não consigo acessar mais as variáveis obj.background, obj.body, obj.virtual.

Caso alguém queria testar a função e cima basta usar em "img" esse e o array que chama as imagens.

img = [];

img[0] = ["nome imagem", "png",
       "ima/imagem.png"
	   ];

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.