Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
bom.. a função que interessa é esta:
como funciona: Digamos que você tenha um site, onde carrega os conteudos dentro de um layer utilizando ajax!.. e alguns desses conteudos possuem javascript.
fiz uma função, que le o texto retornado pelo XMLhttpRequest e procura por tags "<script>" e "</script>" e executa tudo o q tem dentro!.
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); } }}
no ajax fica:
if (xmlhttp.readyState==4){ // coloca o valor no objeto requisitado texto=unescape(xmlhttp.responseText.replace(/\+/g," ")); document.getElementById(destino).innerHTML=texto; // executa scripts extraiScript(texto);}O que me fez desenvolver isso, foi a necessidade de recarregar o centro da pagina quando um usuario faz login ou logoff no meu sistema.
uma coisa interessante, coloque o codigo js nas paginas q você carrega com ajax e o titulo do navegador vai mudar conforme o local, ex:
<script>document.title = ".:NomeDoSite - Historia";</script><script>document.title = ".:NomeDoSite - Busca";</script>
deem uma olhada:
matricula: 123
senha: 123
espero que seja util
[]'s
Isso ai não funciona pra funções certo ?pelo menos aqui não foi... ao acessar a função que retornei e apliquei no eval ele fala que não achou... =/
Putz...é isso q eu precisava.muito loco...vou testar aqui pra ver se da certinho agora.PERFEITO KRA!!!Nossa...eu tava loco pensando em como fazer isso, se você fosse muié eu t dava um bjo de lingua...mesmo se fosse feia.huahauhauhaaauhauahuahauhauhauaa
Isso ai não funciona pra funções certo ?pelo menos aqui não foi...ao acessar a função que retornei e apliquei no eval ele fala que não achou... =/
É verdade, mas a função do skywalker não deixa de ser uma maravilha.O pita iniciou esforços pra ver se alguém consegue carregar dinamicamente funções do java script: http://forum.imasters.com.br/index.php?showtopic=174045
Poxa, eu não entendi essa parte de layer com ajax na primeira postagem... Eu so meio newb no ajax, alguém poderia me explicar ??
Show de bola... Tava precisando msm disso valew!!!!
Poxa, eu não entendi essa parte de layer com ajax na primeira postagem... Eu so meio newb no ajax, alguém poderia me explicar ??
Como posso te dizer...isso ai é pra quem já "começou" ou deu um start... pelo que entendi você nem "fez" nada em ajax etc...tem uns exemplos na net etc etcse precisar te passo um cod que executa, e "imprime" onde você quer o arquivo lido etcflw
Consegui resolver o problema de não carregar funções.
É só usar um createElement ao invés do eval, que as funções serão carregadas também.
Testado no FF 1.5 e no IE 6.
Novo código ficou:
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); } }}
PS: Por favor, não apaguem os créditos ao skywalker e a mim quando usarem as funções. Um pouco de ética é bom...
Cara animallmeus comprimentos...agora explica pro tiu o que cada um dos comandos ali faz...=)
novo = document.createElement("script") novo.text = codigo; document.body.appendChild(novo);
Simplão:
1) Crio um novo elemento de script
2) coloco o código dentro dele
3) Mando o browser colocar o script como filho do browser.
Micox, sua solução funciona, mas acredito que ela tenha uma falha ainda ><ex.. eu chamo a pagina X via ajax e ela tem a função foo... se depois de um tempo eu carrego uma pagina Y e depois eu recrio a pagina X, vai criar uma segunda função com o mesmo nome.PS. Obrigado pelos elogios, tinha até abandonado o forum pois naum tinha recebido nenhum feedbackXD
ex.. eu chamo a pagina X via ajax e ela tem a função foo... se depois de um tempo eu carrego uma pagina Y e depois eu recrio a pagina X, vai criar uma segunda função com o mesmo nome.
heheh. Não entendi seu exemplo. Explica melhor ae... hehehTipo, o Pita também trabalhou e fez outra nova versão, dá uma olhada lá nela também.Assim agente finaliza um script redondinho e coloca ele no laboratório.Valeus...
elel falou que se você chamar a pagina X que extrai e cria uma função, carregar a pagina Y, e depois chamar a pagina X de novo, ele vai criar a função criada na primeira vez novamente. Teria que fazer alguns flags pra saber o que já foi carregado. Assim seria como se as funções estivesse no cache da página :)Abraços, t+
Puts. Agora sakei... Com o eval deve dar o mesmo problema.Mas acho que talvez isso não chegue a ser um problema não.Se eu carregar uma função com o nome de foo (como ele falou) e depois de um tempo eu carregar OUTRA com o nome de foo, ela não dará problemas no interpretador javascript (creio eu), ela apenas será SOBRESCRITA.Que que voces acham?PS.: Acho que rolava dos moderas de PHP moverem este pro fórum de javascript>Ajax.
Há um erro q naum sei se vcs corrigiram.
nas scripts onde há sinal + ele fica em branco entenderam
tipow
<script>variavel="bla";alert("bla"+variavel+"bla");</script>
fica assim:
<script>variavel="bla";alert("bla" variavel "bla");</script>
da pra corrigir esse erro?
Se vcs conseguirem postem a correcao, se eu conseguir eu posto...
E corrijam isso:
var fim = texto.indexOf('<script>', ini);
ele deve ser escrito assim para que naum haja erros:
var fim = texto.indexOf('<scr'+'ipt>', ini);
fmz http://forum.imasters.com.br/public/style_emoticons/default/devil.gif
Descodri o erro era no meu "ajax" no replaceJá corrigi
Genial... eu já estava no disispero tava quase puxando o script para a main page.... para ver se rodava !!!Micox é o cara... belo blog !
Ae kra naum to conseguindo execultar funcões
Tipo
function funcao(Variavel){
alert(Variavel)
}
java script:funcao("Mensagem");
Quando uso um link ele acusa como se naum existisse a função
O q há de errado?
-----------------------------------------------------------------------------------
Post Mesclado
-----------------------------------------------------------------------------------
descobri o erro só que eu tive que modificar o código de vcs
Agora tah dah hora
Depois eu posto e crie com esse mesmo código uma leitura do titulo
"<title></title>", pra quem for montar browsers ou páginações
Falow
-----------------------------------------------------------------------------------
Post Mesclado
-----------------------------------------------------------------------------------
Eu to postando aqui por q esse sistema é o mesmo de rodar SCripts
Eu montei esse código pq naum consegui acessar esse host:
O código pra pegar titulo ficou assim
function MudarTitulo(texto){//Eliminia quebra de linhastexto = texto.replace(/\n/g,"");var inicio = 0;inicio = texto.indexOf('<title', inicio);if (inicio >=0){inicio = texto.indexOf('>', inicio)+1;var fim = texto.indexOf('/title>', inicio);var fim = texto.indexOf('<', inicio);Titulo = texto.substring(inicio,fim);document.title=Titulo;}}
Eu coloquei o replace caso as pessoas escrevam o titulo assim:
<title>
titulo
</title>
Tá eu sei que vaiser ultio
Estou usando sua funcao extrairscript() so que ta dando um erro de
operação anulada e nao estou conseguindo tirar ?
isso so no explorer
na verdade tenta abrir essa url ai e nao sei onde ele esta chamando esse ponto apareceu depois que inseri a funcao extrairscript se poder me ajudar ficarei grato.
olha soh galera... na boa, essa funcao eh bastante falha... reconheco seu trabalho para fazer, nao ficou ruim, mas ainda ta longe de ser boa...
primeiro problema (olhei assim q vi seu replace):
<script type="text/javascript">document.write("<script> alert('aa'); </script>"); //olha a bronca</script>
seu "script parse" vai parar ali no meio do meu document.write()
bom, qto ao problema de funcoes citado, isso na verdade nao eh um problema, pois o eval realmente nao le funcoes, mas ele le atribuicoes, exemplo, vendo a funcao abaixo:
function minhaFuncao(arg1) { //executa alguma coisa}
se voce tentar carregar isso via eval nao vai pegar mesmo, mas se voce fizer o seguinte:
minhaFuncao = function(arg1) { //executa alguma coisa};
ai vai pegar, vale lembrar, se for fazer isso NAO COLOQUE o 'var' antes do nome minhaFuncao, se voce colocar o var antes, a funcao vai ser criada no escopo do eval, e so vai ser acessivel ao mesmo (enquanto funcoes normais tem escopo global e podem ser acessados de qualquer lugar)
e lembrando, usando atribuacao (da forma que eu mostrei), voce pode sobreescrever as funcoes que nao vai dar conflito de funcao, a que vale vai ser a ultima atribuida ;)
coletar o conteudo script seria mais facil usando a seguinte ER: (?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)
mas ainda esse ai acho que nao resolve o primerio problema que eu falei, eu ainda n tive tempo para implementar isso, mas vai a ideia pra quem quizer: use um sistema de pilha, adicione um valor a pilha a cada vez que for encontrado um "<script" e remova um item da pilha ao encontrar "</script>", pare o parser quando a pilha estiver zerada ;)
flws
Pessoal estou tendo este problema de precisar executar codigos javascript dentro de uma página carregada através do ajax e não ter como fazer. Pesquisando na net encontrei este fórum e vi que este tópico seria a resposta para meus problemas, mas infelizamente não funcionou, quando eu clico no link que chama a funcão nada acontece, a instrução de chamada do ajax para de funcionar. abaixo vou mandar o codigo original ( o que esta funcionando, porém não permite que execute nada de js ) e o codigo modificado que fiz com base neste topico e com a contribuição de outros colegas de outros topicos.
AJAX ORIGINAL
//INICINADO MODULOS DE VALIDAÇÃO DE CATEGORIAfunction loadXMLDoc15(url){req = null;if (window.XMLHttpRequest) { req = new XMLHttpRequest(); req.onreadystatechange = processReqChange15; req.open("GET", url, true); req.send(null);} else if (window.ActiveXObject) {try {req = new ActiveXObject("Msxml2.XMLHTTP.4.0");} catch(e) {try {req = new ActiveXObject("Msxml2.XMLHTTP.3.0");} catch(e) {try {req = new ActiveXObject("Msxml2.XMLHTTP");} catch(e) {try {req = new ActiveXObject("Microsoft.XMLHTTP");} catch(e) {req = false;}}}}if (req) { req.onreadystatechange=processReqChange15; req.open("GET",url,true); req.send();}}}function processReqChange15(){if (req.readyState == 4) {if (req.status == 200) {document.getElementById("div").innerHTML = req.responseText;} else {alert("Houve um problema ao obter os dados:\n" + req.statusText);}}}function carregando(valor){loadXMLDoc15("carregando.php?id="+valor);}
AJAX MODIFICADO COM BASE NO TOPICO
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; }}function loadXMLDoc15(url){req = null;if (window.XMLHttpRequest) { req = new XMLHttpRequest(); req.onreadystatechange = processReqChange15; req.open("GET", url, true); req.send(null);} else if (window.ActiveXObject) {try {req = new ActiveXObject("Msxml2.XMLHTTP.4.0");} catch(e) {try {req = new ActiveXObject("Msxml2.XMLHTTP.3.0");} catch(e) {try {req = new ActiveXObject("Msxml2.XMLHTTP");} catch(e) {try {req = new ActiveXObject("Microsoft.XMLHTTP");} catch(e) {req = false;}}}}if (req) { req.onreadystatechange=processReqChange15; req.open("GET",url,true); req.send();}}}function processReqChange15(){if (req.readyState == 4) { texto=unescape(xmlhttp.req.responseText.replace(/\+/g," ")); document.getElementById("div").innerHTML = texto; extraiScript(texto);}}function carregando(valor){ loadXMLDoc15("carregando.php?id="+valo);}
No codigo php chamo esta função que esta no arquivo ajax.js através da seguinte chamada.
<a href="#" onclick="carregando(10)">Listagem</a>
Se eu uso o ajax original (1 exemplo) funciona, busca a pagina como eu solicitei e talz
se eu usar os passos como descritos no forum o ajax nem busca a página que eu quero quando clico no link !
onde eu estou errando ? me ajudem ae pessoal, estou agarrado neste módulo !!!! http://forum.imasters.com.br/public/style_emoticons/default/upset.gif
E ai pessoal, sou novo no fórum e tb novo no AJAX, mas tive dando uma olha no código e quis dar um help para a galera então ai vai o que eu fiz,e aqui rolou certinho.
//---- Código em Js ----//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); /********************** * Alterado por Micox - micoxjcg@yahoo.com.br * Alterei pois com o eval não executava funções. * Alterado por Everton D. Silva - everton.silva@streamingshop.com.br * não estava retornando o valor ***********************/ var novo = document.createElement('script'); novo.type = 'text/javascript'; novo.language = 'javascript'; novo.text = codigo; document.body.appendChild(novo); } }}function loadXMLDoc15(url) { req = null; loc = "compila"; // Nome da div texto = null; // Procura por um objeto nativo (Mozilla/Safari) if (window.XMLHttpRequest) { req = new XMLHttpRequest(); req.onreadystatechange = processReqChange15; req.open("GET", url, true); req.send(null); // Procura por uma versao ActiveX (IE) } else if (window.ActiveXObject) { req = new ActiveXObject("Microsoft.XMLHTTP"); if (req) { req.onreadystatechange = processReqChange15; req.open("GET", url, true); req.send(); } } } function processReqChange15() { // apenas quando o estado for "completado" if (req.readyState == 4) { texto = unescape(req.responseText.replace(/\+/g," ")); extraiScript(texto); } }function carregando(valor){ loadXMLDoc15("testeAjax.asp?id="+valor);}
// --- Inicio do HTML --- //
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "[http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><title>Ajax</title><script type="text/javascript" language="javascript" src="ajax.js"></script></head><body><a href="java script:;" onclick="carregando('Você fez um AJAX');">Escreve mensagem</a><br /><br /><br /><div id="compila" style="display:none;"> <!-- só vai servir para complicar a página --></div><br /><br /><div id="doc" style="width:500px; height:250px; background:#CCCCCC; border:solid 1px #0000CC;"> <!-- Aqui será mostrado o valor do script --></div></body></html>
// --- Página ASP que tem o script --- //
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%><%Response.Charset = "ISO-8859-1" Response.Buffer=trueResponse.AddHeader "cache-control", "private"Response.AddHeader "pragma", "no-cache"Response.ExpiresAbsolute = #January 1, 1990 00:00:01#Response.Expires=Now()-1Response.AddHeader "Cache-Control", "must-revalidate"Response.AddHeader "Cache-Control", "no-cache"%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "[http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><title>Untitled Document</title><% id = Request.QueryString("id")%><script>function escreve(){ document.getElementById('doc').innerHTML = '<%=id%>';}escreve()</script></head><body> </body></html>
E isso ai pessoal, espero ter ajudado a resolver....
Estou com essa dúvida!! bom estou primeiramente testando,Ajax
eu tenho esse script em ajax com php para fzer uma pesquisa no db
e traser na masma página inicio.html o resultado instantaneamente!! enquando ainda o usuario esta dizitando o nome para busca "sem refresh"!! tem um erro ai eu não estou sabendo qual é ou se tiver um jeito melhor de fazer!! me ajudem Please!!!
arquivo inicio.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="[http://www.w3.org/1999/xhtml">](http://www.w3.org/1999/xhtml)
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Minha Primeira Pesquisa com Ajax</title>
</head>
<body>
<script type="text/javascript" language="javascript">
//var XMLHttp=null;
function criaXMLHttp(){
var XMLHttp;
try{
XMLHttp = new XMLHttpRequest();
}
catch(e){
try{
XMLHttp = new ActiveXObject("Msxml2.XMLHTTP");
}
}
catch(e){
XMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
return XMLHttp;
}
function executaXMLHttp(){
XMLHttp=criaXMLHttp();
var par = document.inicio.getElementById("parametro").value;
var resul = document.inicio.getElementById("resultado");
var url = "realiza.php?idparam="+par;
XMLHttp.open("GET",url,true);
XMLHttp.onreadystatechange=function(){
if( XMLHttp.readyState==4){
//alert('vai funcionar');
resul.innerHTML = XMLHttp.responseText;
}
else{
alert('Erro Fatalit/Babalit/friendship');
}
}
XMLHttp.send(null);
}
</script>
<strong>Digite um nome</strong>
<form name="inicio">
<input name="parametro" type="text" id="parametro" size="35" onKeyup= "executaXMLHttp();" />
</form>
<p align="center" id="resultado"></p>
</body>
</html>
arquivo realiza.php
<?
header("Content-Type: text/plain");
include("conexao.php");
$id = $_GET['idparam'];
$sql_exe = mysql_query("SELECT * FROM $tabs WHERE nome LIKE '$id%'",$conexao)or die(mysql_error());
$rows = mysql_num_rows($sql_exe);
if($rows==0){
print "<font color='#ff0000'>Nome Não encotrado</font>";
}
else{
while($resul = mysql_fetch_array($sql_exe)){
print $resul['nome']."\t\t".$resul['endereco']."<br>";
}
}
?>Ola pessoal eu utilizo ajax. E quero usar um scripts Thickbox dentro de uma pagina carregada com Ajax.
Mas nao consigo fazelo funcionar pois as imagens so abre em na mesma pagina.
se alguem poder me ajudar.
ficarei grato.
Meu codigo que abre as paginas em ajax.
// JavaScript Document
function ObjAjax(){
try{return new XMLHttpRequest()}
catch(e){try{return new ActiveXObject("Msxml2.XMLHTTP")}
catch(e){return new ActiveXObject("Microsoft.XMLHTTP")}}
return null;
}
function navegar(page){
ajax = new ObjAjax();
var div = document.getElementById("Conteudo");
ajax.onreadystatechange = function(){
if(ajax.readyState == 1){div.innerHTML="<center><br><img src='_img/ajax_preloader.gif'><p><div class='Fonte1'>Carregando a Página.</div></p></br></center>";}
if(ajax.readyState == 4){div.innerHTML=ajax.responseText;}
}
ajax.open("GET",page,true);
ajax.send(null);
}parabéns cara, ótima solução
Rapá. Muito boa sua solução... Pena que ninguem comentou...