[Resolvido] Validator do Struts - Erro em JavaScript gerado automáticamente

11 respostas
C

Pessoal, boa tarde.

Estou usando as validações automáticas do Validator num projeto no qual estou participando. Pois bem, a validação no lado do servidor esta funcionando sem problemas. O problema é o JavaScript que ele gera no lado cliente.

Configurei o validator.xml para fazer validações no campo do meu form, usando a regra “required”.

Coloquei na minha página a tag para geração do JavaScript. Ele gerou o javaScript.

Nas minhas funções JavaScripts que cuidam de realizar o submit para minhas actions, coquei a seguinte validação:

if (validateCadastroForm(this)) {
            window.document.cadastroForm.action = "${actionPagina}";
            window.document.cadastroForm.submit();
        }

O problema é que na hora de executar esta validação, os browsers (testei nas ultimas versões do FireFox e Internet Explorer) retorna o seguinte erro:

Erro: form.getAttributeNode is not a function
Arquivo-fonte: http://localhost:8080/Sistema/manterCadastroAlterar.do
Linha: 286

Segue abaixo o código javaScript da função aonde está dando o erro:

/*$RCSfile: validateRequired.js,v $ $Revision: 1.13 $ $Date: 2004/03/28 16:53:21 $ */
    /**
    *  Check to see if fields must contain a value.
    * Fields are not checked if they are disabled.
    * <p>
    * @param form The form validation is taking place on.
    */

    function validateRequired(form) {
        var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name");

        oRequired = eval('new ' + formName.value + '_required()');

        for (x in oRequired) {
            var field = form[oRequired[x][0]];

            if ((field.type == 'hidden' ||
                field.type == 'text' ||
                field.type == 'textarea' ||
                field.type == 'file' ||
                field.type == 'checkbox' ||
                field.type == 'select-one' ||
                field.type == 'password') &&
                field.disabled == false) {

                var value = '';
                // get field's value
                if (field.type == "select-one") {
                    var si = field.selectedIndex;
                    if (si >= 0) {
                        value = field.options[si].value;
                    }
                } else if (field.type == 'checkbox') {
                    if (field.checked) {
                        value = field.value;
                    }
                } else {
                    value = field.value;
                }

                if (trim(value).length == 0) {

                    if (i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oRequired[x][1];
                    isValid = false;
                }
            } else if (field.type == "select-multiple") { 

                var numOptions = field.options.length;
                lastSelected=-1;
                for(loop=numOptions-1;loop>=0;loop--) {
                    if(field.options[loop].selected) {
                        lastSelected = loop;
                        value = field.options[loop].value;
                        break;
                    }
                }
                if(lastSelected < 0 || trim(value).length == 0) {
                    if(i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oRequired[x][1];
                    isValid=false;
                }
            } else if ((field.length > 0) && (field[0].type == 'radio' || field[0].type == 'checkbox')) {
                isChecked=-1;
                for (loop=0;loop < field.length;loop++) {
                    if (field[loop].checked) {
                        isChecked=loop;
                        break; // only one needs to be checked
                    }
                }
                if (isChecked < 0) {
                    if (i == 0) {
                        focusField = field[0];
                    }
                    fields[i++] = oRequired[x][1];
                    isValid=false;
                }
            }
        }
        if (fields.length > 0) {
           focusField.focus();
           alert(fields.join('\n'));
        }
        return isValid;
    }

Pelo que notei praticamente todas as funções java Scripts fazem referência a função form.getAttributeNode.

Como resolvo este problema? Esqueci de declarar alguma coisa? Algum arquivo de JavaScript?

11 Respostas

Mauricio_Linhares

Mostre o seu JSP aí.

C

Segue abaixo o código da minha JSP:

Mauricio_Linhares

Cadê o onSubmit do html:form/? Cadê o html:javascript/ com o nome do ActionForm pra ele gerar a validação em JavaScript?

O Form deveria ficar assim:

<html:form action="/caminhoDoAction" method="post"  onsubmit="return validateNomeDoActionForm(this)">
<!-- Conteúdo do form -->
</html:form>

<html:javascript formName="nomeDoActionForm"/>
C

Cara, foi mau.

Na verdade te enviei o código de uma outra página.

De qualquer forma, modifiquei para como você sugeriu. Não está mais dando o erro, mais também não está validando no local. Continua indo lá no servidor fazer a validação (sei disso pq continua aparecendo as mensagens retornada pelo html:erros, em vez de um alert em javaScript).

Segue abaixo o código da minha página, já modificada:

O atributo “operacaoPagina” retorna a action que será executada na hora de gravar os dados, dependendo do modo (pode ser inserir ou alterar). E o atributo “actionVoltar” é carregado com o atributo para retornar para a página de pesquisa dos dados, caso tenha cido chamado por ela.

Mauricio_Linhares

Então poste o html que é gerado pra essa página pelo servidor.

C

Blz… Segue abaixo o código html retornado gerado pelo tomCat:

Mauricio_Linhares

Ahhhhhhhhhh…

Agora é que eu to vendo, você está fazendo o submit no JavaScript, não vai funcionar nunca. Você não pode fazer o submit, tem que deixar o form fazer isso.

Mauricio_Linhares

Ou então você se encarrega de chamar o método lá de validar.

C

Maurício Linhares:
Ahhhhhhhhhh…

Agora é que eu to vendo, você está fazendo o submit no JavaScript, não vai funcionar nunca. Você não pode fazer o submit, tem que deixar o form fazer isso.

Valeu mesmo amizade… O que você falou me deu uma ideia. Como eu não posso usar botão de submit, faço a chamada via JavaScript. Por isso tentei inicialmente montando o javaScript desta forma:

Só que não estava funcionando. Então depois que você falou o lance do botão de submit, adicionei um pra fazer o teste. Funcionou.

Como ainda precisava fazer via javaScript, dei mais uma olhada no código e a ficha caiu. Este this passa uma referência há um determinado objeto. E o objeto que a função espera é um form. Como o javaScript está fora do form, só consegue passar a referência do objeto window. Então mudei o código para o abaixo:

E funcionou que é uma maravilha… Brincadeira. A falha era uma coisa a toa, e nem tinha notado.

Valeu mesmo pela ajuda.

Um abraço,

Diogenes

Caio, soh uma sugestao, qdo for enviar o codigo fonte inteiro de uma página, ou mesmo um código muito grande, crie um documento e o anexe à sua mensagem.

Fica mais limpinho o tópico, e facilita pra quem vai analisar teu código!

Confesso q qdo o código eh muito grande, e tenho q ficar brigando com scroll pra lah e pra cá, frequentemente deixo o código de lado e vou pro próximo tópico sem responder.

Faça isso! :wink:

C

BLz Diognes. Tinha esquecido completamente deste recurso. Foi mau mesmo.

E eu sei como é isso. A mensagem antes tava com algumas linhas enormes, que a deformaram completamente. Ainda editei as mesmas tentando melhorar, mais não ficou perfeito.

Pode deixar que da próxima vez prestarei mais atenção.

Criado 23 de junho de 2005
Ultima resposta 23 de jun. de 2005
Respostas 11
Participantes 3