Ir para conteúdo

POWERED BY:

Arquivado

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

notax

[Resolvido] Botão para trocar values

Recommended Posts

Pessoal, bom dia!

 

Estamos com mais um probleminha aqui na empresa que não estou conseguindo resolver, será que rola um help?

 

É o seguinte:

 

Tenho esse campo que fica dentro de um loop do tipo while:

 

<input name="block<%=n%>" type="text" id="block<%=n%>" value="<%Response.write "N"%>">

Onde "n" nada mais é do que um contador, ou seja, teremos os campos block1 até block25 por exemplo... na verdade o último número não se sabe qual é, poderá ser block10365 ou block2 ou até mesmo block1 no caso de só ter um registro dentro do loop, ou seja, pode ir de block1 a blockinfinito...

 

O que acontece é que esse campo recebe apenas dois tipo de valores N (para não) ou S (para sim)... como podem ver, automaticamente coloquei o value N, mas tem casos em que aparecem digamos 60 registros na tela e o user tem que trocar manualmente 55 deles para S... isso é muito chato... o que eu quero é ter um botão do tipo "marcar todos" mas ao invés de marcar todos eu quero trocar todos para S ou todos para N, no exemplo que dei, o user trocaria todos para S e apenas os 5 que ele não quer ele mudaria para N, sacaram?

 

Bom, tenho aqui um codigo para marcar e desmarcar todos... que funciona com chekboxes, mas como adapto isso pra minha necessidade? Alguém sabe me ajudar?

 

O código que eu tenho está assim:

<script>

function selecionar_tudo(){
	for (i=0;i<document.f1.elements.length;i++)
		if(document.f1.elements[i].type == "checkbox")	
			document.f1.elements[i].checked=1
}
function deselecionar_tudo(){
	for (i=0;i<document.f1.elements.length;i++)
		if(document.f1.elements[i].type == "checkbox")	
			document.f1.elements[i].checked=0
}
</script>

 

Tomara que alguém possa dar uma dica...

 

Valewzaço

Compartilhar este post


Link para o post
Compartilhar em outros sites

bem parecido cara, só que no lugar de fazer:

.checked=1

você vai fazer:

.value='S';
ou = 'N';

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, mas o problema é que o form não tem apenas um textfield como tinha com a opção de checkbox ( if(document.f1.elements.type == "checkbox") ). Tem vários textfields, então acho que teria que chamar cada campo pelo nome não? Como cada campo terá um nome diferente, como farei isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

tá.. aos poucos..

 

primeiro para pegar todos os inputs:

document.getElementsByTagName('input')

 

vai te retornar um array com os <input />s do documento

 

se você quiser apenas os inputs de uma div/fieldset especifica:

 

document.getElementById('aqui')getElementsByTagName('input')

ai você vai ter apenas os inputs do elemento com id="aqui"

 

como tá organizado o teu HTML?

dá para você colocar esses campos num mesmo container em comum ?

 

 

se não der, você ainda pode, trabalhar com outro atributo comum a eles, como o name

trocando:

<input name="block<%=n%>"
<input name="block[]"
e então, você aplica o .value='S'; apenas nos inputs que tiverem .name=='block[]'

entendeu?

 

veja que estou sugerindo que você trabalhe com arrays, oque é muito mais simples e melhor do que o teu contador.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Putz cara, Valew mesmo... mas acho que não entendi.

 

Olha só, não quero trabalhar com arrays pq são vários campos em cada linha... um exemplo:

 

<input name="bolsa<%=n%>" type="text" id="bolsa<%=n%>" value="<%Response.write formatnumber (objRS8("maxbolsa"),2)%>">

<input name="empresa<%=n%>" type="text" id="empresa<%=n%>" value="<%Response.write id_empresa%>">

...continuam outros inputs até...

<input name="block<%=n%>" type="text" id="block<%=n%>" value="<%Response.write "N"%>">

 

O que acontece com o meu contador é que eu sei exatamente quando começa e quando termina o loop, dessa forma fica fácil para na página seguinte inserir linha a linha no bd, entende?

 

O que eu preciso?

 

Criar um botão para alterar todos os values do campo block<%=n%>;

 

Qual a dificuldade? O campo block nunca tem o mesmo nome, ele poderá começar em block1 e ir ate blockinfinito. Até aqui está tudo perfeito...

 

Como se trata de um loop linha a linha eu até posso posicionar todos os textdields block dentro da mesma div... até aqui tb é fácil... fiz assim (posicionei dentro da div altera_campo):

<input name="bolsa<%=n%>" type="text" id="bolsa<%=n%>" value="<%Response.write formatnumber (objRS8("maxbolsa"),2)%>">
<input name="empresa<%=n%>" type="text" id="empresa<%=n%>" value="<%Response.write id_empresa%>">
...continuam outros inputs até...
<div id="altera_campo"><input name="block<%=n%>" type="text" id="block<%=n%>" value="<%Response.write "N"%>"></div>

o que eu não entendi é como vou fazer para trocar o value de todos os textfields block... chamando pela div, é isso? nunca fiz tal coisa...

 

Ficaria algo assim?

<script>

function selecionar_tudo(){
        for (i=0;i<document.f1.elements.length;i++)
                if(document.getElementsByID('altera_campo'))  
                        document.f1.elements[i].value="s"
}
function deselecionar_tudo(){
        for (i=0;i<document.f1.elements.length;i++)
                 if(document.getElementsByID('altera_campo'))  
                        document.f1.elements[i].value="n"
}
</script>

Bom, óbvioamente devo ter cometido algum erro pq o code acima não rolou... pode me dar mais alguma dica?

Compartilhar este post


Link para o post
Compartilhar em outros sites

tá.. ElementsById não existe

 

veja de novo meu post:

document.getElementById('aqui')getElementsByTagName('input')

vai pegar os INPUTS que estiverem dentro do id="aqui"

entendeu ?

 

assim, o teu loop, vai ser bem diferente..

 

copia, cola num arquivo e roda para você ver:

<html>
<head>
<script type="text/javascript">
function id( el ){
	return document.getElementById( el );
}
function set_value( v )
{
	var inputs = id('blocks').getElementsByTagName('input');
	for( var i=0; i<inputs.length; i++ )
	{
		inputs[i].value = v;
	}
}
window.onload = function(){
	id('s').onclick = function(){
		set_value( this.value );
	}
	id('n').onclick = function(){
		set_value( this.value );
	}
}
</script>
</head>
<body>
	<fieldset id="blocks">
		<input type="text" name="block1" value="N" />
		<input type="text" name="block2" value="N" />
		<input type="text" name="block3" value="N" />
		<input type="text" name="block4" value="N" />
		<input type="text" name="block5" value="N" />
	</fieldset>
	
	<input type="button" name="n" value="N" id="s" />
	<input type="button" name="s" value="S" id="n" />
</body>
</html>
procure entender o meu código.

 

então cara, qnto ao Array(), pense em reconsiderar.. eu também 'pensava' deste modo que você está pensando..

porém lá na frente, você vai ver que é pior você ter esse contador...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uhm... saquei! Valew mais uma vez...

 

O único problema que acho que ocorreu é que coloquei a div ou no caso o fieldset dentro do loop... e acaba criando vários fieldsetes com o mesmo nome... um para cada linha...

 

O botão só funciona pro primeiro... será que tem como da um jeito nisso tb?

 

Não sei se me entendeu... no caso seu exemplo ficaria assim:

 

<html>
<head>
<script type="text/javascript">
function id( el ){
        return document.getElementById( el );
}
function set_value( v )
{
        var inputs = id('blocks').getElementsByTagName('input');
        for( var i=0; i<inputs.length; i++ )
        {
                inputs[i].value = v;
        }
}
window.onload = function(){
        id('s').onclick = function(){
                set_value( this.value );
        }
        id('n').onclick = function(){
                set_value( this.value );
        }
}
</script>
</head>
<body>

<fieldset id="blocks"><input type="text" name="block1" value="N" /></fieldset>
<fieldset id="blocks"><input type="text" name="block2" value="N" /></fieldset>
<fieldset id="blocks"><input type="text" name="block3" value="N" /></fieldset>
<fieldset id="blocks"><input type="text" name="block4" value="N" /></fieldset>
<fieldset id="blocks"><input type="text" name="block5" value="N" /></fieldset>
        
        
        <input type="button" name="n" value="N" id="s" />
        <input type="button" name="s" value="S" id="n" />
</body>
</html>

Eu achei que não teria problema por serem todos exatamente do mesmo nome, mas não rolou... na real nem entendi pq... mas não rolou... Pensei que por estar setado que é para pegar todos os <input>s dentro do textfield de id blocks pegaria todos independente da quantidade de fildsets ou divs... Será que tu saberias o pq disso? Confesso que não entendi mesmo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

você não pode, não deve repetir ID.

 

ID deve ser um identificador unico no documento.

Simples assim.

 

coloque o fieldset fora do loop

algo assim:

<fieldset id="blocks">
<% inicia loop {%>
<input type="text" name="block1" value="N" />
<% termina loop {%>
</fieldset>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ids não podem se repedir na mesma página.

 

Faz o seguinte, esses campos estão dentro de um formulário, certo? Dê um id para esse formulário e pegue todos os campos texto com o nome block[0-9] e defina o value.

O seu loop ficaria assim:

for( var i=0; i<inputs.length; i++ )
{
	if ( /^block[0-9]+$/.test( inputs[i].name ) && inputs[i].type == "text" )
		inputs[i].value = v;
}
Formulário:

<form id="blocks">
<!-- Campos -->
</form>
Desse jeito você pode ter os campos em qualquer posição dentro do formulário.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se eu botar fora do loop vai pegar todos os input, nesse caso não serve. Poderia criar dois loops diferentes, mas não acho que seja a melhor opção...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Lex, valew pelo retorno... não tinha visto sua mensagem enqunto respondia...

 

olha só, não entendi muito bem sua ideia... sou meio fraco em JS como devem ter percebido... pode me explicar um pouco melhor?

 

Uma coisa que eu não entendi é que você sugere que eu pegue os campo block de 1 a 9, no caso eu poderia colocar um valor ali absurdo do tipo 1 a 1000 (o loop nunca chegará a 1000 repetições)... é isso que você propoe?

Compartilhar este post


Link para o post
Compartilhar em outros sites

por causa da ExpressãoRegular que ele fez: /^block[0-9]+$/ já tá pronto cara.

só aplicar.

 

troque as partes do script que fiz, pela que ele indicou, dando o ID para a tag <form>.

veja em #9 a resposta dele.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que não fiz direito... fiz assim:

 

 

entre as tagas <head></head> coloquei isso:

<script type="text/javascript">
/*function id( el ){
        return document.getElementById( el );
}
function set_value( v )
{
        var inputs = id('blocks').getElementsByTagName('input');
        for( var i=0; i<inputs.length; i++ )
        {
                inputs[i].value = v;
        }
}*/


for( var i=0; i<inputs.length; i++ )
{
        if ( /^block[0-9]+$/.test( inputs[i].name ) && inputs[i].type == "text" )
                inputs[i].value = v;
}

window.onload = function(){
        id('s').onclick = function(){
                set_value( this.value );
        }
        id('n').onclick = function(){
                set_value( this.value );
        }
}
</script>

 

depois no form fiz isso:

 

<form action="insert_into_faltas_complementar.asp" method="post" name="blocks" id="blocks">

 

depois no input block tirei o fielset e ficou assim:

antes do inicio do loop os botões

<input type="button" name="n" value="N" id="s" />
<input type="button" name="s" vale="S" id="n" />

dentro do loop o input ficou assim:

<input name="block<%=n%>" type="text" id="block<%=n%>" value="<%Response.write "N"%>">

Era isso que eu deveria ter feito? pq não funcionou... desculpem mas acho que fiz alguma besteira... né?

Compartilhar este post


Link para o post
Compartilhar em outros sites

quase..

 

 

<script type="text/javascript">
function id( el ){
        return document.getElementById( el );
}
function set_value( v )
{
        var inputs = id('blocks').getElementsByTagName('input');
        for( var i=0; i<inputs.length; i++ )
        {
                if ( /^block[0-9]+$/.test( inputs[i].name ) && inputs[i].type == "text" )
                        inputs[i].value = v;
        }        
}

window.onload = function(){
        id('s').onclick = function(){
                set_value( this.value );
        }
        id('n').onclick = function(){
                set_value( this.value );
        }
}
</script>
você tinha que 'corrigir' e não 'trocar tudo'

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.