[RESOLVIDO] (2) Jquery Validate + Vraptor

jQuery Validate + vRaptor
Versão vRaptor: 3
versão jQuery: jquery-1.7.2.js
versão jQuery UI: jquery-ui-1.8.20.custom.min.js

Não sei se essa duvida é por causa vRaptor mesmo …

Estou fazendo a validação com jQuery no vRaptor, sobre uma tela de cadastro de usuário, pesquisando aqui no GUJ achei
um tópico que resolvesse a primeira parte de meu problema, o tópico:

[RESOLVIDO] Jquery Validate + Vraptor

Porém deparei com uma situação um pouco diferente que não consegui resolver.

No casso da senha, para redigitar a senha como ficaria?
No meu exemplo

"usuario.senha": { required: true }, repete_senha:{ required: true, equalTo: "#usuario.senha" }

assim não funcionou …
como seria então ?

Você cria um campo para ele redigitar a senha, onde você verifica se são iguais.

<input type="password" name="usuario.senha" id="senhaQueEuVouUsar" />
<input type="password" name="redigitar_senha" id="red_senha" />
// ...
"usuario.senha": {  
        required: true  
    },  
"redigitar_senha":{ 
// não precisa do required, pois o outro já é required...
        equalTo: "#senhaQueEuVouUsar"  
    }  

Ahhh sim,
Desse jeito ele vai pelo id do campo, pensei que era pelo name.
Resolvido, obrigado Rafael Guerreiro .

Mas se você fizer um teste, isso ai não vai funcionar no IE8. Pois ele não consegue trabalhar muito bem quando o name tem caractere especial (o ponto, no caso).

Então, para funcionar, você deve fazer a chamada pelo ID (cuidado para não colocar caractere especial no ID).

Ai fica dessa forma:

<form id="formulario" action="<c:url value="/grupo/" />" method="post" style="width: 100%;">
   <fieldset>
      <input type="text" id="idDoInput" name="obj.atributo" />
   </fieldset>
</form>
<script type="text/javascript">
   $(document).ready( function() {
      $('#formulario').validate();
      $('#idDoInput').rules('add',{
         required:true,
         messages:{
            required:'Este campo é obrigatório.'
         }
      });
   });
</script>

O JQuery deveria normalizar isso, Rafael… Nunca tive problema usando names com pontos…

No caso do IE acontece.
É horrível mesmo.

Tem uma série de coisas que o jQuery não faz.
Por exemplo no firefox: se você definir um elemento como display: none; e com jQuery você der um $(’#idDoElemento’).show(); não vai funcionar.
Já no IE, chrome e outros, funciona.

se vc coloca o display:none no css (e não no style) funciona sim…

o propósito do JQuery eh vc escrever a mesma coisa pra funcionar em todos os browsers… se vc está com uma versão razoavelmente atualizada, ele deveria normalizar tudo isso.

[quote=Lucas Cavalcanti]se vc coloca o display:none no css (e não no style) funciona sim…
[/quote]
Pode ser exatamente esse o problema… Mas isso seria um bug, não?

[quote=Lucas Cavalcanti]
o propósito do JQuery eh vc escrever a mesma coisa pra funcionar em todos os browsers… se vc está com uma versão razoavelmente atualizada, ele deveria normalizar tudo isso.[/quote]
Estranho, pois eu uso a versão atual do jQuery e do plugin validator… Atualmente estou desenvolvendo uma aplicação que só vai rodar no IE8, essa foi a única forma que eu consegui fazer o plugin funcionar no IE8.

[quote=Rafael Guerreiro][quote=Lucas Cavalcanti]se vc coloca o display:none no css (e não no style) funciona sim…
[/quote]
Pode ser exatamente esse o problema… Mas isso seria um bug, não?
[/quote]
Talvez… mas vc não deveria estar usando style inline :wink: criar um .hidden {display:none} e usar não custa nada :wink:
ele implementa o show colocando um display:block no style… daí fica “display:none; display: block” no style, o browser
renderiza isso do jeito que ele achar melhor.

[quote=Rafael Guerreiro]

[quote=Lucas Cavalcanti]
o propósito do JQuery eh vc escrever a mesma coisa pra funcionar em todos os browsers… se vc está com uma versão razoavelmente atualizada, ele deveria normalizar tudo isso.[/quote]
Estranho, pois eu uso a versão atual do jQuery e do plugin validator… Atualmente estou desenvolvendo uma aplicação que só vai rodar no IE8, essa foi a única forma que eu consegui fazer o plugin funcionar no IE8.[/quote]
Estranho…
Em todo caso costumo colocar as validações inline nos próprios inputs:

<input type="text" id="idDoInput" name="obj.atributo" class="required" minlength="5" maxlength="13" />  

A ideia do class hidden é muito boa e resolve esse problema.

Sim, inline funciona. Mas como fazer para internacionalizar usando o messages.properties nas mensagens?

vc pode mudar a msg de cada validação específica…
dá uma olhada nas i18n que já vem junto com o jquery validate, é daquele jeito que muda as msgs.

Então, mas aí voltaria ao problema da chamada pelo name ou pelo ID.
Eu faço isso:

   $('#formulario').validate();  
   $('#idDoInput').rules('add',{  
      required:true,  
      messages:{  
         required:'&lt;fmt:message key="campoObrigatorio" /&gt;'  
      }
   });

não… pq vc colocaria essa msg pra todas as validações de “required”, não importando o campo.

se vc precisar fazer uma validação específica, vc pode fazer um msg de validação aqui

[quote=Rafael Guerreiro]Mas se você fizer um teste, isso ai não vai funcionar no IE8. Pois ele não consegue trabalhar muito bem quando o name tem caractere especial (o ponto, no caso).

Então, para funcionar, você deve fazer a chamada pelo ID (cuidado para não colocar caractere especial no ID).

[/quote]

No meu IE8 até agora tá funcionando …
IE: 8.0
Codificação: 256-bit

&lt;td&gt;&lt;input id="usuariosenha" name="usuario.senha" type="password"&gt;&lt;/td&gt;

repete_senha:{ equalTo: "#usuariosenha" }

sonictk, eu estava me referindo à este trecho:

"usuario.senha": {  
        required: true  
    }
//...

Essa é, com certeza, a forma em que o código fica menor.