Como fazer para aguardar a carga Servlet de uma função Ajax

10 respostas
C

Olá pessoal,
estou desenvolvendo um projeto Servlet usando Ajax,
mas estou tendo dificuldade em fazer o campo do formulário pegar focus() .
Acontece que uma chamada a função makeRequest() faz com que seja montado o código HTML a partir de uma carga Servlet ao Servidor e retorne ao cliente, logo em seguida convoco o focus(), porém estou percebendo que a linha de comando " document.FormTrocaProcesso.strNome.focus(); " não está aguardando o retorno da requisição da função makeRequest().
Com isso está dando erro, já que o formulário não foi criando a tempo para passar o focus().
Alguém tem alguma dica para que a carga da função seja completada para depois receber o focus(); ?

// Codigo

function trocaprocesso(){

TITULO = Pesquisa Processo;

makeRequest(lerhtml?arqhtml=TrocaProcesso, TITULO,1,650,150 );

document.FormTrocaProcesso.strNome.focus();

}

Grato

10 Respostas

M

não sei se entendi bem, mas vamos lá…

Pode coloca um if para testar se o campo já esta carregado “document.FormTrocaProcesso.strNome” não vai dar o erro mas tb não vai dar o focus :stuck_out_tongue:

Sugeria colocar o javascript no final da página, quem sabe funciona. Ou dentro do retorno do servlet, dae passava o nome do form “FormTrocaProcesso” e campo “strNome”;

Ex:
makeRequest(‘lerhtml?arqhtml=TrocaProcesso’, TITULO,1,650,150, “form1”, “campo1”);

Bom foi só uma sugestão.

falou

C

Olá Mauricio de Mello,

eu já tentei isso, mas parece que o JavaScript não responde fora da pagina inicial que retorna o Servlet para onde é alocado no DIV
Alias eu só estou conseguindo carregar o Ajax e demais funções JavaScript nessa pagina inicial.

Pelas tentativas já esgotadas estou concluindo que o só terá focus() após concluída a carga do servlet solicitado pela requisição da função Ajax.

Colocando um alert(“Requisição completa”) entre a requisição e o comando focus() funciona, ou seja, ao clicar na mensagem “Requisição completa” o fucos() pegar, pois nesse caso teve um breck.

Talvez com um while funcionaria, mas não estou conseguindo criar uma lógica para que o laço while cheque o termino da carga do servlet.

Y

Cara, o problema é simples; a requisição via Ajax pode ser (e é o seu caso) assíncrona, ou seja, o script dispara a chamada pra página e continua a executar o restante do script. Você tem que fazer o seguinte: no seu makeRequest, algum handler TEM de estar sendo chamado pra pegar o conteúdo retornado e colocá-lo na página. Esse handler é que deverá fazer essa chamada ao focus() APÓS setar o conteúdo. Vou expor um exemplo e espero que entenda:

function makeRequest()
  {
    var http = new Object(); // criação do objeto Ajax
    http.open("GET", "url", true);
    http.onreadystatechange = handler;
    http.send(null);
  }

function handler()
  {
   if (http.readyState == 4)
     {
       if (http.status == 200)
         {
           layer.innerHTML = http.responseText; // aqui você usa o HTML que foi retornado pelo teu Servlet
           // e agora A MÁGICA
           document.FormTrocaProcesso.strNome.focus();
         }
     }
  }

Caso ainda não funcione, tente alterar a linha do focus() para:

Outra forma ainda é tornar a tua requisição síncrona o que, na prática, significa trancar o teu navegador até que a Servlet retorne todo o conteúdo, uma prática nada recomendada.

kissdemon

Simples: faça a chamada do focus() no onLoad do body da sua pagina.

Isso garante que o código JS será executado apenas quando toda a sua pagina estiver sido criada.

[]'s

Y

kissdemon:
Simples: faça a chamada do focus() no onLoad do body da sua pagina.

Isso garante que o código JS será executado apenas quando toda a sua pagina estiver sido criada.

[]'s

É que o campo cujo é necessário setar o focus() só é renderizado na tela após uma requisição via Ajax. Ele não faz parte do body original, logo não é possível ser acessado pelo próprio.

:wink:

M

Não sei por que você carrega todo o form via ajax…?

Por que não faz um jsp para cada form ou utiliza uma framework, estou achando meio estranho este jeito de progamar.

Eu utilizo ajax com prototype mas só para o que realmente preciso.

Falou

C

Caso ainda não funcione, tente alterar a linha do focus() para:

window.setTimeout("document.FormTrocaProcesso.strNome.focus()", 300);

Valeu Yky Mattshawn, o window.setTimeout ficou perfeito, agoram sim o fucus está pegando.

function trocaprocesso(){
TITULO = "Pesquisa Processo";
makeRequest('lerhtml?arqhtml=TrocaProcesso', TITULO,1,650,150 );
window.setTimeout("document.FormTrocaProcesso.strNome.focus()", 300);
}
C

Mauricio de Mello:
Não sei por que você carrega todo o form via ajax…?

Por que não faz um jsp para cada form ou utiliza uma framework, estou achando meio estranho este jeito de progamar.

Eu utilizo ajax com prototype mas só para o que realmente preciso.

Falou

Olá Mauricio de Mello,
eu nao estou carregado os forms via Ajax, eu estou usando o Ajax para requisitar um Servlet ao qual esse sim faz uma leitura de um arquivo HTML e retonar para ser alocado no DIV da pagina principal. Pode até ser uma forma estranha de programar, mas está muito bom de programar desse jeito, simples, facil e traquilo para fazer manutenções.

Segue abaixo Servlet para carregar do HTML previamente criado.

package SEU_package;

//Todos esse imports serve para o servlet funcionar
import java.io.*;
import javax.servlet.*; 
import javax.servlet.http.*;

public class CarregaHTML extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

	response.setContentType("text/html;");
	response.setCharacterEncoding("iso-8859-1");
	
	String arqhtml = request.getParameter("arqhtml").trim();
	
	String arquivoHTML = "";
	try {
	       //FileInputStream fin = new FileInputStream("/html/"+arqhtml+".html");

FileInputStream fin = new FileInputStream "C:\\TomCat\\webapps\\Prototype\\html\\"+arqhtml+".html");
       
       
       
       
       
       int i;
        while ((i = fin.read()) >= 0) {
        	arquivoHTML += (char)i ;
        }
        
        
        String arquivoMudado = arquivoHTML.replace("|labelCampoForm|", "NOME DO TITULO");
        
        
        
        response.getWriter().write(arquivoMudado);

	}catch(FileNotFoundException e) {
	response.getWriter().write("Arquivo não encontrado.");
}catch(SecurityException e) {
	response.getWriter().write("Arquivo não acessível.");
}catch(IOException e) {
	response.getWriter().write("Erro de IO.");

	}

}
}
M

blz entendi o que você esta fazendo, não quis questionar só dar sugestões :lol:

Falou

A

O problema é que se sua ida e volta no servlet demorar mais de 300 milisegundos vai continuar dando o mesmo problema. É melhor utilizar a opção do handler que sempre vai funcionar.

Alberto

Criado 26 de fevereiro de 2007
Ultima resposta 4 de mar. de 2007
Respostas 10
Participantes 5