Como fazer para aguardar a carga Servlet de uma função Ajax
10 respostas
C
carlosgeiser
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(); ?
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
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”;
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
Yky_Mattshawn
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:
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
Yky_Mattshawn
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.
M
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
C
carlosgeiser
Caso ainda não funcione, tente alterar a linha do focus() para:
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.
packageSEU_package;//Todos esse imports serve para o servlet funcionarimportjava.io.*;importjavax.servlet.*;importjavax.servlet.http.*;publicclassCarregaHTMLextendsHttpServlet{protectedvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType("text/html;");response.setCharacterEncoding("iso-8859-1");Stringarqhtml=request.getParameter("arqhtml").trim();StringarquivoHTML="";try{//FileInputStream fin = new FileInputStream("/html/"+arqhtml+".html");FileInputStreamfin=newFileInputStream"C:\\TomCat\\webapps\\Prototype\\html\\"+arqhtml+".html");inti;while((i=fin.read())>=0){arquivoHTML+=(char)i;}StringarquivoMudado=arquivoHTML.replace("|labelCampoForm|","NOME DO TITULO");response.getWriter().write(arquivoMudado);}catch(FileNotFoundExceptione){response.getWriter().write("Arquivo não encontrado.");}catch(SecurityExceptione){response.getWriter().write("Arquivo não acessível.");}catch(IOExceptione){response.getWriter().write("Erro de IO.");}}}
M
Mauricio_de_Mello
blz entendi o que você esta fazendo, não quis questionar só dar sugestões :lol:
Falou
A
alots_ssa
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.