Ir para conteúdo

Arquivado

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

Gastro

Ler função JS "trazida" via AJAX

Recommended Posts

function extraiScript(texto){	// inicializa o inicio ><	var ini = 0;	// loop enquanto achar um script	while (ini!=-1){		// procura uma tag de script		ini = texto.indexOf('<script', ini);		// se encontrar		if (ini >=0){			// define o inicio para depois do fechamento dessa tag			ini = texto.indexOf('>', ini) + 1;			// procura o final do script			var fim = texto.indexOf('</script>', ini);			// extrai apenas o script			codigo = texto.substring(ini,fim);			// executa o script			eval(codigo);		}	}}

Galera estou usando o código acima pra ler uma ou mais funções que "trago" via o AJAX

 

Se coloco o nome da função logo abaixo do eval, ele tb le a função.

 

Porém, se chamo a função atravez de um link ou coisa do tipo a mesma não executa, fala que o objeto não existe. alguem sabe porque ?

Ou uma solução...

valeu a força

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá. Tudo bem?!

 

(Isso é uma asneira só! =))

Ao invés de usar o eval, tente jogar essa String com o script em um DIV na página.... ah... mas o script tem que estar dentro do <script></script> para funcionar, então não precisaria fazer aqueles trabalhos para retirar o <script> e </script> do início e do final da String respectivamente.

 

 

Espero ter ajudado. Abraço.

 

 

Editado:

=======

Pessoal!! Desculpem a gafe... dei a resposta baseado em alguns conhecimentos meus, porém não efetuei testes! Resultado?! Disse algo que NÃO procede.

 

Porém testei o eval. Ele consegue avaliar também funções, porém as funções e variáveis avaliadas só existem no contexto em questão. Se eu uso eval dentro de uma função só conseguirei acessar uma variável dentro daquela função!

 

Nesse casso específico, coloque a instrução do eval dentro do contexto global da página.

 

Mais uma vez pesso desculpas à todos. E obrigado ao amigo MICOX pelo alerta! :)

 

Abraço à todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

dmarcosm, beleza?

 

Esse problema já foi discutido antes e ninguem achou uma solução para funcionar sem o eval. Se voce conseguir fazer funcionar sem o eval poste aí pra ajudar a galera... té mais...

 

 

PS.: Gastro, só faltou voce dar os créditos pro criador dessa ótima função né? hehe.

Função inicial feita pelo SkyWalker.TO: http://forum.imasters.com.br/index.php?sho...0&gopid=547500&

Compartilhar este post


Link para o post
Compartilhar em outros sites

dmarcosm, beleza?

 

Esse problema já foi discutido antes e ninguem achou uma solução para funcionar sem o eval. Se voce conseguir fazer funcionar sem o eval poste aí pra ajudar a galera... té mais...

 

 

PS.: Gastro, só faltou voce dar os créditos pro criador dessa ótima função né? hehe.

Função inicial feita pelo SkyWalker.TO: http://forum.imasters.com.br/index.php?sho...0&gopid=547500&

sim sim ... nem me liguei

olha só tava pensando...

 

Vamos imaginar que cada pagina tenha suas funções diferentes...

Em vez de ler tudo quando entra...

faz assim...

Ao acessar o arquivo define o SRC de um iframe com um arquivo .js com as respectivas funções...

dai é só chamar a mesma pelo nome do iframe e boa...

 

deu de se ligar ?

qq coisa posta ai

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

dmarcosm, beleza?

 

Esse problema já foi discutido antes e ninguem achou uma solução para funcionar sem o eval. Se voce conseguir fazer funcionar sem o eval poste aí pra ajudar a galera... té mais...

 

 

PS.: Gastro, só faltou voce dar os créditos pro criador dessa ótima função né? hehe.

Função inicial feita pelo SkyWalker.TO: http://forum.imasters.com.br/index.php?sho...0&gopid=547500&

sim sim ... nem me liguei

olha só tava pensando...

 

Vamos imaginar que cada pagina tenha suas funções diferentes...

Em vez de ler tudo quando entra...

faz assim...

Ao acessar o arquivo define o SRC de um iframe com um arquivo .js com as respectivas funções...

dai é só chamar a mesma pelo nome do iframe e boa...

 

deu de se ligar ?

qq coisa posta ai

 

Cara.. fiz aqui e fico bala

 

na minha pagina principal tenho....

 

<iframe name="carreJs" id="carreJs" src="" height="0" width="0"></iframe>

 

no arquivo que leio (no caso de um mural de recados) tenho....

 

<script language="javascript">

document.getElementById('carreJs').src = 'func/le_funcoes.php?sess=mural';

//<;;>

</script>

 

le_funcoes.php

 

<?	$sess = $_GET[sess];		if($sess == "mural"){?><script src="func_mural.js"></script>aaa<?	}?>
pronto... agora só chamar a função.....

 

carreJs.nomeDaFuncao();

 

----

caso ninguem entendeu ou tem um jeito melhor posta aii

flw

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gastro, vou testar. Se funcionar realmente você é the king. :) heheh. É uma solução muito boa.Mas você testou isso usando ajax? você puxou o iframe através de ajax? Vou fazer alguns testes aqui também.Té mais...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gastro, vou testar. Se funcionar realmente você é the king. :) heheh. É uma solução muito boa.Mas você testou isso usando ajax? você puxou o iframe através de ajax? Vou fazer alguns testes aqui também.Té mais...

No meu caso o iframe ficou na janela principalMASSSSeguindo tua dica...trouxe ele pelo ajax...e funco legal IHAAAAAA

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gastro, vou testar. Se funcionar realmente você é the king. :) heheh. É uma solução muito boa.Mas você testou isso usando ajax? você puxou o iframe através de ajax? Vou fazer alguns testes aqui também.Té mais...

No meu caso o iframe ficou na janela principalMASSSSeguindo tua dica...trouxe ele pelo ajax...e funco legal IHAAAAAA
o palha é que no firefox eu dei um salvar como na pagina e ele salvou o arquivo com funções... no exibir codigo fonte nada aparece....alguem sabe uma manha pro "salvar como" do navegador não funcionar ?vlw=)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal a idéia, e se tentar fusionar com o codigo do SkyWalker??Se ao invés de dar um eval no codigo script tentarmos joga-lo dentro do iframe???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal a idéia, e se tentar fusionar com o codigo do SkyWalker??Se ao invés de dar um eval no codigo script tentarmos joga-lo dentro do iframe???

não tem como... precisa-se do eval pra executar a linhadocument.getElementById('carreJs').src = 'func/le_funcoes.php?sess=mural';como no exemplo acima... se jogar o src do iframe como um arquivo.JS ele tenta baixar e não ler...flw

Compartilhar este post


Link para o post
Compartilhar em outros sites

AAAAAaaaaaaaaaaaaaaaa rapaziada http://forum.imasters.com.br/public/style_emoticons/default/joia.gif http://forum.imasters.com.br/public/style_emoticons/default/joia.gif http://forum.imasters.com.br/public/style_emoticons/default/clap.gif http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

 

POde bater continência pro Mestre aqui que ele conseguiu de um jeito simplão!!!! http://forum.imasters.com.br/public/style_emoticons/default/yay.gif http://forum.imasters.com.br/public/style_emoticons/default/yay.gif

 

Usei o createElement e deu certo. Agora é só usar a NOVA função extraiScript sem preocupação.

Testado com sucesso no IE6 e no FF1.5.

 

Por favor, não apaguem os créditos ao skywalker e a mim quando usarem as funções. Um pouco de ética é bom...

 

function extraiScript(texto){//Maravilhosa função feita pelo SkyWalker.TO do imasters/forum//http://forum.imasters.com.br/index.php?showtopic=165277	// inicializa o inicio ><	var ini = 0;	// loop enquanto achar um script	while (ini!=-1){		// procura uma tag de script		ini = texto.indexOf('<script', ini);		// se encontrar		if (ini >=0){			// define o inicio para depois do fechamento dessa tag			ini = texto.indexOf('>', ini) + 1;			// procura o final do script			var fim = texto.indexOf('</script>', ini);			// extrai apenas o script			codigo = texto.substring(ini,fim);			// executa o script			//eval(codigo);			/**********************			* Alterado por Micox - micoxjcg@yahoo.com.br			* Alterei pois com o eval não executava funções.			***********************/			novo = document.createElement("script")			novo.text = codigo;			document.body.appendChild(novo);		}	}}

Compartilhar este post


Link para o post
Compartilhar em outros sites

AAAAAaaaaaaaaaaaaaaaa rapaziada http://forum.imasters.com.br/public/style_emoticons/default/joia.gif http://forum.imasters.com.br/public/style_emoticons/default/joia.gif http://forum.imasters.com.br/public/style_emoticons/default/clap.gif http://forum.imasters.com.br/public/style_emoticons/default/clap.gif POde bater continência pro Mestre aqui que ele conseguiu de um jeito simplão!!!! http://forum.imasters.com.br/public/style_emoticons/default/yay.gif http://forum.imasters.com.br/public/style_emoticons/default/yay.gif Usei o createElement e deu certo. Agora é só usar a NOVA função extraiScript sem preocupação.Testado com sucesso no IE6 e no FF1.5.Por favor, não apaguem os créditos ao skywalker e a mim quando usarem as funções. Um pouco de ética é bom...

function extraiScript(texto){//Maravilhosa função feita pelo SkyWalker.TO do imasters/forum//http://forum.imasters.com.br/index.php?showtopic=165277	// inicializa o inicio ><	var ini = 0;	// loop enquanto achar um script	while (ini!=-1){		// procura uma tag de script		ini = texto.indexOf('<script', ini);		// se encontrar		if (ini >=0){			// define o inicio para depois do fechamento dessa tag			ini = texto.indexOf('>', ini) + 1;			// procura o final do script			var fim = texto.indexOf('</script>', ini);			// extrai apenas o script			codigo = texto.substring(ini,fim);			// executa o script			//eval(codigo);			/**********************			* Alterado por Micox - micoxjcg@yahoo.com.br			* Alterei pois com o eval não executava funções.			***********************/			novo = document.createElement("script")			novo.text = codigo;			document.body.appendChild(novo);		}	}}
micox... saca só... quando carrego um arquivo e leio por esta função está função abaixo
function get(obj, arquivo){	var arquivo = arquivo;	if(arquivo){		var poststr = "nome=" + escape( document.getElementById("de").value ) +		"¶=" + escape( document.getElementById("para").value ) +		"&email=" + escape( document.getElementById("email").value ) +		"&mensagem=" + escape(document.getElementById("mensagem").value );		mlAtua(arquivo, 'centro', 'post', poststr);		mlAtua('mural_apre_todos.php', 'centro');	}}
ele da erro ... dizendo que espera ";"percebi que é por causa dos "nome=" +parece que ele não aceita a concatenação :( alguem tem ideia pq isso ocorre ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é que ele não aceita concatenação. É que no javascript quebra de linha também é considerada fim de instrução.Ou seja, você terá que colocar a concatenação tudo em uma linha só.Mas isto não teve a ver com a função de carregar JS. Seria melhor se você tivesse aberto outro tópico.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Micox, eu estava trabalhando um pouco com Ajax, testes com algumas coisas que irei encarar pela frente quando for realmente começar a desenvolver, e estou tendo alguns problemas quando trabalho com arquivo .js "<script language="javascript" src="ajax.js"></script>".Existe alguma técnica que você conheca que não utilize esse exemplo de iframe??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Leia o último script que coloquei e, no final, altere o src do script em vez de setar o text dele. Talvez de certo.

 

em vez de

novo = document.createElement("script")			novo.text = codigo;			document.body.appendChild(novo);

Use

novo = document.createElement("script")			novo.src = "seuscript.js";			document.body.appendChild(novo);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Micox, eu segui sua idéia e ficou assim:

function ExtraiScript(texto){	var ini, pos_src, fim, codigo;	var objScript = null;	ini = texto.indexOf('<script', 0)	while (ini!=-1){		var objScript = document.createElement("script");		//Busca se tem algum src a partir do inicio do script		pos_src = texto.indexOf(' src', ini)		ini = texto.indexOf('>', ini) + 1;		//Verifica se este e um bloco de script ou include para um arquivo de scripts		if (pos_src < ini && pos_src >=0){//Se encontrou um "src" dentro da tag script, esta e um include de um arquivo script			//Marca como sendo o inicio do nome do arquivo para depois do src			ini = pos_src + 4;			//Procura pelo ponto do nome da extencao do arquivo e marca para depois dele			fim = texto.indexOf('.', ini)+4;			//Pega o nome do arquivo			codigo = texto.substring(ini,fim);			//Elimina do nome do arquivo os caracteres que possam ter sido pegos por engano			codigo = codigo.replace("=","").replace(" ","").replace("\"","").replace("\"","").replace("\'","").replace("\'","").replace(">","");			// Adiciona o arquivo de script ao objeto que sera adicionado ao documento			objScript.src = codigo;		}else{//Se nao encontrou um "src" dentro da tag script, esta e um bloco de codigo script			// Procura o final do script			fim = texto.indexOf('</script>', ini);			// Extrai apenas o script			codigo = texto.substring(ini,fim);			// Adiciona o bloco de script ao objeto que sera adicionado ao documento			objScript.text = codigo;		}		//Adiciona o script ao documento		document.body.appendChild(objScript);		// Procura a proxima tag de <script		ini = texto.indexOf('<script', fim);		//Limpa o objeto de script		objScript = null;	}}

Na pagina que eu carrego eu tenho o seguinte código:

<script language="javascript" src=teste.js></script><!-- nesse arquivo só tem um alert("1");--><script language="javascript">	alert("2");</script>

Acontece o seguinte, quando carrego a página ele não segue a ordem apresentada no arquivo, o navegador, primeiro executa o alert("2") e depois o alert("1").

 

Não sei se isso é um erro ou alguma outra coisa, mas me parece que o navegador primeiro executa o que está na página e depois busca os arquivos que são referenciados na página, eu acho isso pq o navegador normalmente mostra a página para depois começar a carregar as imagens que estão na página, ele deve seguir o mesmo principio com includes, etc.

 

Só postei para dar um toque que isso acontece

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito bom seu script (coloca seus créditos lá tb. heheh. Agora são 3: O skywalker, eu e você).Ele permite carregar mais de um script. Isso é bom. Mas quanto à falha que você falou, realmente é extranho, eu li e entendi seu script e ele tá na ordem certinha.Agente tem que dar umas testadas. Coloca uns alert aí no meio pragente ver qual scirpt ele tá lendo primeiro. Sei lá...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu realizei alguns testes, colocando na página primeiro a chamada para um arquivo de scripts e depois o bloco de scripts, e segue o que ocorreu:

 

NO IE 6

 

Quando eu executo sem nenhum alert() de controle, ele executa primeiro o javascript que está na página e depois o que está no arquivo, MAS quando eu adiciono um alert() de controle depois do "objScript.src = codigo;" para dar uma pausa, ele executa na ordem correta, primeiro o que está no arquivo e depois o que está na página.

 

O que ocorre é que no primeiro caso, quando o javascript executa o codigo para jogar o arquivo dentro do objeto ele não para a execução para esperar terminar de carregar o arquivo, ele continua a execução e começa a processar o bloco que está na página, após executar o bloco da página ele consegue terminar de carregar o arquivo, nesse momento que ele executa o codigo do arquivo.

 

Mas no segundo caso, quando eu adicionei o alert() de controle, o que ocorreu foi que executou o codigo para jogar o arquivo dentro do objeto("objScript.src = codigo;"), logo em seguida o alert() de controle deu uma pausa, o que deu tempo para terminar de carregar o arquivo, então imediatamente ele executou o conteudo do arquivo, no meu teste ele jogou um alert() do arquivo por cima do alert() de controle sem eu ter fechado o primeiro alert(), logo depois seguiu a execução normalmente e executou o codigo que estava na pagina.

 

 

NO FIREFOX 1.5.0.2

 

Ele sempre executou na ordem correta, primeiro o codigo que está no arquivo e depois o código que está na página

 

Quando eu adicionei os alert() de controle, o Firefox primeiro mostrou primeiro todos os alert() de controle e depois executou os códigos na ordem que são adicionados ao documento("document.body.appendChild(objScript);")

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa.. beleza.. galera.

E o seguinte.. usei a funçao de voces ai na minha aplicação..

Ate ai tudo bem..

 

So que to trabalhando com abas..

Em cada aba o ajax busca paginas diferente e poem no mesmo div da aba anterior..

 

Entao..

A aba1 carrega no onload da pagina e a aba2 carrega quando clico.

e carrega outra pagina na mesma div da primeira.

 

E tente chamar scripts da aba2 e nao funciona.. diz metodo nao existe.

E os script anterior da aba1 continuam existindo..

 

Do um alert no codigo lido pela funçao esta ok.

So nao funciona..

 

Teriam uma ideia de como me ajudar?

E meio complicadinho de explicar.. http://forum.imasters.com.br/public/style_emoticons/default/cry.gif

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.