InnerHTML em Select Option

Posted by admin at Janeiro 29th, 2007

Opa.

Seguindo uma postagem do Julio Greff sobre o velho problema (bug) do IE ao trabalhar com innerHTML e a tag select, vou mostrar aqui minha solução que eu já tinha feito na época da minha função simples pra ajax.

Pequena explicação do problema: às vezes, é necessário agente preencher uma tag select com options através de innerHTML. Pra variar, o IE dá problema com isso. Tá certo que innerHTML não é uma propriedade DOM padrão, mas se o Internet Explorer decidiu implementar ela, deveria, pelo menos, ter implementado direito hehe. Bah, deixa de reclamação mico.

Exemplo:

document.getElementById("meu_select").innerHTML = "<option value='1'>não</option> <option value='2'>funfa</option>"; 

O script acima deveria colocar dentro da select chamada "meu_select" duas opções ("não" e "funfa"). Só que isso não funfa no IE. O jeito certo então é adicionar através de appendChild!!!

Mas, calma, não se desespere, não será necessário você ficar quebrando a cabeça com infinitos appendChild. O Mico resolveu o problema pra você. Basta adicionar minha função abaixo no seu script e chamá-la passando 2 parâmetros: o ID do select que você quer preencher e o innerHTML que você quer colocar dentro deste select.

A função vai cuidar de tudo, como se você estivesse setando através da propriedade innerHTML mesmo, inclusive os atributos do option.

Exemplo de uso (baseado no exemplo anterior que não funfava):

var inner = "<option value='1'>Agora</option> <option value='2'>funfa</option>"; 
select_innerHTML(document.getElementById("meu_select"),inner);

A função mágica que faz isso. Adicione copie no seu script:

function select_innerHTML(objeto,innerHTML){
/******
* select_innerHTML - altera o innerHTML de um select independente se é FF ou IE
* Corrige o problema de não ser possível usar o innerHTML no IE corretamente
* Veja o problema em: http://support.microsoft.com/default.aspx?scid=kb;en-us;276228
* Use a vontade mas coloque meu nome nos créditos. Dúvidas, me mande um email.
* Versão: 1.0 - 06/04/2006
* Autor: Micox - Náiron José C. Guimarães - micoxjcg@yahoo.com.br
* Parametros:
* objeto(tipo object): o select a ser alterado
* innerHTML(tipo string): o novo valor do innerHTML
*******/
    objeto.innerHTML = ""
    var selTemp = document.createElement("micoxselect")
    var opt;
    selTemp.id="micoxselect1"
    document.body.appendChild(selTemp)
    selTemp = document.getElementById("micoxselect1")
    selTemp.style.display="none"
    if(innerHTML.toLowerCase().indexOf("<option")<0){//se não é option eu converto
        innerHTML = "<option>" + innerHTML + "</option>"
    }
    innerHTML = innerHTML.replace(/<option/g,"<span").replace(/<\/option/g,"</span")
    selTemp.innerHTML = innerHTML
    for(var i=0;i<selTemp.childNodes.length;i++){
        if(selTemp.childNodes[i].tagName){
            opt = document.createElement("OPTION")
            for(var j=0;j<selTemp.childNodes[i].attributes.length;j++){
                opt.setAttributeNode(selTemp.childNodes[i].attributes[j].cloneNode(true))
            }
            opt.value = selTemp.childNodes[i].getAttribute("value")
            opt.text = selTemp.childNodes[i].innerHTML
            if(document.all){ //IEca
                objeto.add(opt)
            }else{
                objeto.appendChild(opt)
            }
        }
    }
    document.body.removeChild(selTemp)
    selTemp = null
}

Bugs? Grita nos comments ae. Dúvidas? Joga no fórum e me avisa.
Não se esqueça de conferir também a solução do Julio para este problema.

Posted in DOM, javascript| 1 Comment | 

Objetivos / Resoluções 2007

Posted by admin at Janeiro 26th, 2007

Oooaa.

Bom, já terminei de responder todos os comentários/emails/perguntas feitas na minha ausência (acho, se eu tiver esquecido alguma comentem ae), então navegando no meu netvibes eu descobri qual será meu primeiro post pós-férias: fui tagueado pelo brodi Bruno Dulcetti.

Achei que não ia entrar na brincadeira, mas acabei sendo convidado a aumentar o monstro criado pelo Bruno Alves.

Imagem: Monstro

Fiquei honrado em ter sido citado ao lado de power blogueiros que eu admiro muito e agora vou fazer parte da árvore também hehe.

Bom, chega de papo. Tão aí meus objetivos pra 2007. Tomara que eu consiga:

  • Desenvolver meus diversos outros projetos para a internet
  • Ter uma festa de casório tranquila (sim, sim, to indo… hehe)
  • Transformar o iEvolution no fórum de desenvolvimento Web mais forte da net.
  • Aprender a organizar melhor meu tempo (o principal).
  • Pro blog
    (me permitam detalhar):

    • Implantar o novo layout
    • Versão em inglês
    • Inúmeras postagens que eu tenho na cabeça
    • Inúmeros códigos pra postar

Agora vou indicar uma galera muito boa que eu leio e recomendo:

Tá um pouco atrazado (já devia ser resoluções pro carnaval hehe) mas bora lá.

Posted in bate-papo, objetivos2007, resolucoes2007| No Comments | 

Rec6 - Código de número de pontos é horrível

Posted by admin at Janeiro 24th, 2007

Olá povo.

Lá estava eu tentando inserir aquele código do Rec6 para exibir o número de votos de determinada notícia em meu blog.

<script language="JavaScript"
src="http://www.syxt.com.br/rec6/link.php?action=widget&url=http://elmicox.blogspot.com"
type="text/javascript"></script>

Bom, de primeira já achei que o botão não ficaria bem com o visual da minha página. Mas fazer o quê né? Não havia outra opção a escolher. Então decidi colocar ele ao lado dos outros botões de indicação na minha página.

Tudo beleza, até eu perceber que o botão é anti-social. Não gosta de ficar na mesma linha que outros elementos e cria uma nova linha só pra ele.
Ah, aí já é pegar pesado demais. Quer dizer que, além de ter que colocar um botão totalmente estranho ao layout, ele ainda tem que ficar ocupando um bloco de 90px de altura só pra ele??

Nãaao. Isso eu não aceito. Está na hora de eu usar meus "poderes sobrenaturais" no JavaScript (modéstia mico) e pegar diretamente o número de votos pra fazer meu próprio botão customizado (não, não tentei customizar o botão usando apenas CSS. Iria ser muito trabalho. Logo, logo verão o motivo).

Editado 24-01-07: Feito, peguei o número de votos apenas com JavaScript e mostrei como posicionar usando CSS.

Falei: "vou pegar o código gerado, entrar nos filhos usando DOM e capturar o valor". Tudo seria uma tarefa simples até eu ver isto:

<div style="font-family: Trebuchet MS, Tahoma, Verdana, Arial;
background-image:url(http://www.syxt.com.br/rec6/imagens/pontos_bg.gif); background-repeat:no-repeat;
text-align:center;width:57px;height:80px;padding:3px 2px 3px 2px; line-height:normal;" valign="top">
<div style="color: #ffc317; font-size: 21px; margin: 0; padding: 0">
<a href="http://www.syxt.com.br/rec6/link.php?nv=1&url=http://elmicox.blogspot.com"
style="text-decoration:none; color: #ffc317;font-size: 21px; ">
0
</a>
</div>
<div style="color: #ffc317; font-size: 12px; margin: 0; padding: 0">
Pontos
</div>
<div style="margin: 10px 0px 0px 0px; color: #A5A5A5;">
<a href="http://www.syxt.com.br/rec6/link.php?url=http://elmicox.blogspot.com">
<img src="http://www.syxt.com.br/rec6/imagens/botao_subir.gif" border="0" />
</a>
</div>
</div>

Gostou? Pois é. É este belo código que é printado na sua página pra que aquele belo botão apareça, com o perdão da ironia. O código também não é identado.

O meu serviço com JavaScript e DOM iria virar uma complicação até chegar ao valor que eu queria. Mas bora lá. Mão na massa mico. Com alguns childNodes eu consigo chegar até o valor que está dentro do primeiro <A>, mas terei problemas com interpretações em alguns navegadores. Assim que eu tiver novidades sobre isso posto pra vocês.

Não, não é uma crítica destrutiva. Avisarei ao pessoal da Syxt (rec6) e proponho algumas soluções:

  • Dar outras opções visuais de botão (skin) pra que leigos possam escolher o tipo de botão sem precisar mexer no CSS ou JavaScript.
  • Para ter um html mais "bonito", simplificar o código acima para umas 2 ou 3 tags apenas. Sem excesso de divs. É possível sim.
  • Para os não-leigos, fornecer uma página que retorne diretamente a pontuação de determinada notícia sem códigos HTML adicionais, apenas o número de pontos.
  • Incluir o parametro "titulo" no link da indicação pra, caso seja a primeira indicação, o usuário não ter que digitar o título na mão.

Gostou desta postagem? Então aproveita e vota nela ai :-)

Posted in bate-papo, bookmarks| No Comments |