É que o javascript é mais próximo de linguagens robustas com suporte a objetos que o ASP. Mas se você seguisse a lógica que eu passei conseguiria fazer tranquilo, e com muito menos código, veja só:
A parte de marcação é simples, vou usar tabelas porque é o que você aparenta estar usando, mas atente que tabelas são bem poderosas se comparado ao que você usufruiu delas até agora pelo que eu vi nesse seu modelo.
<form action="#" name="opts" method="post"><table cellpadding="0" cellspacing="0"> <thead> <tr> <th>Opção</th> <th>Descrição</th> </tr> </thead> <tfoot> <tr> <th colspan="2"> <a href="" onclick="changeState('check'); return false;">Marcar Todos</a> | <a href="" onclick="changeState('uncheck'); return false;">Desmarcar Todos</a> </th> </tr> </tfoot> <tbody> <tr> <th><input onclick="changeBgColor(this);" type="checkbox" name="opt1" /></th> <td>Opção 01</td> </tr> <tr> <th><input onclick="changeBgColor(this);" type="checkbox" name="opt2" /></th> <td>Opção 02</td> </tr> <tr> <th><input onclick="changeBgColor(this);" type="checkbox" name="opt3" /></th> <td>Opção 03</td> </tr> </tbody></table></form>
Nada de novo até agora, usei as tabelas (com cabeçalhos, rodapé e corpo definidos). Um formulário e as opções. Repare que os inputs chamam a função "changeBgColor", e os links a função "changeState". Eu prefiro colocar a opção de Marcar e Desmarcar separadas e visíveis desde o início, porque o usuário precisa saber quais opções ele tem.
Agora a parte do java script:
function changeBgColor(b){
(b.checked==true) ? b.parentNode.parentNode.className='checked' : b.parentNode.parentNode.className='unchecked';
}
Essa função é exatamente a mesma que eu te passei, o que eu fiz foi mudar ao invés da cor de fundo, eu altero a classe do elemento. Acho melhor trabalhar com folhas de estilo.
Agora a função que marca e desmarca todos:
function changeState(a){
var form = document.forms['opts'];
var elms = form.elements;
var act = (a=='check') ? true : false;
for(x=0;x<elms.length;x++){
if(elms[x].type.toLowerCase()=='checkbox'){
elms[x].checked = act;
changeBgColor(elms[x]);
}
}
}
É isso mesmo, 12 linhas de código, isso contando o nome da função, a linha pra separar o código e as chaves que ficam em linhas separadas para melhor organização. ^^
As 3 primeiras linhas são definições das variáveis. O formulário que contêm os elementos, os elementos em si, e a ação a ser executada na forma de um objeto bool (checked=true, unchecked=false);
Depois é um loop nos elementos do formulário. Dentro do loop eu verifico se o elemento é um checkbox. Não há problema em tentar aplicar o checked em um input text por exemplo. Ele só vai logar um alert no console de erros no FF, e vai mostrar o icone amarelo no IE, mas a execução continua. Para evitar os inconvenientes eu faça a checagem.
Dentro do if só tem os 2 comando que eu preciso. Marcar ou desmarcar o elemento e logo em seguida eu chamo a função de mudar a cor de fundo no elemento que acabou de ser manipulado.
Simples assim. Pegou essa ?!
De brinde leva essa folha de estilos:
*{ padding:0px; margin:0px;}form{ font:11px Trebuchet MS, Verdana, serif;}table{ border:0px; width:300px; margin:5px;}table thead th{ background:#eee; border-bottom:1px solid #bbb; border-right:1px solid #fff; padding:3px;}table tfoot th{ background:#eee; border-top:1px solid #fff; border-bottom:1px solid #bbb; padding:3px;}table tfoot th a{ color:#444;}table tfoot th a:hover{ text-decoration:none;}table tbody td{ padding:2px; border-top:1px solid #fff;}table tbody th{ text-align:center;}table tbody tr.checked{ background:#eef;}table tbody tr.unchecked{ background:#fff;}
Edição feita por: bimonti, 17/08/2007, 13:29.