Ir para conteúdo

POWERED BY:

Arquivado

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

Fleury

Criação de funções em tempo real

Recommended Posts

Olá pessoal... Bom eu vi alguns posts relacionados a isso e então resolvi fazer uns testes.Bem, mais abaixo tem um codigo fonte do meu experimento.Observemos algumas coisa:- Funcionou, mas há um porém. Não dá para inserir o evento no botão da forma manual. Então, a criação da chamada das funções devem ser feitas também pelo javascript ou então ele não reconhece que a função existe.Creio eu que tem de ser feito dessa forma pelo motivo de que quando se define uma chamada de função manualmente, a chamada da função referencia a uma função que ainda não foi criada. Fazendo o próprio script definir as chamadas das funções, a chama é feita a uma função que acabou de ser criada.Sejamos mais claros:

Vamos supor que a funcao1() é criada pelo seu script. Se você chamar essa função no evento onKeyPress do botão ele não funcionará pois a função ainda não foi criada no momento em que a chamada foi criada. Então, essa chamada está chamando a funcao1() no endereço X. Acontece que a função foi criada depois e foi alocada na memória no endereço Y. Como a chama está chamando algo que não existe em X, nada acontece como se a função não existisse.<input type="button" value="função" onClick="funcao1()">

A solução então foi fazer com que após criar as funções pelo script, esse mesmo script insere as chamadas nos eventos.
<!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"><title>teste check</title><script>function criaFuncoes() {  for (i = 1; i<=4; i++) {    strFunction = "function funcao"+ i +"() {";    strFunction = strFunction + "alert('Função "+ i +"')";    strFunction = strFunction + "}";    eval(strFunction);    alert('Função criada: \n'+ strFunction);  }    var cont = 1;  for (j = 0; j<document.formFuncoes.elements.length; j++) {    if (document.formFuncoes.elements[j].type == "button") {      eval('document.formFuncoes.elements['+ j +'].onclick = function(){funcao'+ cont +'()}');      alert('Chamada criada: \ndocument.formFuncoes.elements['+ j +'].onClick = function(){funcao'+ cont +'()}');      cont++;    }  }}</script></head><body onLoad="criaFuncoes();"><form name="formFuncoes" method="post" action="">  <input type="button" name="Submit" value="Função 1">  <input type="button" name="Submit" value="Função 2">  <input type="button" name="Submit" value="Função 3">  <input type="button" name="Submit" value="Função 4"></form></body></html>
MAS ESPERA AÍ! E SE EU MANDAR EXECUTAR A CRIAÇÃO ANTES DO FORM?Aí funciona!!!Foi o que fiz. Acontece que no exemplo anterior, eu estava chamando a função de criação no evento onLoad da tag body. Portanto, a criação das funções só estava sendo feita depois da página ser carregada.O que eu fiz foi por para o codigo de criação das funções ser feita antes das chamadas.Com isso, a velocidade do script melhorou teoricamente e também o tamanho do código foi reduzido. Segue ele abaixo:
<!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"><title>teste check</title></head><body><script>  for (i = 1; i<=4; i++) {    strFunction = "function funcao"+ i +"() {";    strFunction = strFunction + "alert('Função "+ i +"')";    strFunction = strFunction + "}";    eval(strFunction);  }</script><form name="formFuncoes" method="post" action="">  <input type="button" name="Submit" value="Função 1" onClick="funcao1();">  <input type="button" name="Submit" value="Função 2" onClick="funcao2();">  <input type="button" name="Submit" value="Função 3" onClick="funcao3();">  <input type="button" name="Submit" value="Função 4" onClick="funcao4();"></form></body></html>
Bom, isso resolve os problemas de criação de funções semi-identicas =)Abraço pra vcs!t+ http://forum.imasters.com.br/public/style_emoticons/default/bye1.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

o comando eval() executa uma string como se fosse um comando.

Por exemplo:

No caso que mostrei acima o eval vai executar a seguinte string:

string= "function funcao"+ i +"() { alert('Função "+ i +"') }"

ou seja, se o valor de i for igual a 1, o codigo que o eval vai gerar é:

 

function funcao1() { alert('Função 1') }

 

 

Concluindo: o comando eval está executando um string para criar a função1()

 

Abraços T+ http://forum.imasters.com.br/public/style_emoticons/default/bye1.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

muito bom Fleury....esse cara mata a cobra e mostra a cobra morta...

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.