Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

mexicanox

Chamar Função pelo nome do Campo

Recommended Posts

beleza pessoal, o que eu quero fazer é assim:

 

Eu tenho varios campo com o name val_* onde o * pode ser tel, cep, end, etc... mais ou menos uns 10 tipos

 

e para cada tipo eu tenho uma função val*(elemento) onde o * pode ser tel,cep,end, etc... uma para cada um dos nomes acima.

 

O que eu quero é passar um loop FOR por todos os elementos e os elementos que tiverem o nome val_* eu chamo a função equivalente para o campo.

 

function valElements(){
        var input = document.getElementsByTagName("input");
        
        for(i=0;i<input.length;i++){
        		input.name(elemento); //a ideia é substituir o nome do campo pela chamada da função, mas sem ter que fazer uns 10 if's para saber qual função chamar

        };
};

 

por exeplo se o input.name é igual a "val_tel" eu chamo a função valTel(elemento)

 

nao sei se deu pra entender direito, qulaquer coisa eu tento explicar de outra forma

 

vlws

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pesquisei aqui como retornar uma função dentro de outra (já tinha me esquecido como era :P) e cheguei no seguinte resultado:

 

function valElements(who){
	var attrName = (who.getAttribute('name')).split("_")[1];
	(new Function('return val' + attrName + '()'))()
}
Exemplo de uso:

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" > 
<head>
<title></title>
<script type="text/javascript">
function valElements(who){
	var attrName = (who.getAttribute('name')).split("_")[1];
	(new Function('return val' + attrName + '()'))()
}
function valTel(){ alert('telefone'); }
function valCep(){ alert('cep'); }
</script>
</head>
<body>
<input type="text" name="val_Tel" onclick="valElements(this)" />
<input type="text" name="val_Cep" onclick="valElements(this)" />
</body>
</html>

 

Perdoe-me pelo HTML e por ter usado JavaScript obstrutivo... Estava com pressa.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

valeu !!!!!!!!!!!!!

funciono certinho, eu so preciso de mais uma informação: Como passar parametros para a função

 

eu tenho o FOR que percorre os elementos e chama as funções

 

        for(i=0;i<campos.length;i++){
		current = campos[i];
		(new Function('return val' + attrName + '('+ current +')'))(); //é isso pegar o elemento atual e passar como parametro
	}

e as funções sao construidas assim:

 

function valTel(element){
     //codigo exemplo
     alert(element.name);
}

eu pesquisei um pouco e vi alguns exemplos que os parametros são passados antes do codigo da função, mas nao funcionou

new Function(current,'return val' + attrName + '()'))();

como é qeu eu vou fazer isso ??

 

flws

Compartilhar este post


Link para o post
Compartilhar em outros sites

tambem nao funcionou, no fire bug da os seguintes erros

 

(new Function(current,'return val' + attrName + '(' + current + ')'))();
malformed formal parameter

(new Function(current,'return val' + attrName + '(' + current + ')'))();

 

 

(new Function('return val' + attrName + '(' + current + ')'))();
missing ] after element list

return valEma([object HTMLInputElement])

 

 

(new Function(current,'return val' + attrName + '()'))();
malformed formal parameter

(new Function(current,'return val' + attrName + '()'))();

 

 

a função de teste é essa

function valEma(element){
	alert(element);
}

eu pesquisei um pouco mais e acho que para passar um paramentro tem que ser somente string, por exemplo isso funciona

(new Function('return val' + attrName + "('Teste')"))();

 

fwls

Compartilhar este post


Link para o post
Compartilhar em outros sites

Separei por variável para ver se fica mais claro. Tenta aê.

 

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" > 
<head>
<title></title>
<script type="text/javascript">
function valElements(who){
        var attrName = (who.getAttribute('name')).split("_")[1];
	var t = 1;
	var f = 'val' + attrName + '(' + t + ')';
        (new Function('return ' + f))()
}
function valTel(teste){ if(teste == 1) alert('telefone'); }
function valCep(teste){ alert('cep'); }
</script>
</head>
<body>
<input type="text" name="val_Tel" onclick="valElements(this)" />
<input type="text" name="val_Cep" onclick="valElements(this)" />
</body>
</html>

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

acho que eu nao expliquei direito, vamos la, eu consigo passar um parametro, mas numeros e strings, e o que eu estou tentando passar é o elemento corrente, exemplo

 

for(i=0;i<campos.length;i++){
                current = campos[i]; //nesse caso o current vai ser um input, 
                (new Function('return val' + attrName + '('+ current +')'))(); //este input deve ser passado como parametro para ser manipulado pela função correspondente
        }

como exemplo vamos dizer que o current esta com o input de id "telefone"

entao quando chamar a função valTel o parametro recebido é o input de id "telefone", ficando assim

 

function valTel(element){
     alert(element.name)//mostra o nome do elemento
     alert(element.id) // mostra o id
     alert(element.length) // mostra o tamanho 
     .
     .
     .
}

Porem o que acontece é que o alert mostra "undefined".

Ai o que eu quero saber é se tem como fazer isso.

 

flws

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, posta como ficou a tua função, junto com um pedaço do HTML, para podermos testar aqui, e te falar onde está o problema

Compartilhar este post


Link para o post
Compartilhar em outros sites

A função que eu to usando para teste é essa valTel do post #7

 

o html nao tem nada por que eu estou usando um listener que adiciona um listener em um botao que chama uma função, que é essa

 

        var campos = valElements(); //essa é a função que pega todos os campos que eu preciso
        var id,valor;
        var attrName;
        var first;
        var current;
        var erro = 0;
        for(i=0;i<campos.length;i++){
                current		= 	campos[i]; // é o elemento atual do for no caso os inputs da pagina
                attrName 	= 	(current.name).split("_")[1];
                first 		= 	attrName.substring(0,1);
                attrName 	= 	attrName.replace(first, first.toUpperCase());
                id 		= 	current.id;
                valor 		= 	current.value;
                if( (new Function('return val' + attrName + "('"+id+"','"+valor+"')"))() ){
                        valido(current.id);
                }else{
                        invalido(current.id);
                        erro ++;
                }
        }
        if(erro > 0) alert("FALSE");
		else alert("TRUE");
}

 

 

function valElements(){
        var campos = document.getElementsByTagName("input");
        var allInputs = new Array();
        var current;
        var count = 0;
    for(i=0;i<campos.length;i++){
                current = campos[i];
                if(current.name.substring(0,4) == "val_"){
                        validar[count] = current;
                        count ++;
                };
    };

    return allInputs;

esta é uma das função

function valChar(element,valor){
        var patChar = /\w+/; //ess parte eu ainda nao terminei
        if(patChar.test(valor)) return true;
        else return false;
};

A parte do html onde estao os inputs é essa

<tr>
    <td>Nome:*</td>
    <td><input name="val_char" type="text" id="nome" size="50" /></td>
    <td>O seu nome completo sem abreviações</td>
  </tr>
  <tr>
    <td>Logradouro:*</td>
    <td><input name="val_vchar" type="text" id="endereco" size="40" /></td>
    <td>O nome da rua, av etc...</td>
  </tr>
  <tr>
    <td>Número:*</td>
    <td><input name="val_int" type="text" id="numero" size="3" /></td>
    <td>O número do endereço</td>
  </tr>
  <tr>
    <td>Telefone:**</td>
    <td><input name="val_tel" type="text" id="telefone" size="11" maxlength="14" /></td>
    <td>Deve se no formato (xx) xxxx-xxxx</td>
  </tr>

 

Deste jeito esta funcionando perfeitamente.

 

POREM ....

O que eu preciso é que ao inves de passar dois parametros para a função valChar, sendo eles element e valor, que são definidos com id e valor láááá em cima na 1º função.

 

A ideia é passar o elemento atual como paramentro, mas fazendo as devidas alterações:

Trocando

new Function('return val' + attrName + "('"+id+"','"+valor+"')"))()
Por

new Function('return val' + attrName + '('+ current +')'))()

e na funcao valChar

Trocar

function valChar(element,valor){
        var patChar = /\w+/; //ess parte eu ainda nao terminei
        if(patChar.test(valor)) return true;
        else return false;
};
Por

function valChar(element){
        alert(element.value); //aqui  retorno é undefined
};

O retorno é undefined.

 

Tem jeito de se fazer isso ? ou vai ter que passar o id e o valor mesmo?

 

flws

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.