HTML5 Selector API – querySelector querySelectorAll

 Quem acompanha O Desenvolvedor já deve ter percebido que eu sou um grande fã do framework jQuery, utilizo-o diariamente no trabalho e nos projetos pessoais.

Desenvolver utilizando jQuery é extremamente produtivo e fácil, visto o sucesso deste framework a W3C resolveu documentar oficialmente seletores no DOM de forma mais fácil: o  querySelector e querySelectorAll.

querySelector e querySelectorAll

O querySelector é uma API de seleção de elementos do DOM que está disponível diretamente no document, isso facilita os seletores tornando-os muito próximos da seleção do jQuery (a W3C assumiu que os seletores vieram da idéia do jQuery, que na verdade é uma biblioteca separada, chamada Sizzle).

A função é bastante simples e o seletor pode ser de classe (exatamente como no jQuery .nome-da-classe ou de elemento, por exemplo p). O resultado do querySelectAll é uma lista com os elementos que casam com o seu seletor e o do querySelector é apenas o primeiro elemento que casar com a seleção passada.

Exemplo

<style>
.zebraon{background:silver}
</style>
<script>
function zebrado(selector){
var zebrar=document.querySelectorAll(selector);
for(var i=0;i<zebrar.length;i+=2)
zebrar[i].className="zebraon"
}


window.onload=function(){
zebrado("p");
zebrado(".zebra tbody tr");
}
</script>

Fiz um teste criando uma função para "zebrar" qualquer elemento da página (tabelas, por exemplo), no exemplo abaixo zebrei todos os parágrafos da página e as linhas da tabela com a classe zebrado. Para isso criei uma função que recebe como parâmetro a seleção, faz a busca usando o querySelectorAll e adiciona a classe "zebraon" que criei.

 

Um exemplo simples mas que mostra um bom amadurecimento na parte de seletores DOM! Antes de levantar qualquer debate – acho que isso não vai acabar com o uso de frameworks, mas provavelmente vai melhorar a performance das bibliotecas como jQuery já que a seleção será nativa, reduzindo parte da magia negra usada atualmente para isso.

E aí, o que acharam?

File upload e image crop com CodeIgniter

Nada de muitas explicações sobre como implementar, vamos para um exemplo… o CodeIgniter possui classes para upload de arquivos e manipulação de imagens.

Para começar, crie a seguinte view chamada form.php:

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <title>Upload e crop de imagem – CI</title>
</head>
<body>
<h1>Upload e crop de imagem – CI</h1>
<form action="/index.php/imagem/upload" enctype="multipart/form-data" method="post">
    <input type="file" name="userfile" />
    <button>enviar</button>
</form>
</body>
</html>

Então, crie o seguinte controller.

<?php
class Imagem extends Controller {

    function Imagem() {
        parent::Controller();   
    }
   
    function index() {
        $this->load->view("form");
    }

    function upload() {
        //parametriza as preferências
        $config["upload_path"] = "/var/www/uploads/";
        $config["allowed_types"] = "gif|jpg|png";
        $config["overwrite"] = TRUE;
        $this->load->library("upload", $config);
        //em caso de sucesso no upload
        if ($this->upload->do_upload()) {
            //renomeia a foto
            $nomeorig = $config["upload_path"] . "/" . $this->upload->file_name;
            $nomedestino = $config["upload_path"] . "/minhafoto" .  $this->upload->file_ext;
            rename($nomeorig, $nomedestino);
           
            //define opções de crop
            $config["image_library"] = "gd2";
            $config["source_image"] = $nomedestino;
            $config["width"] = 300;
            $config["height"] = 300;
            $this->load->library("image_lib", $config);
            $this->image_lib->crop();
           
        } else {
            echo $this->upload->display_errors();
        }

    }
}

O método index() apenas retorna para a view form.php. Já o método upload é que faz a mágica.

Nele, você configura as preferências do upload (caminho do arquivo a ser salvo, tipos de arquivo, etc…). Se o upload for feito com sucesso, renomeamos o arquivo e usando a classe de manipulação de imagens (deve ser feita a configuração das preferências, como qual a biblioteca a ser usada, dimensões e afins). Voi

ParseInt em Javascript

Pouco depois de aprender arredondamento de números com o PHP eu estava desenvolvendo um código em javascript que recebia algumas informações numéricas e precisava arredondar o número que vinha, a fim de comparar com outro número inteiro.

Usando o parseInt eu percebi umas "reações estranhas" quando eu passava uma string que tivesse zero a esquerda, por exemplo "0x" não retornava X como int, retornava um número estranho.

Fui pesquisar sobre o assunto e abaixo explico o motivo desse retorno estranho…

parseInt

Na documentação do javascript a sintaxe da função é a seguinte:

parseInt(string, radix)

O parâmetro "string" é obrigatório é a string que será convertida para int, o parâmetro radix é opcional – aí começa o problema. Quando este parâmetro não é passado o script vai deduzir qual é o tipo da string passada e transformará ela em int.

Quando o número a ser convertido começa com 0 o script utiliza a conversão para octal, e não decimal. O radix que deve ser passado quando quiser forçar o uso do sistema octal é 8.

Quando o número a ser convertido começa com 0x (exemplo: 0xF) é utilizado o sistema hexadecimal para a conversão. O radix que deve ser passado quando você quiser forçar o uso do sistema hexadecimal é 16.

Nos casos restantes a conversão será feita utilizando o sistema decimal, para forçar o uso do sistema decimal o radix a ser passado é 10.

 

Solução

Se você quer converter o número para int utilizando o sistema decimal sempre passe o segundo parâmetro (radix) como 10, esta é uma boa prática que poderá fazer você economizar tempo tentando descobri porque em alguns casos específicos os cálculos do seu script não saem como o esperado…

Dúvidas e sugestões nos comentários! 🙂

Formulários em HTML5 – novos tipos de input

Quem já fez validação de formulário (antes do jQuery validate) deve lembrar o inferno que é um formulário gicante para validar – tudo bem que eu era noob no javascript na época, mas com os novos tipos de inputs propostos pela W3C os formulários ficaram mais semânticos e a validação no front-end ficará ainda mais fácil.

O HTML5 está muito mais interativo e muita coisa que nós desenvolvedores já fazemos a muito tempo passou a ser documentada e oficializada pelo W3C, tenho esperança que com o tempo isso reduzirá as gambiarras da programação.

Novos tipos de input no HTML5

Input type color

Ainda não está implementado em nenhum browser, mas a idéia é facilitar os "color picker" tornando-os nativos de cada navegador.

Input type search

Um campo de texto com o diferencial de estar especificado que será de busca, poderá ser explorado por leitores de tela e dispositivos de acessibilidade para facilitar a navegação por buscas.

Input type number

Vai facilitar a validação se ela for implementada diretamente no browser, mas não traz nenhuma grande novidade.

Input type date

Outro input que pode facilitar muito a validação, a recomendação é que seja nativo do navegador um datepicker (com funcionamento semelhante ao calendário do jQuery UI).

Esta recomendação além de acabar com preocupação de validação no front-end para datas elimina a necessidade de implementação do datepicker.

Ponto negativo: acredito que os campos com datepicker, colopicker, etc. se tornatão os novos inputs do tipo "file" no sentido de impossibilidade de alteração de layout.

Espero que os browsers implementem uma forma de usar o CSS para estilizar o datepicker, caso contrário serão necessárias gambiarras e acho que o jeito vai ser manter o datepicker em JS para poder manter o layout, afinal o cliente (e o designer) não quer saber se é do browser e o visual não pode ser alterado, ele quer o checkbox, o radio, o select, o datepicker tudo conforme o layout dele – e com razão.

Input type datetime

A descrição do item anterior serve para este, com o diferencial que os dados desde são no formato datetime (além da data inclue a hora).

Input type datetime-local

Mais um campo bacana para o desenvolvimento de aplicativos web, principalmente quando você tem usuários localizados em fuso horários diversos.

Este campo é do tipo datetime mas com o diferencial que ele utiliza o fuso horário do computador do cliente e quando o form é enviado (submit) é realizado uma conversão para o fuso horário do servidor, acabando também com a necessidade de conversões de datas e horários para diferentes fusos.

Input type email

Sabendo da necessidade constante de validação de e-mail, a W3C implementou este novo type que também é recomendado que a validação seja nativa do browser, outra a menos para se preocupar.

 

Existem também novos eventos para os formulários, mas vai ficar para outro post pois aqui já tem bastante novidade. O que você achou dos novos tipos de input? Compartilhe sua opinião nos comentários!

Para saber mais sobre HTML5 leia também: