Ajax não funciona jQuery + vRaptor 3

5 respostas
L

Bom dia amigos, estou com um problema que acredito que seja algo que eu estou fazendo errado. Estou fazendo uma aplicação que funcionará utilizando as requisições ajax. Pensei em fazer assim:
-> Ao acessar a página inicial (index), será montado o seu conteúdo fazendo uma requisição (ajax) para ou a página de login, ou a página inicial (home).

Até este ponto funciona normalmente, o problema ocorre ao postar as validações do formulário (clicar no botão login) que ao invés de retornar usando o ajax, ele direciona a página ignorando as introduções ajax - como se tivesse feito uma requisição normal.

Abaixo, coloco os fontes…

IndexController: Controle da página inicial

@Resource
public class IndexController {

    @Path("/")
    public void index() {}
}

WEB-INF/jsp/index/index.jsp

<html>
<head>
    
    ...

    <script type="text/javascript" src="js/functions.js"></script>
    <script type="text/javascript">
        $(document).ready(function() {
            //Carrega conteúdo
            showContent('home');

            //Clique do form de Login
            $('#formLogin button').live('click', function() {
                loginHandler();
            });
        });
    </script>
</head>
<body>

    ...

    <div id="conteudo">
        <div id="carregando"><img src="imagens/carregando.gif" /></div>
    </div>

   ...

</body>
</html>

function.js: Tem as funções de requisição (ainda não foi refatorado)

function showContent(url) {   

    //Carrega conteúdo
    $('#carregando').show().fadeIn('fast');
    $.ajax({
        url: url,
        success: function(resultado) {
            
			...
						
			$('#conteudo').append(resultado);
        },
        error:function (xhr){
            showErrorDetalhe(xhr.status +' - '+ xhr.statusText )
        }
    });
    $('#carregando').hide().fadeOut('fast');
}

function loginHandler() {
    var params = $('form').serialize();

    $('#carregando').show().fadeIn('fast');
    $.ajax({
        url: 'login',
        dataType: 'html',
        data: params,
        type: 'post',
        success: function(resultado) {
            
			...
			
			$('#conteudo').append(resultado);
        },
        error:function (xhr){
            showErrorDetalhe(xhr.status +' - '+ xhr.statusText )
        }
    });
    $('#carregando').hide().fadeOut('fast');
    return false;
}

HomeController

@Resource
public class HomeController {
    private final Result result;

    public HomeController(Result result) {
        this.result = result;
    }

    @Get @Path("/home")
    @Restrito
    public void index() {        
    }
}

UsuarioController

@Resource
public class UsuarioController {
    private final AlunoDao dao;
    private final Usuario usuario;
    private final Result result;
    private final Validator validator;

    public UsuarioController (AlunoDao dao, Result result, Validator validator,
            Usuario usuario) {
        this.dao = dao;
        this.usuario = usuario;
        this.result = result;
        this.validator = validator;
    }

    @Get @Path("/login")
    public void loginForm(){
    }
    
    @Post @Path("/login")
    public void login(Aluno aluno){
        Aluno carregado = this.dao.existeUnico(aluno);
        if (carregado == null) {
            validator.add(new ValidationMessage("O E-mail e/ou Senha não constam em nosso Banco de Dados", "usuario.login"));
        }
        validator.onErrorUsePageOf(UsuarioController.class).loginForm();

        this.usuario.login(carregado);
        result.redirectTo(HomeController.class).index();
    }

    @Path("/logout")
    public void logout() {
        usuario.logout();
        result.redirectTo(UsuarioController.class).loginForm();
    }
}

Poderiam me ajudar por favor?

5 Respostas

Lucas_Cavalcanti

vc pode colocar o loginHandler no submit do form, não precisa ser no button.

habilita o firebug no seu firefox e veja se não está acontecendo algum erro na sua função loginHandler. Qqer erro que acontecer vai impedir aquele return false, e vai invocar o botão normalmente

L

Olá Lucas, obrigado pela atenção…

Então, utilizando o Chrome (Developer Tools) eu ví que o resultado do LoginHandler está vazio.

Foi a unica coisa diferente.

[]s

Lucas_Cavalcanti

fica difícil entender o que está acontecendo…

tente fazer isso:

$('#id-do-form').submit(function(e) {
   e.preventDefault();
   loginHandler();
}

e tire o handler do botão

L

Grande Lucas!!!

Isto mesmo, colocando o preventDefault() deu certo… Agora fica uma pergunta, que diabos faz isto… Lí a documentação e não entendi.

[]s

Lucas_Cavalcanti

previne que ele chame a ação padrão do evento, no caso o submit do form

Criado 11 de abril de 2011
Ultima resposta 11 de abr. de 2011
Respostas 5
Participantes 2