Validação de jQuery Validate + JSONP cross domain

Eu tenho um problema usando jQuery Validate e validação remota entre domínios. Meu cenário é:

  • Aplicativo para celular PhoneGap
  • Scripts PHP no servidor remoto
  • jQuery 1.9.1
  • jQuery Mobile 1.4.2 como estrutura de interface
  • jQuery Validar 1.12.0 como plugin de validação de formulários

Para interagir com o servidor, uso as chamadas do jQuery Ajax e o JSONP como técnica de comunicação entre domínios. Eu tenho que validar alguns campos de formulário usando regras remotas, mas como essas chamadas estão em outro domínio (do aplicativo para o servidor), eu tenho problemas com o formato das respostas. Usando o JSONP, não consigo retornar um simples “TRUE” ou “FALSE”, mas um dado formatado em JSONP.

Do lado do servidor, tenho uma function PHP que retorna dados formatados em JSON:

if (.....) $return["Result"] = TRUE; else $return["Result"] = FALSE; header('Content-type: application/json'); echo $jsoncallback . "(" . json_encode(return) . ")"; 

Do lado do cliente, tenho este código de Validação do jQuery:

 rules: { 'email': { required: true, remote: { type: 'post', url: 'http://www.myurl.com/mypage.php', data: { email: function() { return $('#email').val(); } }, dataType: 'jsonp', jsonp: 'jsoncallback', success: function(data, status) { if (data.Result === false) return false; else return true; } } } }, messages: { 'email': { required: 'message 1', remote: 'message 2' } } 

O código acima parece funcionar bem quando a validação remota é passada, mas não quando falha. Se eu colocar um alerta como este em “sucesso”:

 alert(data.Result); 

Ele retorna sempre o valor correto, mas o código parece continuar e não imprime a mensagem de erro.

Existe uma maneira de usar o jQuery Validate para validar um campo usando a regra remota e o JSONP?

Desde já, obrigado.

A documentação da API do jQuery Validate está gravada incorretamente, mas parece que a página do PHP deve responder apenas com true ou false , como:

 echo "false"; 

Eu sei que estou um pouco (também?) Atrasado, mas pode ajudar alguém …

O problema é que a sua function “sucesso” substitui a padrão do método remoto; você deve os erros com você mesmo

 validator.showErrors(); 

de dentro de sua function de sucesso, desde que você tenha salvo o object validador ( var validator = $.validate({ ... }) ).

Tem sido bastante longo desde que esta pergunta é feita no entanto, nenhuma resposta adequada ainda é dada. Eu estava tendo esse mesmo problema e tive que gastar mais do que algumas horas para obter a resposta. Então, deixe uma resposta completa aqui para qualquer um que possa se deparar com isso.

Você não precisa da function sucesso, pois ela não é executada, por isso não deve ser dada. Em vez disso, você precisa mostrar o erro na sua function de retorno de chamada, como uma das respostas dadas. Embora isso indique uma solução possível, ela não fornece um exemplo claro e informa que a cláusula de sucesso não é necessária.

Resumo:

Cláusula de sucesso não é necessária. Sua function de retorno de chamada deve mostrar erros.