2184 capítulos
  Título Autor Editora Formato Comprar item avulso Adicionar à Pasta
Medium 9788565837194

22.6 Blobs

Flanagan David Grupo A PDF Criptografado

676

Parte II

JavaScript do lado do cliente

22.6 Blobs

Um Blob é uma referência opaca para (ou alça para) um trecho de dados. O nome vem dos bancos de dados SQL, onde significa “Binary Large Object” (objeto binário grande). Em JavaScript, os Blobs frequentemente representam dados binários e podem ser grandes, mas nenhuma das duas coisas é obrigatória: um Blob também poderia representar o conteúdo de um arquivo de texto pequeno. Os

Blobs são opacos: tudo que pode ser feito diretamente com eles é determinar seu tamanho em bytes, solicitar seu tipo MIME e decompô-los em Blobs menores: var blob = ... // Vamos ver posteriormente como obter um Blob blob.size

// Tamanho do Blob em bytes blob.type

// Tipo MIME do Blob ou "", se for desconhecido var subblob = blob.slice(0,1024, "text/plain"); // Primeiro 1K do Blob como texto var last = blob.slice(blob.size-1024, 1024);

// Último 1K do Blob, não tipado

O navegador Web pode armazenar Blobs na memória ou no disco e os Blobs podem representar trechos de dados enormes (como arquivos de vídeo), grandes demais para caber na memória principal sem primeiro serem decompostos em partes menores com slice(). Como os Blobs podem ser muito grandes e exigir acesso a disco, as APIs que trabalham com eles são assíncronas (com versões síncronas disponíveis para uso por threads worker).

Ver todos os capítulos
Medium 9788565837194

21.2 Escrevendo scripts de áudio e vídeo

Flanagan David Grupo A PDF Criptografado

Capítulo 21

Mídia e gráficos em scripts

601

Exemplo 21-1 Trocas não obstrusivas de imagens

// Garante que a imagem de troca esteja na cache

(new Image()).src = rollover;

// Define um atributo para lembrar o URL da imagem padrão img.setAttribute("data-rollout", img.src);

// Registra as rotinas de tratamento de evento que criam o efeito de troca img.onmouseover = function() { this.src = this.getAttribute("data-rollover");

}; img.onmouseout = function() { this.src = this.getAttribute("data-rollout");

};

}

});

21.2 Escrevendo scripts de áudio e vídeo

HTML5 introduz elementos e que, teoricamente, são tão fáceis de usar como o elemento . Nos navegadores habilitados para HTML5, você não precisa mais usar plug-ins (como o Flash) para incorporar sons e filmes em seus documentos HTML:

Na prática, o uso desses elementos é mais complicado do que isso, pois os fornecedores de navegador não concordaram com um codec de áudio e vídeo padrão que todos suportassem, de modo que você normalmente acaba usando elementos para especificar várias fontes de mídia em diferentes formatos:

Ver todos os capítulos
Medium 9788565837194

4.12 Expressões de avaliação

Flanagan David Grupo A PDF Criptografado

78

Parte I

JavaScript básica

onde op é um operador, é equivalente à expressão: a = a op b

Na primeira linha, a expressão a é avaliada uma vez. Na segunda, ela é avaliada duas vezes. Os dois casos vão diferir somente se a incluir efeitos colaterais, como em uma chamada de função ou um operador de incremento. As duas atribuições a seguir, por exemplo, não são iguais: data[i++] *= 2; data[i++] = data[i++] * 2;

4.12 Expressões de avaliação

Assim como muitas linguagens interpretadas, JavaScript tem a capacidade de interpretar strings de código-fonte, avaliando-as para produzir um valor. JavaScript faz isso com a função global eval(): eval("3+2") // => 5

A avaliação dinâmica de strings de código-fonte é um recurso poderoso da linguagem que quase nunca é necessário na prática. Se você se encontrar usando eval(), deve considerar com atenção se realmente precisa usá-la.

As subseções a seguir explicam o uso básico de eval() e, em seguida, explicam duas versões restritas que têm menos impacto sobre o otimizador.

Ver todos os capítulos
Medium 9788565837194

5.6 Saltos

Flanagan David Grupo A PDF Criptografado

100

Parte I

JavaScript básica

5.6 Saltos

Outra categoria de instruções de JavaScript são as instruções de salto. Conforme o nome lembra, elas fazem o interpretador JavaScript saltar para um novo local no código-fonte. A instrução break faz o interpretador saltar para o final de um laço ou para outra instrução. continue faz o interpretador pular o restante do corpo de um laço e voltar ao início de um laço para começar uma nova iteração.

JavaScript permite que as instruções sejam nomeadas (ou rotuladas), sendo que break e continue podem identificar o laço de destino ou outro rótulo de instrução.

A instrução return faz o interpretador saltar de uma chamada de função de volta para o código que a chamou e também fornece o valor para a chamada. A instrução throw provoca (ou “lança”) uma exceção e foi projetada para trabalhar com a instrução try/catch/finally, a qual estabelece um bloco de código de tratamento de exceção. Esse é um tipo complicado de instrução de salto: quando uma exceção é lançada, o interpretador pula para a rotina de tratamento de exceção circundante mais próxima, a qual pode estar na mesma função ou acima na pilha de chamada, em uma função invocadora.

Ver todos os capítulos
Medium 9788565837194

3.3 Valores booleanos

Flanagan David Grupo A PDF Criptografado

Capítulo 3 Tipos, valores e variáveis

39

Um valor booleano representa verdadeiro ou falso, ligado ou desligado, sim ou não. Só existem dois valores possíveis desse tipo. As palavras reservadas true e false são avaliadas nesses dois valores.

Geralmente, os valores booleanos resultam de comparações feitas nos programas JavaScript. Por exemplo: a == 4

Esse código faz um teste para ver se o valor da variável a é igual ao número 4. Se for, o resultado dessa comparação é o valor booleano true. Se a não é igual a 4, o resultado da comparação é false.

Os valores booleanos são comumente usados em estruturas de controle em JavaScript. Por exemplo, a instrução if/else de JavaScript executa uma ação se um valor booleano é true e outra ação se o valor é false. Normalmente, uma comparação que gera um valor booleano é combinada diretamente com a instrução que o utiliza. O resultado é o seguinte: if (a == 4) b = b + 1; else a = a + 1;

Esse código verifica se a é igual a 4. Se for, ele soma 1 a b; caso contrário, ele soma 1 a a. Conforme discutiremos na Seção 3.8, em JavaScript qualquer valor pode ser convertido em um valor booleano.

Ver todos os capítulos
Medium 9788565837194

4.7 Visão geral dos operadores

Flanagan David Grupo A PDF Criptografado

Capítulo 4

Expressões e operadores

61

new Object new Date

Quando uma expressão de criação de objeto é avaliada, JavaScript cria primeiro um novo objeto vazio, exatamente como aquele criado pelo inicializador de objetos {}. Em seguida, ela chama a função especificada com os argumentos especificados, passando o novo objeto como valor da palavra-chave this. Então, a função pode usar this para inicializar as propriedades do objeto recém-criado. As funções escritas para uso como construtoras não retornam um valor e o valor da expressão de criação de objeto é o objeto recém-criado e inicializado. Se uma função construtora retorna um valor de objeto, esse valor se torna o valor da expressão de criação de objeto e o objeto recém-criado é descartado.

As construtoras estão explicadas com mais detalhes no Capítulo 9.

4.7 Visão geral dos operadores

Os operadores são utilizados em JavaScript para expressões aritméticas, expressões de comparação, expressões lógicas, expressões de atribuição e muito mais. A Tabela 4-1 resume os operadores e serve como uma conveniente referência.

Ver todos os capítulos
Medium 9788565837194

6.9 Serializando objetos

Flanagan David Grupo A PDF Criptografado

Capítulo 6

Objetos

135

Serialização de objeto é o processo de converter o estado de um objeto em uma string a partir da qual ele pode ser restaurado posteriormente. ECMAScript 5 fornece as funções nativas JSON.stringify() e JSON.parse() para serializar e restaurar objetos de JavaScript. Essas funções utilizam o formato de troca de dados JSON. JSON significa “JavaScript Object Notation” (notação de objeto JavaScript) e sua sintaxe é muito parecida com a de objetos e array literais de JavaScript: o = {x:1, y:{z:[false,null,""]}}; s = JSON.stringify(o); p = JSON.parse(s);

// Define um objeto de teste

// s é '{"x":1,"y":{"z":[false,null,""]}}'

// p é uma cópia profunda de o

A implementação nativa dessas funções em ECMAScript 5 foi modelada de forma muito parecida com a implementação ECMAScript 3 de domínio público, disponível no endereço http://json.org/ json2.js. Para propósitos práticos, as implementações são iguais e você pode usar essas funções de

Ver todos os capítulos
Medium 9788565837194

5.8 Resumo das instruções JavaScript

Flanagan David Grupo A PDF Criptografado

110

Parte I

JavaScript básica

• No modo restrito, literais inteiros em octal (começando com um 0 que não é seguido por um x) não são permitidas. (No modo não restrito, algumas implementações permitem literais em octal.)

• No modo restrito, os identificadores eval e arguments são tratados como palavras-chave e não

é permitido alterar seus valores. Você pode atribuir um valor a esses identificadores, declará-los como variáveis, utilizá-los como nomes de função, utilizá-los como nomes de parâmetro de função ou utilizá-los como o identificador de um bloco catch.

• No modo restrito, a capacidade de examinar a pilha de chamada é restrita. arguments.caller e arguments.callee lançam ambos um TypeError dentro de uma função de modo restrito. As funções de modo restrito também têm propriedades caller e arguments que lançam um TypeError quando lidas. (Algumas implementações definem essas propriedades não padronizadas em funções não restritas.)

5.8 Resumo das instruções JavaScript

Ver todos os capítulos
Medium 9788565837194

2.4 Identificadores e palavras reservadas

Flanagan David Grupo A PDF Criptografado

Capítulo 2

Estrutura léxica

23

2.2 Comentários

JavaScript aceita dois estilos de comentários. Qualquer texto entre // e o final de uma linha é tratado como comentário e é ignorado por JavaScript. Qualquer texto entre os caracteres /* e */ também é tratado como comentário; esses comentários podem abranger várias linhas, mas não podem ser aninhados. As linhas de código a seguir são todas comentários JavaScript válidos:

// Este é um comentário de uma linha.

/* Este também é um comentário */ // e aqui está outro comentário.

/*

* Este é ainda outro comentário.

* Ele tem várias linhas.

*/

2.3 Literais

Um literal é um valor de dados que aparece diretamente em um programa. Os valores seguintes são todos literais:

12

1.2

"hello world"

'Hi' true false

/javascript/gi null

//

//

//

//

//

//

//

//

O número doze

O número um ponto dois

Ver todos os capítulos
Medium 9788565837194

12.2 E/S assíncrona com o Node

Flanagan David Grupo A PDF Criptografado

288

Parte I

JavaScript básica

12.2 E/S assíncrona com o Node

O Node é um interpretador JavaScript rápido, baseado em C++, com vínculos para as APIs Unix de baixo nível para trabalhar com processos, arquivos, soquetes de rede, etc., e também para cliente

HTTP e APIs de servidor. A não ser por alguns métodos síncronos com nomes especiais, os vínculos do Node são todos assíncronos e, por padrão, os programas Node nunca são bloqueados, isso quer dizer que normalmente mudam bem de escala e lidam com cargas grandes de forma eficiente. Como as APIs são assíncronas, o Node conta com rotinas de tratamento de evento, as quais são frequentemente implementadas com funções aninhadas e closures1.

Esta seção destaca algumas das APIs e dos eventos mais importantes do Node, mas de modo algum a documentação é completa. Consulte a documentação online do Node no endereço http://nodejs. org/api/.

Obtendo o Node

O Node é software livre que pode ser baixado no endereço http://nodejs.org. Quando este livro estava sendo produzido, o Node ainda estava sendo desenvolvido e distribuições binárias não estavam disponíveis – era preciso construir sua própria cópia a partir do código-fonte. Os exemplos desta seção foram escritos e testados com o Node versão 0.4. A API ainda não está congelada, mas é improvável que os fundamentos ilustrados aqui mudem muito no futuro.

Ver todos os capítulos
Medium 9788565837194

14.5 Caixas de diálogo

Flanagan David Grupo A PDF Criptografado

Capítulo 14

O objeto Window

339

!/compatible/.test(s) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec(s) ||

[]; return { name: match[1] || "", version: match[2] || "0" };

}());

onLine

A propriedade navigator.onLine (se existe) especifica se o navegador está conectado na rede.

Os aplicativos talvez queiram salvar o estado localmente (usando técnicas do Capítulo 20), enquanto estão off-line. geolocation

Objeto Geolocation que define uma API para determinar a localização geográfica do usuário.

Consulte a Seção 22.1 para ver os detalhes. javaEnabled()

Um método não padronizado que deve retornar

Java.

true

se o navegador pode executar applets

cookiesEnabled()

Método não padronizado que deve retornar true se o navegador pode armazenar cookies persistentes. Pode não retornar o valor correto se os cookies são configurados com base no site.

14.4.2 O objeto Screen

A propriedade screen de um objeto Window se refere a um objeto Screen que fornece informações sobre o tamanho da tela do usuário e o número de cores disponíveis. As propriedades width e height especificam o tamanho da tela em pixels. As propriedades availWidth e availHeight especificam o tamanho da tela realmente disponível; elas excluem o espaço exigido por recursos como uma barra de tarefas na área de trabalho. A propriedade colorDepth especifica o valor de bits por pixel da tela.

Ver todos os capítulos
Medium 9788565837194

9.2 Classes e construtoras

Flanagan David Grupo A PDF Criptografado

Capítulo 9

Classes e módulos

195

};

// Aqui estão exemplos de uso de um objeto range. var r = range(1,3);

// Cria um objeto range r.includes(2);

// => verdadeiro: 2 está no intervalo r.foreach(console.log);

// Imprime 1 2 3 console.log(r);

// Imprime (1...3)

Existem algumas coisas interessantes no código do Exemplo 9-1. Esse código define uma função fábrica range() para criar novos objetos range. Observe que usamos uma propriedade dessa função range(), range.methods, como um lugar conveniente para armazenar o objeto protótipo que define a classe. Não há nada de especial ou idiomático quanto a colocar o objeto protótipo aqui. Segundo, note que a função range() define propriedades from e to em cada objeto range. Essas são propriedades não herdadas e não compartilhadas que definem o estado exclusivo de cada objeto range individual. Por fim, note que todos os métodos herdados e compartilhados definidos em range.methods utilizam essas propriedades from e to, e que para se referirem a elas, utilizam a palavra-chave this para fazer referência ao objeto a partir do qual foram chamados. Esse uso de this é uma característica fundamental dos métodos de qualquer classe.

Ver todos os capítulos
Medium 9788565837194

5.4 Condicionais

Flanagan David Grupo A PDF Criptografado

90

Parte I

JavaScript básica

definição de função são implicitamente “içadas” para o topo do script ou função que as contém, de modo que sejam visíveis em todo o script ou função. Com var, somente a declaração da variável é içada – o código de inicialização da variável permanece onde é colocado. Contudo, com instruções de declaração de função, tanto o nome da função como o corpo da função são içados

– todas as funções de um script ou todas as funções aninhadas em uma função são declaradas antes de qualquer outro código ser executado. Isso significa que é possível chamar uma função em JavaScript antes de declará-la.

Assim como a instrução var, as instruções de declaração de função criam variáveis que não podem ser excluídas. Contudo, essas variáveis não são somente para leitura e seus valores podem ser sobrescritos.

5.4 Condicionais

As instruções condicionais executam ou pulam outras instruções, dependendo do valor de uma expressão especificada. Essas instruções são os pontos de decisão de seu código e às vezes também são conhecidas como “ramificações”. Se você imaginar um interpretador JavaScript seguindo um caminho através de seu código, as instruções condicionais são os lugares onde o código se ramifica em dois ou mais caminhos e o interpretador deve escolher qual caminho seguir.

Ver todos os capítulos
Medium 9788565837194

16.1 Visão geral de CSS

Flanagan David Grupo A PDF Criptografado

Capítulo 16

Escrevendo script de CSS

403

16.1 Visão geral de CSS

font-weight: bold

Para descrever completamente a apresentação visual de um elemento, em geral precisamos especificar o valor de mais de uma propriedade. Quando vários pares nome:valor são exigidos, eles são separados por pontos e vírgulas: margin-left: 10%; text-indent: .5in; font-size: 12pt;

/* a margem esquerda tem 10% da largura da página */

/* recua por 1/2 polegada */

/* tamanho da fonte de 12 pontos */

Como você pode ver, CSS ignora comentários entre /* e */. No entanto, não aceita comentários que começam com //.

Existem duas maneiras de associar um conjunto de valores de propriedade CSS aos elementos

HTML cuja apresentação definem. A primeira é configurando o atributo style de um elemento

HTML individual. Isso é chamado de estilo em linha:

This paragraph has increased margins and is surrounded by a rectangular red border.

Ver todos os capítulos
Medium 9788565837194

3.7 Valores primitivos imutáveis e referências de objeto mutáveis

Flanagan David Grupo A PDF Criptografado

Capítulo 3 Tipos, valores e variáveis

43

Note que é possível (mas quase nunca necessário ou útil) criar objetos wrapper explicitamente, chamando as construtoras String(), Number() ou Boolean(): var var var var

s

S

N

B

=

=

=

=

"test", n = 1, b = true; new String(s); new Number(n); new Boolean(b);

//

//

//

//

Uma string, um número e um valor booleano.

Um objeto String

Um objeto Number

Um objeto Boolean

JavaScript converte objetos wrapper no valor primitivo empacotado, quando necessário; portanto, os objetos S, N e B anteriores normalmente (mas nem sempre) se comportam exatamente como os valores s, n e b. O operador de igualdade == trata um valor e seu objeto wrapper como iguais, mas é possível diferenciá-los com o operador de igualdade restrito ===. O operador typeof também mostra a diferença entre um valor primitivo e seu objeto wrapper.

3.7 Valores primitivos imutáveis e referências de objeto mutáveis

Ver todos os capítulos

Carregar mais