<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Javascript &#8211; Turbosite &#8211; Blog</title>
	<atom:link href="https://www.turbosite.com.br/blog/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.turbosite.com.br/blog</link>
	<description></description>
	<lastBuildDate>Wed, 19 Jul 2017 13:47:57 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://www.turbosite.com.br/blog/wp-content/uploads/2026/09/cropped-logo_turbo_vermelha-32x32.png</url>
	<title>Javascript &#8211; Turbosite &#8211; Blog</title>
	<link>https://www.turbosite.com.br/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Javascript lidera o Ranking das linguagens de programação mais usadas no mundo</title>
		<link>https://www.turbosite.com.br/blog/javascript-lidera-o-ranking-das-linguagens-de-programacao-mais-usadas-no-mundo/</link>
		
		<dc:creator><![CDATA[turboajuda]]></dc:creator>
		<pubDate>Wed, 19 Jul 2017 13:47:57 +0000</pubDate>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Notícias]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[linguagem]]></category>
		<category><![CDATA[lista]]></category>
		<category><![CDATA[programacao]]></category>
		<category><![CDATA[programacao javascript]]></category>
		<category><![CDATA[ranking]]></category>
		<guid isPermaLink="false">https://www.turbosite.com.br/blog/?p=4202</guid>

					<description><![CDATA[Duas das maiores comunidades de desenvolvedores de software da internet, Stack Overflow e o GitHub, atualizaram o ranking com as linguagens de programação que foram mais populares  durante…]]></description>
										<content:encoded><![CDATA[<p>Duas das maiores comunidades de desenvolvedores de software da internet, Stack Overflow e o GitHub, atualizaram o ranking com as linguagens de programação que foram mais populares  durante o mês de junho.</p>
<p>JavaScript ganha destaque na lista, deixando para traz outros nomes famosos, como Java, Python e C++.  Caso curioso, o Switft, que foi apresentado ao mundo  pela Apple, em 2014, conseguiu lugar de destaque no ranking e está cada vez mais próximo de entrar no top 10.</p>
<p>A lista deveria ter apenas 20 entradas, mas tem um empate no seu final, acrescentando mais dois nomes à mesma. Confira:</p>
<p>1 JavaScript<br />
2 Java<br />
3 Python<br />
4 PHP<br />
5 C #<br />
6 C ++<br />
7 CSS<br />
8 Ruby<br />
9 C<br />
10 Objetivo-C<br />
11 Swift<br />
12 Shell<br />
12 Scala<br />
14 R<br />
15 Go<br />
15 Perl<br />
17 TypeScript<br />
18 PowerShell<br />
19 Haskell<br />
20 CoffeeScript<br />
20 Lua<br />
20 Matlab</p>
<p>&nbsp;</p>
<p>Podemos observar dois pontos desde 2012 no ranking: o poder de permanência notável de Java Script e Java no topo dos rankings. Java nunca esteve abaixo da segunda posição. Já o C++ sempre esteve presente entre as dez principais linguagens.</p>
<p><img fetchpriority="high" decoding="async" class="aligncenter size-large wp-image-4203" src="https://www.turbosite.com.br/blog/wp-content/uploads/2017/07/lang.rank_.617.wm_-1024x918.png" alt="Ranking linguagem de programação" width="680" height="610" srcset="https://www.turbosite.com.br/blog/wp-content/uploads/2017/07/lang.rank_.617.wm_-1024x918.png 1024w, https://www.turbosite.com.br/blog/wp-content/uploads/2017/07/lang.rank_.617.wm_-300x269.png 300w, https://www.turbosite.com.br/blog/wp-content/uploads/2017/07/lang.rank_.617.wm_-768x688.png 768w, https://www.turbosite.com.br/blog/wp-content/uploads/2017/07/lang.rank_.617.wm_.png 1250w" sizes="(max-width: 680px) 100vw, 680px" /></p>
<p>Fonte: <a href="http://redmonk.com/sogrady/2017/06/08/language-rankings-6-17/" target="_blank" rel="noopener">http://redmonk.com/sogrady/2017/06/08/language-rankings-6-17/</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>10 dicas de como escrever JavaScript sem jQuery</title>
		<link>https://www.turbosite.com.br/blog/10-dicas-de-como-escrever-javascript-sem-jquery/</link>
		
		<dc:creator><![CDATA[turboajuda]]></dc:creator>
		<pubDate>Mon, 13 Apr 2015 12:45:32 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[dicas javascript]]></category>
		<category><![CDATA[javascript puro]]></category>
		<category><![CDATA[no jQuery]]></category>
		<guid isPermaLink="false">https://www.turbosite.com.br/blog/?p=4086</guid>

					<description><![CDATA[10 dicas de como escrever JavaScript sem jQuery. Se você tem um pequeno projeto e que deixá-lo enxuto, deve ser considerado utilizar essas dicas!]]></description>
										<content:encoded><![CDATA[<p>jQuery é uma grande biblioteca e isto não podemos negar. Ela apareceu quando o IE6 era o navegador mais utilizado. Naquela época, havia peculiaridades que tornava escrever JavaScript puro tedioso/complicado, era necessário muitas adaptações para funcionar nos diversos browsers, para contornar estes problemas jQuery era a ferramenta perfeita para escrever códigos cross browser.</p>
<p>Hoje, no entanto, os navegadores melhoraram muito. Podemos usar confortavelmente todos os recursos fornecidos pelo ES5 (Ecmascript 5), e nós temos à nossa disposição APIs HTML 5 impressionantes que tornam o trabalho com o DOM muito mais fácil. Os desenvolvedores estão agora em uma posição onde eles podem optar por deixar de fora jQuery para alguns projetos, e ainda manter sua produtividade.</p>
<p>Não interpretem mal, jQuery ainda é uma biblioteca maravilhosa. No entanto, para pequenos projetos como páginas e interações simples, deveríamos utilizar JavaScript puro, assim economizando um pouco de recursos. Aqui estão 10 dicas que irão ajudá-lo com pequenos trechos de código.</p>
<p>Após ler estas 10 dicas de como escrever JavaScript sem jQuery você será capaz de capturar, alterar, inserir e remover conteúdos do HTML sem a necessidade de utilizar jQuery, como também utilizar os eventos, alterar classes e atributos.</p>
<blockquote><p> Este artigo é uma tradução de <a href="http://tutorialzine.com/2014/06/10-tips-for-writing-javascript-without-jquery/">10 Tips for Writing JavaScript without jQuery</a></p></blockquote>
<h3>1. Escutando pelo carregando da página</h3>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:php decode:true" title="Escutando pelo carregando da página">// Adicionar uma escuta ao carregamento da página, logo após
// chame uma função anonima e execute seu código JavaScript

document.addEventListener('DOMContentLoaded', function () {

    // Diga Olá para o Console :)
    console.log('Olá Console!');

});</pre>
<p>&nbsp;</p>
<h3>2. Selecionando elementos</h3>
<p>Antigamente só podemos selecionar elementos por id, classe e nome do elemento. jQuery foi um salva-vidas com os seus seletores estilo css inteligentes. Criadores de Browsers gostaram e introduziram duas APIs importantes &#8211; querySelector e querySelectorAll:</p>
<p><iframe width="100%" height="300" src="//jsfiddle.net/rf9abd2h/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>
<p>&nbsp;</p>
<h3>3. Adicionar e remover eventos de escuta</h3>
<p>Ouvir eventos é uma parte fundamental da construção de uma aplicação web e hoje sua utilização foi simplificada com o addEventListener:</p>
<p><iframe width="100%" height="300" src="//jsfiddle.net/txzaej6w/1/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>
<p>&nbsp;</p>
<h3>4. Manipulando classes e atributos</h3>
<p>Manipular nomes de classes sem jQuery costumava ser muito inconveniente. Não mais, graças à propriedade <a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/classList">classList</a>. E se você precisa para manipular atributos, você tem <a href="https://developer.mozilla.org/en-US/docs/Web/API/Element.setAttribute">setAttribute</a>.</p>
<p><iframe loading="lazy" width="100%" height="300" src="//jsfiddle.net/ez888e9j/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>
<p>&nbsp;</p>
<h3>5. Obter e manipular classes e atributos</h3>
<p>jQuery tem os métodos text() e html(). Opcional a isto, podemos usar as propriedades <a href="https://developer.mozilla.org/en-US/docs/Web/API/Node.textContent">TextContent</a> e <a href="https://developer.mozilla.org/en-US/docs/Web/API/Element.innerHTML">innerHTML</a>:</p>
<p><iframe loading="lazy" width="100%" height="300" src="//jsfiddle.net/z6t58gee/1/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>
<p>&nbsp;</p>
<h3>6. Inserindo e removendo elementos</h3>
<p>Embora jQuery torna muito mais fácil a adição e remoção de elementos do DOM, hoje com JavaScript puro é relativamente simples. Veja como acrescentar, remover e substituir qualquer elemento:</p>
<p><iframe loading="lazy" width="100%" height="300" src="//jsfiddle.net/gcjxrh44/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>
<p>&nbsp;</p>
<h3>7. Andando pelo DOM</h3>
<p>Como todo verdadeiro ninja JS sabe, há uma grandes segredos escondidos no DOM. Em comparação com jQuery, APIs DOM oferecem funcionalidades limitadas para a seleção de elementos. No entanto, ainda existem muitos recursos que você poderá utilizar para percorrer todo o DOM.</p>
<p><iframe loading="lazy" width="100%" height="300" src="//jsfiddle.net/wqs2Lw88/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>
<p>&nbsp;</p>
<h3>8. Looping sobre matrizes</h3>
<p>Alguns dos métodos que utilizamos em jQuery estão disponíveis com o padrão ES5. Para iteração, podemos usar <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach">forEach</a> e <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map">map</a> em vez de suas versões do jQuery &#8211; <strong>each</strong>() e do <strong>map</strong>(). Só tome cuidado para as diferenças de argumentos e padrão este valor nos retornos de chamada.</p>
<p><iframe loading="lazy" width="100%" height="300" src="//jsfiddle.net/5g4dhb9r/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>
<p>&nbsp;</p>
<h3>9. Animações</h3>
<p>O método animate do jQuery é superior a qualquer coisa que você tentar com JavaScript puro, mas se você precisar de animações complexas , você ainda deve utilizar jQuery. Mas, graças a todas as maravilhas do CSS3, alguns dos casos mais simples podem ser tratadas com uma biblioteca leve como <a href="http://daneden.github.io/animate.css/">Animate.css</a>, que permite acionar animações, adicionando ou removendo os nomes de classe de elementos.</p>
<p><iframe loading="lazy" width="100%" height="300" src="//jsfiddle.net/cxvcuvzv/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>
<p>&nbsp;</p>
<h3>10. AJAX</h3>
<p>AJAX foi outra tecnologia que costumava ser uma bagunça quando se falava de cross-browser. A boa notícia é que agora podemos usar o mesmo código em todos os lugares. A má notícia, porém, é que ele ainda é complicado para instanciar e enviar solicitações de AJAX com <a href="https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest">XMLHttpRequest</a>, por isso é melhor deixar para uma biblioteca. Mas você não precisa incluir jQuery só para isso. Você pode usar uma das inúmeras <a href="http://microjs.com/#ajax">bibliotecas leves</a> que estão disponíveis. Aqui está um exemplo a construção de uma solicitação AJAX diretamente, e usando a biblioteca <a href="https://github.com/ded/reqwest">reqwest</a>:</p>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true">// Este exemplo demonstra a maneira de criar uma requisição, neste exemplo é requisitado uma página e capturado seu conteúdo body e logado no console.

var request = new XMLHttpRequest();
request.open('GET', 'http://localhost', true);

request.onload = function (e) {
    if (request.readyState === 4) {

        // Verifique se a requisição foi efetuada com sucesso.

        if (request.status === 200) {
            console.log(request.responseText);
        } else {
            console.error(request.statusText);
        }
    }
};

// Resgata erros:

request.onerror = function (e) {
    console.error(request.statusText);
};

request.send(null);

// Outro metódo utilizando uma pequena biblioteca chamada Reqwest (1.5Kb), isto pode tornar seu trabalho mais fácil.

reqwest({
    url: 'http://localhost/',
    method: 'get',
    error: function (err) {},
    success: function (resp) {
        console.log(resp);
    }
});</pre>
<p>&nbsp;</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Otimizar CSS com Gulp &#8211; Agrupar + Minificar</title>
		<link>https://www.turbosite.com.br/blog/otimizar-css-com-gulp-agrupar-minificar/</link>
		
		<dc:creator><![CDATA[turboajuda]]></dc:creator>
		<pubDate>Thu, 19 Mar 2015 14:37:39 +0000</pubDate>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[gulp]]></category>
		<category><![CDATA[minificar css]]></category>
		<guid isPermaLink="false">https://www.turbosite.com.br/blog/?p=4049</guid>

					<description><![CDATA[No post anterior fizemos uma introdução ao Gulp e como automatizar a tarefa de Minificar + Compactar código javascript. Neste, vamos trabalhar com CSS executando as seguintes funções: remover…]]></description>
										<content:encoded><![CDATA[<p>No post anterior fizemos uma introdução ao Gulp e como automatizar a tarefa de Minificar + Compactar código javascript. Neste, vamos trabalhar com CSS executando as seguintes funções: remover comentários, compactar e gerar apenas um arquivo final.</p>
<p>Se você não viu o post anterior, confira este <strong><a title="Tutorial Gulp, saiba como a começar utilizar em seus Projetos" href="https://www.turbosite.com.br/blog/tutorial-gulp-saiba-como-a-comecar-utilizar-em-seus-projetos/">link</a>, será necessário pois existem passos a serem seguidos</strong>. O código final do post anterior resultou para compactação + minificação de JS, veja o resultado:</p>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true">var js  = [
    './js-source/vendor/jquery/*',         // Todos os arquivos do diretório Jquery
    './js-source/vendor/bootstrap/*.*',    // Todos os arquivos do diretório bootstrap e sub diretórios
    './js-source/main.js'                  // Arquivo único
];

// Núcleo do Gulp
var gulp = require('gulp');

// Transforma o javascript em formato ilegível para humanos
var uglify = require("gulp-uglify");

// Agrupa todos os arquivos em um
var concat = require("gulp-concat");

// Tarefa de minificação do Javascript
gulp.task('minify-js', function () {
    gulp.src(js)                        // Arquivos que serão carregados, veja variável 'js' no início
    .pipe(concat('script.min.js'))      // Arquivo único de saída
    .pipe(uglify())                     // Transforma para formato ilegível
    .pipe(gulp.dest('./js/'));          // pasta de destino do arquivo(s)
});

// Tarefa padrão quando executado o comando GULP
gulp.task('default',['minify-js']);

// Tarefa de monitoração caso algum arquivo seja modificado, deve ser executado e deixado aberto, comando "gulp watch".
gulp.task('watch', function() {
    gulp.watch(js, ['minify-js']);
});</pre>
<p>&nbsp;</p>
<p>Para trabalhar com CSS é necessário instalar outros plugins, execute o comando abaixo no <strong>prompt</strong>, lembre, você deve estar na pasta do seu projeto:</p>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true">npm install --save-dev gulp-cssmin gulp-watch gulp-concat gulp-strip-css-comments</pre>
<p>&nbsp;</p>
<p>Com os plugins instalados, crie o arquivo gulp.js com o seguinte conteúdo, este arquivo é válido apenas para trabalhar com CSS, no final do post mostraremos os 2 scripts trabalhando em conjunto:</p>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true">// Definimos o diretório dos arquivos para evitar repetição futuramente

// Todos os arquivos CSS que serão compactados
// Explicação: /* busca todos os arquivos de uma pasta, /**/*.* busca todos os arquivos de uma pasta e sub pasta.
var css = [
	'./css-source/bootstrap/*.css',
	'./css-source/style.css'
];

// Núcleo do Gulp
var gulp = require('gulp');

// Verifica alterações em tempo real, caso haja, compacta novamente todo o projeto 
var watch = require('gulp-watch');

// Minifica o CSS
var cssmin = require("gulp-cssmin");

// Agrupa todos arquivos em UM
var concat = require("gulp-concat");

// Remove comentários CSS
var stripCssComments = require('gulp-strip-css-comments');

// Processo que agrupará todos os arquivos CSS, removerá comentários CSS e minificará.
gulp.task('minify-css', function(){
    gulp.src(css)
    .pipe(concat('style.min.css'))
    .pipe(stripCssComments({all: true}))
    .pipe(cssmin())
    .pipe(gulp.dest('./css/'));
});

// Cria a TASK padrão, esta linha será processada quando o comando "GULP" for executado
gulp.task('default','minify-css');

// Cria a TASK de verificar em tempo real alterações, se detectar alguma alteração, será processado o comando relativo ao arquivo
gulp.task('watch', function() {
  gulp.watch(css, ['minify-css']);
});</pre>
<p>&nbsp;</p>
<p>Neste exemplo, partimos do pré-suposto que existe a seguinte estrutura de pastas/arquivos:</p>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true">css-source
    vendor
        bootstrap
            bootstrap.css
    style.css
css(pasta vazia)
gulp.js
package.json</pre>
<p>&nbsp;</p>
<p>Execute o comando</p>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true">gulp</pre>
<p>&nbsp;</p>
<p>Será gerado um arquivo CSS na pasta &#8216;css&#8217; com o nome de style.min.css com todo o conteúdo de arquivos CSS selecionados. Caso queira que o gulp monitore alterações nos arquivos CSS e compacte automaticamente caso sofra alterações, use o seguinte comando e deixe o prompt aberto.</p>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true">gulp watch</pre>
<p>&nbsp;</p>
<p>Agora vamos utilizar os 2 scripts, otimização de CSS e JS:</p>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true">// Definimos o diretório dos arquivos para evitar repetição futuramente

// Todos os arquivos CSS que serão compactados
// Explicação: /*.css busca todos os arquivos css de uma pasta, /**/*.css busca todos os arquivos css de uma pasta e sub pasta.
var css = [
	'./css-source/bootstrap/*.css',
	'./css-source/style.css'
];

// Todos os arquivos JS que serão compactados
// Explicação: /*.js busca todos os arquivos css de uma pasta, /**/*.js busca todos os arquivos js de uma pasta e sub pasta.
var js  = [
    './js-source/vendor/jquery/*.js',         // Todos os arquivos do diretório Jquery
    './js-source/vendor/bootstrap/*.js',    // Todos os arquivos do diretório bootstrap e sub diretórios
    './js-source/main.js'                  // Arquivo único
];

// Núcleo do Gulp
var gulp = require('gulp');

// Transforma o javascript em formato ilegível para humanos
var uglify = require("gulp-uglify");

// Agrupa todos os arquivos em um
var concat = require("gulp-concat");

// Verifica alterações em tempo real, caso haja, compacta novamente todo o projeto 
var watch = require('gulp-watch');

// Minifica o CSS
var cssmin = require("gulp-cssmin");

// Remove comentários CSS
var stripCssComments = require('gulp-strip-css-comments');

// Processo que agrupará todos os arquivos CSS, removerá comentários CSS e minificará.
gulp.task('minify-css', function(){
    gulp.src(css)
    .pipe(concat('style.min.css'))
    .pipe(stripCssComments({all: true}))
    .pipe(cssmin())
    .pipe(gulp.dest('./css/'));
});

// Tarefa de minificação do Javascript
gulp.task('minify-js', function () {
    gulp.src(js)                        // Arquivos que serão carregados, veja variável 'js' no início
    .pipe(concat('script.min.js'))      // Arquivo único de saída
    .pipe(uglify())                     // Transforma para formato ilegível
    .pipe(gulp.dest('./js/'));          // pasta de destino do arquivo(s)
});

// Tarefa padrão quando executado o comando GULP
gulp.task('default',['minify-js','minify-css']);

// Tarefa de monitoração caso algum arquivo seja modificado, deve ser executado e deixado aberto, comando "gulp watch".
gulp.task('watch', function() {
    gulp.watch(js, ['minify-js']);
	gulp.watch(css, ['minify-css']);
});</pre>
<p>Executando o comando gulp, será compactado css e js, executando o comando gulp watch os arquivos serão monitorados, e caso css ou js seja alterado, será executado a ação correspondendo a cada arquivo.</p>
<p>Dúvidas? Sugestões? Deixe nos comentários.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Tutorial Gulp, saiba como a começar utilizar em seus Projetos</title>
		<link>https://www.turbosite.com.br/blog/tutorial-gulp-saiba-como-a-comecar-utilizar-em-seus-projetos/</link>
		
		<dc:creator><![CDATA[turboajuda]]></dc:creator>
		<pubDate>Wed, 11 Mar 2015 17:21:25 +0000</pubDate>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[automatizador]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[gulp]]></category>
		<category><![CDATA[js]]></category>
		<guid isPermaLink="false">http://blog.turbosite.com.br/?p=4004</guid>

					<description><![CDATA[Tutorial Gulp - Saiba como começar a utilizá-lo em seus projetos]]></description>
										<content:encoded><![CDATA[<p><a href="http://gulpjs.com/">Gulp</a> é um automatizador de tarefas, semelhante ao <a href="http://gruntjs.com/">Grunt</a>, porém mais rápido. Para quem já utiliza o Grunt, geralmente pergunta porque deveria utilizar o Gulp, a reposta é simples, o Gulp é mais rápido e tem uma escrita mais simples.</p>
<p>Para quem não sabe, automatizador de tarefas é uma ferramenta que agiliza o processo de desenvolvimento em ações repetitivas. Exemplo, minificar arquivos Javascript e CSS. Testar se o código Javascript está correto, agrupar diversos arquivos em um, ofuscar código Javascript&#8230; São diversas opções, você pode conferir todos os pacotes visitando o link de <a href="http://gulpjs.com/plugins/">Plugins</a>.</p>
<p>Chega de explicações e vamos fazer na prática.</p>
<blockquote><p>Obrigatório ter o node.js instalado, caso não tenha, entre no site <a href="https://nodejs.org/">node.js</a>, faça download e instale.</p></blockquote>
<p>Crie uma pasta com um nome desejado, entre nesta pasta e crie o arquivo <strong>package.json</strong> com o conteúdo abaixo:</p>
<pre class="left-set:true right-set:true whitespace-before:2 whitespace-after:2 lang:js mark:5 decode:true " title="package.json">{
  "name": "aprendendo",
  "version": "1.0.0",
  "description": "Aprendendo Gulp",
  "author": "Seu nome&lt;seu@email.com.br&gt;",
  "devDependencies": {
	"gulp": "*",
	"gulp-uglify" : "*",
	"gulp-concat" : "*"
  }
}
</pre>
<p>Após o arquivo criado, adicione seu nome e e-mail na linha &#8220;author&#8221; de acordo com o formato exemplificado. Depois, instale as dependências via linha de comando ( obrigatório estar na pasta criada ):</p>
<pre class="left-set:true right-set:true whitespace-before:2 whitespace-after:2 lang:php decode:true " title="Linha de Comando">npm install</pre>
<p>Agora, crie o arquivo gulp.js que será onde ficará as configurações do Gulp e insira o conteúdo:</p>
<pre class="left-set:true right-set:true whitespace-before:2 whitespace-after:2 lang:js decode:true" title="gulp.js">var js  = [
    './js-source/vendor/jquery/*',         // Todos os arquivos do diretório Jquery
    './js-source/vendor/bootstrap/*.*',     // Todos os arquivos do diretório bootstrap e sub diretórios
    './js-source/main.js'                  // Arquivo único
];

// Núcleo do Gulp
var gulp = require('gulp');

// Transforma o javascript em formato ilegível para humanos
var uglify = require("gulp-uglify");

// Agrupa todos os arquivos em um
var concat = require("gulp-concat");

// Tarefa de minificação do Javascript
gulp.task('minify-js', function () {
    gulp.src(js)                        // Arquivos que serão carregados, veja variável 'js' no início
    .pipe(concat('script.min.js'))      // Arquivo único de saída
    .pipe(uglify())                     // Transforma para formato ilegível
    .pipe(gulp.dest('./js/'));          // pasta de destino do arquivo(s)
});

// Tarefa padrão quando executado o comando GULP
gulp.task('default',['minify-js']);

// Tarefa de monitoração caso algum arquivo seja modificado, deve ser executado e deixado aberto, comando "gulp watch".
gulp.task('watch', function() {
    gulp.watch(js, ['minify-js']);
});
</pre>
<p>Neste arquivo, estamos supondo que estamos com a seguinte estrutura:</p>
<pre class="left-set:true right-set:true whitespace-before:2 whitespace-after:2 lang:php decode:true" title="Estrutura">js-source
    vendor
        jquery
            jquery.js
        bootstrap
            bootstrap.main.js
            bootstrap.plugins.js
    main.js
js(pasta vazia)
gulp.js
package.json</pre>
<p>Execute o comando abaixo:</p>
<pre class="left-set:true right-set:true whitespace-before:2 whitespace-after:2 lang:php decode:true" title="Comando">gulp</pre>
<p>Após executar o comando gulp, será gerado o arquivo <strong>script.min.js</strong> na pasta js. Desta forma, após alterações nos arquivos o comando deverá ser disparado novamente para gerar a nova versão. Um pouco trabalhoso, mas existe uma maneira de automatizar isto.</p>
<p>Vamos utilizar a TASK &#8220;watch&#8221; para fazer isto por nós. Digite &#8220;<strong>gulp watch</strong>&#8221; e deixe a janela aberta, não cancele pois o processo ficará monitorando os arquivos, caso algum tenha alguma alteração, o arquivo final será gerado novamente.</p>
<p>Este exemplo é válido para compactar, ofuscar e gerar um arquivo único de javascript. No próximo tutorial vamos mostrar como fazer isto com arquivos CSS. </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>HTML5 Web Storage &#8211; Mais seguro que Cookies</title>
		<link>https://www.turbosite.com.br/blog/html5-web-storage-mais-seguro-que-cookies/</link>
		
		<dc:creator><![CDATA[turboajuda]]></dc:creator>
		<pubDate>Wed, 10 Dec 2014 12:01:35 +0000</pubDate>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[armazenando dados h5ml]]></category>
		<category><![CDATA[html 5 web storage]]></category>
		<category><![CDATA[web storage]]></category>
		<guid isPermaLink="false">http://blog.turbosite.com.br/?p=3925</guid>

					<description><![CDATA[HTML 5 Web Storage é uma alternativa para armazenar dados e os persistirem do lado do cliente. Ele é mais seguro e confiável que os Cookies.]]></description>
										<content:encoded><![CDATA[<p>HTML 5 Web Storage é uma alternativa para armazenar dados e os persistirem do lado do cliente. Ele é mais seguro e confiável que os Cookies, além de não serem enviados em todas as requisições para o servidor, em consequência, em aplicações de grande porte isto economizará muitos dados trafegados.</p>
<p>Uma citação da W3C Schools que vale nossa atenção, ela é mencionada comparando com os Cookies:</p>
<blockquote><p>Local storage is more secure, and large amounts of data can be stored locally, without affecting website performance.</p></blockquote>
<p>Fonte: <a href="http://www.w3schools.com/html/html5_webstorage.asp">http://www.w3schools.com/html/html5_webstorage.asp</a></p>
<p>&nbsp;</p>
<p>Nós publicamos um artigo falando sobre <a title="SQL do lado do Cliente? Web SQL Database com HTML5" href="https://www.turbosite.com.br/blog/sql-do-lado-do-cliente-web-sql-database-com-html5/">Web SQL Database</a> que veio para suprir esta necessidade, mas, infelizmente publicamos uma tecnologia que está <span style="color: #ff0000;">obsoleta <span style="color: #000000;">(gafe nossa)</span></span> e por isso não indicamos a utilizá-la.</p>
<p>&nbsp;</p>
<p>A vantagem de utilizarmos o HTML 5 Web Storage é a facilidade, a compatibilidade já que, ele é suportado na maiores dos browser e por incrível que pareça, a partir do IE8 você pode utilizá-lo (isto chega a nos surpreender).</p>
<p>Testados e suportados:  <img loading="lazy" decoding="async" class="alignnone size-large wp-image-3927" src="https://www.turbosite.com.br/blog/wp-content/uploads/2014/12/compatible_safari.gif" alt="compatible_safari" width="28" height="30" /> <img loading="lazy" decoding="async" class="alignnone size-large wp-image-3928" src="https://www.turbosite.com.br/blog/wp-content/uploads/2014/12/compatible_chrome.gif" alt="compatible_chrome" width="31" height="30" /> <img loading="lazy" decoding="async" class="alignnone size-large wp-image-3929" src="https://www.turbosite.com.br/blog/wp-content/uploads/2014/12/compatible_firefox.gif" alt="compatible_firefox" width="31" height="30" /> <img loading="lazy" decoding="async" class="alignnone size-large wp-image-3930" src="https://www.turbosite.com.br/blog/wp-content/uploads/2014/12/compatible_ie.gif" alt="compatible_ie" width="31" height="30" /> <img loading="lazy" decoding="async" class="alignnone size-large wp-image-3931" src="https://www.turbosite.com.br/blog/wp-content/uploads/2014/12/compatible_opera.gif" alt="compatible_opera" width="28" height="30" /></p>
<p>Um detalhe que deve ser conhecido é, o Local Storage é por domínio e os dados podem ser armazenados/acessados por todas as páginas do mesmo.</p>
<p>Bom, chega de explicações, vamos a prática.</p>
<p>&nbsp;</p>
<h2>Métodos utilizados</h2>
<p>localStorage.setItem(name, value);<br />
localStorage.getItem(name);<br />
localStorage.clear();<br />
localStorage.length;</p>
<p>&nbsp;</p>
<h2>Testando se o Browser suporta Web Storage</h2>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true ">if(typeof(Storage) !== "undefined") {
    // Código para localStorage/sessionStorage
} else {
    // Implemente outra solução, está não funciona. :/
}</pre>
<p>&nbsp;</p>
<blockquote><p><strong>Observação</strong>: O Web Storage não armazena objetos e  arrays em JavaScript, por isto utilizamos o JSON.stringify e JSON.parse para converter os objetos de forma apropriada para armazenar.</p></blockquote>
<p>&nbsp;</p>
<h2>Armazenando uma informação</h2>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true ">// Forma declarativa
localStorage.setItem("employer", "Turbosite"); 	// Armazena o valor
localStorage.getItem("employer"); 		// Resgata o valor "Turbosite"

// Forma comprimida
localStorage.employer = "Turbosite";		// Armazena o valor
localStorage.employer; 				// Resgata o valor "Turbosite"</pre>
<p>&nbsp;</p>
<h2>Verificando o tamanho do Web Storage</h2>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true ">// Verificando o tamanho do Storage ( itens armazenados )
localStorage.length</pre>
<p>&nbsp;</p>
<h2>Removendo itens</h2>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true ">// Remover um item pela API
localStorage.removeItem("employer");

// Remover um item via Javascript nativo
delete(localStorage.employer);</pre>
<p>&nbsp;</p>
<h2>Zerando o Web Storage</h2>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true ">// Remover tudo
localStorage.clear();			// Reseta os dados
</pre>
<h2></h2>
<h2>Armazenando objetos em Javascript</h2>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true ">data_employer = {
	"name": "Turbosite",
	"phones" : [
		"4003-2322",
		"4062-1020",
		"0800 888 2322"
	],
	"location": {
		"city": "Belo Horizonte",
		"state": "Minas Gerais",
		"country": "Brasil"
	}
}

localStorage.data_employer = data_employer;
localStorage.data_employer; // Resultado: "[object Object]"</pre>
<p>&nbsp;</p>
<p>Como podem ver, o resultado não foi o esperado, o Web Storage converteu o objeto para toString() e em vez de armazenar os dados do objeto, armazenou a string [object Object].</p>
<p>Uma solução seria, converter o objeto para string e armazená-lo, existe a função nativa JSON.stringify, desta forma ficaria:</p>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true ">data_employer = {
	"name": "Turbosite",
	"phones" : [
		"4003-2322",
		"4062-1020",
		"0800 888 2322"
	],
	"location": {
		"city": "Belo Horizonte",
		"state": "Minas Gerais",
		"country": "Brasil"
	}
}

localStorage.data_employer = JSON.stringify(data_employer);
localStorage.data_employer; // "{"name":"Turbosite","phones":["4003-2322","4062-1020","0800 888 2322"],"location":{"city":"Belo Horizonte","state":"Minas Gerais","country":"Brasil"}}"</pre>
<p>&nbsp;</p>
<p>Como agora é uma string, não pode ser trabalhada como um objeto, mas, basta agora utilizar a JSON.parse que novamente será um objeto manipulável, exemplo:</p>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true ">data_employer = JSON.parse(localStorage.data_employer); // Object {name: "Turbosite", phones: Array[3], location: Object}</pre>
<p>&nbsp;</p>
<p>Muito simples e tranquilo de trabalhar e como a própria W3C disse, mais seguro e rápido, nada de sobrecarregar servidores com COOKIES gigantescos. Dicas e comentários são sempre bem vindos, correções também.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>SQL do lado do Cliente? Web SQL Database com HTML5</title>
		<link>https://www.turbosite.com.br/blog/sql-do-lado-do-cliente-web-sql-database-com-html5/</link>
		
		<dc:creator><![CDATA[turboajuda]]></dc:creator>
		<pubDate>Tue, 09 Dec 2014 13:54:17 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[html 5 SQL]]></category>
		<category><![CDATA[novidade HTML 5]]></category>
		<category><![CDATA[SQL do lado do cliente]]></category>
		<category><![CDATA[Web SQL Database]]></category>
		<guid isPermaLink="false">http://blog.turbosite.com.br/?p=3903</guid>

					<description><![CDATA[Como trabalhar com o recurso Web SQL Database HTML 5. Vamos explicar, exemplificar e testar a funcionalidade para demonstrar sua utilização e seus benefícios.]]></description>
										<content:encoded><![CDATA[<p>Já pensou em utilizar SQL do lado do Cliente? Bom, agora isso é possível, com o HTML 5 podemos utilizar o Web SQL Database.</p>
<p>Ele traz uma API de banco de dados SQL Web, por enquanto ainda é uma especificação separada do HTML 5, mas já introduz um conjunto de APIs para manipular base de dados do lado do cliente utilizando SQL.</p>
<p>Estamos supondo que você já conheça e trabalhe com o SQL, mas caso não saiba o que é, recomendamos um <a href="https://www.youtube.com/watch?v=EjE57WqB7xg&amp;list=PLyH68Dr1pa5ym3xKGelKhDkjfe-MfBWCJ" target="_blank">mini curso de MySQL</a>.</p>
<p>Por enquanto, Web SQL Database está suportado nas últimas versões do Chorme, Safari e Opera.</p>
<p>Esta postagem é baseada no artigo em inglês:<a href="http://www.tutorialspoint.com/html5/html5_web_sql.htm" target="_blank"> Web SQL Database</a></p>
<p>&nbsp;</p>
<h2>Os métodos principais:</h2>
<p>Há três seguintes métodos fundamentais definidos na especificação de que vamos mostrar nesta postagem:</p>
<ol>
<li><b>openDataBase:</b> Este método cria o objeto de banco de dados, depois utiliza um banco de dados existente ou criar um novo.</li>
<li><b>transaction:</b> Este método controlar a transação e  nos retorna uma confirmação ou anulação com base no que foi executado.</li>
<li><b>executeSql:</b> Este método é usado para executar um consulta SQL.</li>
</ol>
<p>&nbsp;</p>
<h2>Abrindo Base de dados:</h2>
<p>O o<i>penDataBase</i> método cuida da abertura de um banco de dados se ele já existe, este método irá criá-lo se ele não existe.</p>
<p>Para criar e abrir um banco de dados, use o seguinte código:</p>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true">var db = openDatabase ('Teste', '1.0', 'Teste Web SQL Database', 2 * 1024 * 1024);
</pre>
<p>&nbsp;</p>
<p>Acima método tem quatro parâmetros:</p>
<ol>
<li>Nome do banco</li>
<li>Número da versão</li>
<li>Descrição de texto</li>
<li>Tamanho da base de dados</li>
</ol>
<p>&nbsp;</p>
<h2>Execução de consultas:</h2>
<p>Para executar uma consulta, deve ser utilizado a função database.transaction (). Esta função precisa de um único argumento, mas pode ser passado o 2º e 3º parametro para verificar se foi completado com sucesso o comando, segue exemplo de duas consultas, uma simples e outra debugando:</p>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true">var db = openDatabase ('Teste', '1.0', 'Teste Web SQL Database', 2 * 1024 * 1024);

// Simples
db.transaction (function (tx) {  
   tx.executeSql ("CREATE TABLE IF NOT EXISTS LOGS (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, log)");
});

// Debugando
db.transaction (function (tx) {  
   tx.executeSql ("CREATE TABLE IF NOT EXISTS LOGS (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, log)",
       function(tx){
           /*Sucesso*/
       },
       function(erro){
           /*Error*/
       });
});</pre>
<p>&nbsp;</p>
<p>As consultas acima irão criar uma tabela chamada LOGS na base de dados &#8220;Teste&#8217;.</p>
<p>&nbsp;</p>
<h2>Inserir dados:</h2>
<p>Para inserir dados  na tabela, utilizamos a função transaction() também, só que, desta vez com o INSERT para popular a tabela, veja o exemplo:</p>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true">var db = openDatabase ('Teste', '1.0', 'Teste Web SQL Database', 2 * 1024 * 1024);

db.transaction (function (tx) {
   tx.executeSql ("CREATE TABLE IF NOT EXISTS LOGS (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, log)");

   // Os 3 null represetam
   // 1º - Um array contendo dados
   // 2º - Função para sucesso
   // 3º - Função para Erro
   // Vamos explicá-los mais abaixo
   tx.executeSql ("INSERT INTO LOGS (log) VALUES ('Resultado do Log de Teste 01') ", null, null, null);
   tx.executeSql ("INSERT INTO LOGS (log) VALUES ('Resultado do Log de Teste 02') ", null, null, null);
});</pre>
<p>&nbsp;</p>
<p>Também podemos passar valores dinâmicos, utilizamos a seguinte sintaxe:</p>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true">var db = openDatabase ('Teste', '1.0', 'Teste Web SQL Database', 2 * 1024 * 1024);

db.transaction (function (tx) {

  var novo_log = 'Resultado do Log de Teste 01';

   // Os 3 null estão sendo mostrados aqui
   // 1º - Um array contendo dados, estamos passando apenas um valor com o novo_log
   // 2º - Função para sucesso
   // 3º - Função para Erro
   // Vamos explicá-los mais abaixo
  tx.executeSql ("CREATE TABLE IF NOT EXISTS LOGS (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, log)");
  tx.executeSql ("INSERT INTO REGISTROS (log) VALUES (?)",[novo_log],null,null);						
});</pre>
<p>&nbsp;</p>
<p>Aqui novo_log é uma variável e executeSql mapeia cada item no argumento de matriz para o &#8220;?&#8221;, isto é, poderíamos ter vários &#8220;?&#8221; e no final teríamos [var_1,var_2,var_3], sendo que, ele utilizará a ordem exata das variáveis para popular a query.</p>
<p>&nbsp;</p>
<h2>Lendo os dados:</h2>
<p>Para ler os registros já existentes usamos um callback para capturar os resultados da seguinte forma:</p>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true">var db = openDatabase ('Teste', '1.0', 'Teste Web SQL Database', 2 * 1024 * 1024);

db.transaction (function (tx) {
    tx.executeSql ("CREATE TABLE IF NOT EXISTS LOGS (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, log TEXT)",null,null);
    tx.executeSql ("INSERT INTO LOGS (log) VALUES (?)",['Resultado do Log de Teste 01'],null,null);
    tx.executeSql ("INSERT INTO LOGS (log) VALUES (?)",['Resultado do Log de Teste 02'],null,null);
});

db.transaction (function (tx) {
   tx.executeSql ('SELECT * FROM LOGS', [], function (tx, results) {
   var len = results.rows.length, i;
   msg = "&lt;p&gt; Registros encontrados:" + len + "&lt;/ p&gt;";
   for (i = 0; i &lt;len; i ++) {
      console.log(results.rows.item(i) .log);
   }
 }, null);
});</pre>
<p>&nbsp;</p>
<h2>Exemplo final:</h2>
<p>Então, finalmente, vamos  criar um exemplo em HTML 5,  este exemplo está funcional e testado no Chrome versão Versão 39.0.2171.71 m.</p>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true">var db = openDatabase ('Teste', '1.0', 'Teste Web SQL Database', 2 * 1024 * 1024);

db.transaction (function (tx) {
    tx.executeSql ("CREATE TABLE IF NOT EXISTS LOGS (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, log TEXT)",null,null);
    tx.executeSql ("INSERT INTO LOGS (log) VALUES (?)",['Resultado do Log de Teste 01'],null,null);
    tx.executeSql ("INSERT INTO LOGS (log) VALUES (?)",['Resultado do Log de Teste 02'],null,null);
   console.log('Log mensagem criada e linha inserida');
});

db.transaction(function(tx){
    tx.executeSql(       
        "SELECT * FROM LOGS",
        [],
        function(tx, result){
            console.log('Deu certo!');
            var len = result.rows.length, i;
            for(i=0;i&lt;len;i++){
                console.log( result.rows.item(i) );
            }
        },
        function(tx, error){
            console.log('Deu errado!');
            console.log(error);
        }
    );
});</pre>
<p>&nbsp;</p>
<p>Isso produziria o seguinte resultado:</p>
<pre class="top-margin:20 bottom-margin:20 left-set:true left-margin:20 right-set:true right-margin:20 whitespace-before:2 whitespace-after:2 lang:js decode:true">Log mensagem criada e linha inserida
Deu certo!
Object {id: 1, log: "Resultado do Log de Teste 01"}
Object {id: 2, log: "Resultado do Log de Teste 02"}
</pre>
<p>&nbsp;</p>
<h2>Conclusão:</h2>
<p>É bem simples utilizar e depende apenas de um pouco de treino, nos testes detectamos que a sua persistência é como uma sessão, ao fechar o browser perde-se o objeto, mas ao trocar de página dentro do mesmo domínio o mesmo permanece.</p>
<p>Já pensou em utilizar esta nova funcionalidade com o evento <a href="https://www.turbosite.com.br/blog/aviso-de-alteracoes-na-pagina-para-nao-perder-dados-javascript/" target="_blank">onBeforeUnload </a>para rastrear todo o caminho que um usuário caminhou dentro do seu site? A utilização ficará por conta da imaginação de vocês.</p>
<p>&nbsp;</p>
<p>Um exemplo que encontramos no GitHub e que vale a pena ver:<br />
<a href="https://gist.github.com/andyj/1599544" target="_blank">Link original do código aqui.</a></p>
<p>https://gist.github.com/andyj/1599544</p>
<p>Link de uma aplicação feita com Web Sql.<br />
<a href="https://github.com/abeauseigle/webSqlApp" target="_blank">HTML5 webSQL app synching with a php MySQL server</a></p>
<p>Se gostaram, compartilhem e façam comentários, sugestões, correções e correções sempre são bem vindas. A Turbosite tem o comprometimento em divulgar conhecimento!</p>
<hr />
<p>&nbsp;</p>
<p><strong>Quer servidores Seguros, Estáveis, com uptime de 99,9%, no Brasil e de baixo Custo? A <span style="color: #ff0000;">Turbosite</span> é sua resposta.</strong></p>
<p><strong><a href="https://www.turbosite.com.br/hospedagem-de-sites" target="_blank">Hospedagem de Sites</a>, <a href="https://www.turbosite.com.br/datacenter" target="_blank">Data Center</a> e <a href="https://www.turbosite.com.br/registro-dominio" target="_blank">Registro de Domínio Grátis</a> só aqui!</strong></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Aviso de alterações na página para não perder dados &#8211; Javascript</title>
		<link>https://www.turbosite.com.br/blog/aviso-de-alteracoes-na-pagina-para-nao-perder-dados-javascript/</link>
		
		<dc:creator><![CDATA[turboajuda]]></dc:creator>
		<pubDate>Tue, 02 Dec 2014 13:44:03 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[alertar usuario]]></category>
		<category><![CDATA[javascript]]></category>
		<guid isPermaLink="false">http://blog.turbosite.com.br/?p=3860</guid>

					<description><![CDATA[Nesta postagem, vamos mostrar como impedir que seu usuário feche o browser sem salvar os dados digitados. Emitir um alerta pode fazer com que horas de trabalho sejam poupadas.]]></description>
										<content:encoded><![CDATA[<p>Nesta postagem, vamos mostrar como impedir que seu usuário feche o browser sem salvar os dados digitados. Isto é muito comum em Webmail ou formulários/dados importantes que o usuário digitou e sem querer, muda de página ou a fecha, para evitar que perca as informações utilizaremos esta técnica para alertá-lo e assim, ele tomar a decisão necessária.</p>
<p>O evento que vamos utilizar é o &#8220;onBeforeUnload&#8221;.</p>
<p>Este evento é sempre invocado quando o usuário tenta sair da página atual, mas, ele por si só não resolve o problema, para resolvermos, precisamos dizer ao browser o que fazer quando isto acontecer.</p>
<p>&nbsp;</p>
<p>Um exemplo de código seria:</p>
<pre class="lang:php decode:true ">$('body').on('click', function(){
    window.onbeforeunload = function(){
        return 'Os dados do formulário não foram salvos, deseja permanecer nesta página?';
    };
});</pre>
<p>&nbsp;</p>
<p>Desta forma, quando o evento foi setado, ao mudar de página ou qualquer ação que faça ele fechar a página, será enviada uma mensagem ao browser, como o exemplo abaixo:</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-3861" src="https://www.turbosite.com.br/blog/wp-content/uploads/2014/12/javascript2.jpg" alt="javascript2" width="359" height="176" srcset="https://www.turbosite.com.br/blog/wp-content/uploads/2014/12/javascript2.jpg 359w, https://www.turbosite.com.br/blog/wp-content/uploads/2014/12/javascript2-300x147.jpg 300w" sizes="auto, (max-width: 359px) 100vw, 359px" /></p>
<p>Então, uma forma de fazer isto em um formulário seria, quando carregar a página salvar o estado do formulário para comparar, caso ele tome alguma ação que saia da página, sendo quê, temos que desconsiderar o &#8220;SUBMIT&#8221;, pois neste caso a ação é desejada.</p>
<p>Exemplo de código:</p>
<pre class="lang:php decode:true ">$( function(){

	var init_form = $('#id_form').serialize();
	// Result example: "name=&amp;email=&amp;message="

	// Cancel event onbeforeunload when Submit form
	$(':submit').click(function() {
		window.onbeforeunload = null;
	});
	
	window.onbeforeunload = function(){
		var check_form = $('#id_form').serialize();
		
		if( check_form === init_form )
		return null;
		
		return 'Os dados do formulário não foram salvos, deseja permanecer nesta página?';
	};
});</pre>
<p>&nbsp;</p>
<p><strong>Conclusão:</strong></p>
<p>Isto pode ser utilizado para diversas formas, avisar o preenchimento de um formulário não enviado, salvar o rascunho de um e-mail/mensagem, dar um desconto em um produto caso o usuário feche a tela de concluir a compra e outras milhares de formas que vocês imaginarem.</p>
<p>&nbsp;</p>
<p><strong>Dicas e sugestões:</strong><br />
Deixem nos comentários.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Entenda o que são Closures em JavaScript</title>
		<link>https://www.turbosite.com.br/blog/entenda-o-que-sao-closures-em-javascript/</link>
		
		<dc:creator><![CDATA[turboajuda]]></dc:creator>
		<pubDate>Mon, 10 Nov 2014 12:21:06 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Closure]]></category>
		<category><![CDATA[javascript]]></category>
		<guid isPermaLink="false">http://blog.turbosite.com.br/?p=3713</guid>

					<description><![CDATA[Entenda com facilidade o que são Closures em JavaScript. Muito usado em jQuery e Node.js, Closures permitem uma programação criativa e concisamente.]]></description>
										<content:encoded><![CDATA[<p>Encontramos uma publicação do blog <a title="Javascript Brasil" href="http://javascriptbrasil.com/2013/10/12/entenda-closures-no-javascript-com-facilidade/" rel="home">Javascript Brasil</a> que explica, com facilidade, o que são <strong>Closures</strong> em <strong>JavaScript</strong>. Closures permitem uma programação criativa e concisamente. Eles são usados frequentemente no JavaScript, sendo fáceis de se entender e atraentes para serem usados em seus projetos. É bastante comum encontrar closures em códigos <em>jQuery</em> e <em>Node.js</em>. Abaixo você pode conferir um clássico exemplo de closure em jQuery.</p>
<pre class="lang:js decode:true">$(function () {
    var selections = [];
    $(".niners").click(function () {
        selections.push(this.prop ("name"));
    });
});</pre>
<p>A equipe da <a href="https://www.turbosite.com.br/">Turbosite</a> repassamos esse conhecimento com a postagem abaixo.</p>
<p>&nbsp;</p>
<h2><strong>O que é um closure?</strong></h2>
<p>Um closure é uma função interior que tem acesso a variáveis de uma função exterior – cadeia de escopo. O closure tem três cadeias de escopo: o seu próprio escopo; escopo externo, tendo acesso as variáveis da função exterior; e tem acesso as variáveis globais.</p>
<p>A função interior tem acesso não somente as variáveis da função exterior, mas também aos parâmetros dela. Note que a função interior não pode chamar o objeto(<i>arguments)</i> da função exterior, entretanto, pode chamar parâmetros da função externa diretamente.</p>
<p>Você cria um closure adicionando uma função dentro de outra função.</p>
<div id="crayon-54609aabf262f135225674" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">
<div class="crayon-main">
<pre class="lang:js decode:true">function showName (firstName, lastName) {
    var nameIntro = "Your name is ";
 
    //esta função interior tem acesso as variáveis da função exterior, incluindo os parâmetros
    function makeFullName () {
        return nameIntro + firstName + " " + lastName;
    }
 
    return makeFullName ();
}
 
showName ("Michael", "Jackson"); //Your name is Michael Jackson</pre>
</div>
</div>
<div id="crayon-54609aabf2640726497822" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover"></div>
<h2><strong>Regra dos Closures e Efeitos Colaterais</strong></h2>
<h3><strong>1. Closures tem acesso a variável das funções exteriores mesmo após o retorno da função exterior</strong></h3>
<p>Uma da mais importante e delicada característica dos closures é que a função interior continua tendo acesso as variáveis da função exterior mesmo após ela ter retornado.  Quando funções no JavaScript executam, elas usam a mesma cadeia de escopo que estava em vigor quando foram criadas. Isso significa que mesmo depois da função exterior retornar, a função interior continua tendo acesso as variáveis da função exterior. Portanto, você pode chamar a função interior depois em seu programa. Este exemplo demonstra isso:</p>
<div id="crayon-54609aabf2647041099827" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">
<div class="crayon-main">
<pre class="lang:js decode:true ">function celebrityName (firstName) {
    var nameIntro = "This celebrity is ";
 
    //essa função interior tem acesso as variáveis da função exterior, incluindo os parâmetros
    function lastName (theLastName) {
        return nameIntro + firstName + " " + theLastName;
    }
    return lastName;
}
 
var mjName = celebrityName ("Michael");
//Nesta conjuntura, a função exterior celebrityName foi retornada
 
//O closure (lastName) é chamado aqui depois da função exterior ter retornado acima
//Sim, o closure continua tendo acesso as variáveis da função exterior e parâmetros
mjName ("Jackson"); //This celebrity is Michael Jackson</pre>
<p>&nbsp;</p>
</div>
</div>
<h3><strong>2. Closures armazenam referências para as variáveis da função exterior</strong></h3>
<p>Eles não armazenam o valor real. Closures ficam mais interessantes quando o valor da variável da função exterior muda antes que o closure seja chamado, e esta poderosa característica pode ser aproveitada de formas criativas, como este exemplo de variável privada primeiramente demonstrada por Douglas Crockford:</p>
<div id="crayon-54609aabf264d409673630" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">
<div class="crayon-plain-wrap">
<pre class="lang:js decode:true ">function celebrityID () {
    var celebrityID = 999;
    //Nós retornamos um objeto com algumas funções interiores
    //Todas as funções interiores têm acesso as variáveis'da função exterior
    return {
        getID: function () {
            //Esta função interior vai retornar a variável celebrityID ATUALIZADA
            return celebrityID;
        },
        setID: function (theNewId) {
            //Esta função interior vai mudar a variável da função exterior a qualquer hora
            celebrityID = theNewId;
        }
    }
}
 
var mjID = celebrityID (); //Nesta atual conjuntura, a função exterior celebrityID já retornou
mjID.getID(); //999
mjID.setID(567); //Muda a variável da função exterior
mjID.getID(); //567 - retorna o valor atualizado da variável celebrityID</pre>
<p>&nbsp;</p>
</div>
</div>
<p>&nbsp;</p>
<h3><strong>3. Closures que deram errado</strong></h3>
<p>Por causa dos closures terem acesso ao valor atualizado das variáveis das funções exteriores, eles podem também conduzir a erros quando a variável da função exterior muda com um loop for. Assim:</p>
<pre class="lang:js decode:true ">//Este exemplo é explicado em detalhe abaixo (logo após este bloco de código)
function celebrityIDCreator (theCelebrities) {
    var i;
    var uniqueID = 100;
    for (i = 0; i &amp;lt; theCelebrities.length; i += 1) {
        theCelebrities[i]["id"] = function () {
            return uniqueID + i;
        }
    }
 
    return theCelebrities;
}
 
var actionCelebs = [{name:"Stallone", id:0}, {name:"Cruise", id:0}, {name:"Willis", id:0}];
 
var createIdForActionCelebs = celebrityIDCreator(actionCelebs);
 
var stalloneID = createIdForActionCelebs[0];
 
console.log(stalloneID.id()); //103</pre>
<p>No exemplo anterior, quando a função anônima é chamada, o valor de i é 3 (a contagem do array e então seus incrementos). O número 3 foi adicionado ao uniqueID para criar 103 para TODOS os celebrityID. Então cada posição no array retornado obteve o id = 103, ao invés do valor pretendido 100, 101, 102.</p>
<p>A razão para isso acontecer foi porque, assim como nós discutimos no exemplo anterior, o closure (função anônima neste exemplo) teve acesso a variável da função exemplo por referência, não por valor. Então, igual ao exemplo anteriormente mostrado onde nós acessamos o valor atualizado da variável com o closure, neste exemplo, similarmente acessamos a variável i quando ela foi alterada, depois que a função exterior rodou o loop for inteiro e retornou o último valor, que foi 103.</p>
<p>Para consertar este efeito colateral (bug) nos closures, você pode usar uma <strong>Expressão de Função Imediatamente Invocada</strong> (IIFE – Immediately Invoked Function Expression), como no exemplo seguinte:</p>
<div id="crayon-54609aabf265a506956951" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">
<div class="crayon-toolbar" data-settings=" mouseover overlay hide delay">
<pre class="lang:js decode:true ">function celebrityIDCreator (theCelebrities) {
    var i;
    var uniqueID = 100;
    for (i = 0; i &amp;lt; theCelebrities.length; i += 1) {
        theCelebrities[i]["id"] = function (j) { //a variável paramétrica j é o i passado na invocação da IIFE
            return function () {
                return uniqueID + j;
                //cada iteração do loop for passa no valor atual de i dentro desta IIFE e salva o valor correto no array
            } () //Adicionando () no fim da função, nós estamos executando-a imediatamente e retornando somente o valor de uniqueID + j, ao invés de retornar uma função
        } (i); //invocando imediatamente a função passando a variável i como um parâmetro
    }
    return theCelebrities;
}
 
var actionCelebs = [{name: "Stallone", id:0}, {name: "Cruise", id:0}, {name: "Willis", id:0}];
 
var createIdForActionCelebs = celebrityIDCreator (actionCelebs);
 
var stalloneID = createIdForActionCelebs [0];
console.log(stalloneID.id); //100
 
var cruiseID = createIdForActionCelebs [1];
console.log(cruiseID.id); //101</pre>
<p>&nbsp;</p>
</div>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>JavaScript e Padrão de Módulo</title>
		<link>https://www.turbosite.com.br/blog/javascript-e-padrao-de-modulo/</link>
		
		<dc:creator><![CDATA[turboajuda]]></dc:creator>
		<pubDate>Fri, 07 Nov 2014 11:51:28 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[javascript avancado]]></category>
		<category><![CDATA[JavaScript Module Pattern]]></category>
		<category><![CDATA[JavaScript Padrão de Módulo]]></category>
		<guid isPermaLink="false">http://blog.turbosite.com.br/?p=3703</guid>

					<description><![CDATA[A equipe da Turbosite repassa seu conhecimento sobre JavaScript Module Pattern (Padrão de Módulo), abrangendo deste o estudo básico ao avançado desse padrão.]]></description>
										<content:encoded><![CDATA[<p>Continuando a postagem anterior <a title="JavaScript IIFE como contêiner de códigos" href="https://www.turbosite.com.br/blog/javascript-iife-como-conteiner-de-codigos/">JavaScript IIFE como contêiner de códigos</a>, compartilhamos aqui mais um artigo do blog <a href="http://desenvolvimentoparaweb.com/javascript/javascript-module-pattern-padrao-modulo/">Desenvolvimento Para Web</a>. A equipe da <a href="https://www.turbosite.com.br/">Turbosite</a> repassa seu conhecimento sobre <strong class="single__fake-title">JavaScript Module Pattern (Padrão de Módulo)</strong>, um padrão de desenvolvimento bastante comum para Javascript. As próximas linhas abaixo abrangem deste o estudo básico ao avançado desse padrão.</p>
<p>&nbsp;</p>
<h2>Anonymous Closures (Closures Anônimos)</h2>
<p><strong>Anonymous Closures</strong> são o construto fundamental em Module Pattern que tornam tudo isso possível e são uma das melhores característica de JavaScript: é possível criar uma função anônima e executá-la imediatamente. Todo o código que é executado dentro da função esta no escopo do closure (algo como “fechamento”), o que proporciona privacidade e estado durante toda a vida da aplicação.</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function () {
    // Todas variáveis e funções estão somente neste escopo
    // e ainda mantêm acesso a todos os globais
}());</pre>
</div>
<p>Observe a <code>()</code> em torno da função anônima. Isto é requerido pela linguagem, uma vez que declarações que começam com a função de token são sempre considerados declarações de função. Incluir <code>()</code> cria uma expressão de função.</p>
<p>&nbsp;</p>
<h2>Global Import</h2>
<p>JavaScript tem um recurso conhecido como <strong>implied globals</strong> (globals implícitas). Sempre que um nome é usado, o interpretador volta pela cadeia de escopo em busca de uma declaração de variável (<code>var</code>) para esse nome. Se nada for encontrado, a variável é assumida como global; se é usado em um assignmente, o global é criado se não existir. Isso significa que o uso ou a criação de variáveis ​​globais em um closure anônimo é fácil. Infelizmente, isso leva a código difícil de gerir, já que não é óbvio (para humanos) que as variáveis ​​são globais em um determinado arquivo.</p>
<p>Felizmente, o recurso de função anônima fornece uma alternativa fácil a isso. Ao passar globais como parâmetros para a função anônima, que os importa para o código. Eis um exemplo:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function ($, YAHOO) {
    // Agora se tem acesso às globais jQuery (como "$") e YAHOO nesse código
}(jQuery, YAHOO));</pre>
<p>&nbsp;</p>
</div>
<h2>Module Export</h2>
<p>Às vezes, você não quer apenas usar globais, mas quer declará-los. É possível fazer isso facilmente ao exportá-los, usando o valor de retorno da função anônima. Se o fizer, completará o Padrão de Módulo básico. Veja um exemplo completo:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">var MODULE = (function () {
    var my = {},
             privateVariable = 1;
 
    function privateMethod() {
        // ...
    }
 
    my.moduleProperty = 1;
    my.moduleMethod = function () {
        // ...
    };
 
    return my;
}());</pre>
</div>
<p>Observe que foi declarado um módulo global chamado <code>MODULE</code> com duas propriedades públicas: um método chamado <code>MODULE.moduleMethod</code> e uma variável chamada <code>MODULE.moduleProperty</code>. Além disso, ele mantém o estado interno privada usando o closure da função anônima — e também é possível importar globais necessários usando o padrão mostrado anteriormente.</p>
<p>&nbsp;</p>
<h2>Augmentation</h2>
<p>Uma limitação do Module Pattern até agora é que o módulo inteiro deve estar em um arquivo. Quem já trabalhou em uma grande base de código entende o valor de divisão de código em vários arquivos. Felizmente, existe uma boa solução: <strong>Augmentation</strong> (Ampliação). Em primeiro lugar, é preciso importar o módulo; então, são adicionadas novas propriedades e; por fim, ele é exportado.</p>
<p>Aqui está um exemplo de uso de Augmentation:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">var MODULE = (function (my) {
    my.anotherMethod = function () {
        // Método adicionado...
    };
    return my;
}(MODULE));</pre>
<p>É usada a palavra-chave <code>var</code> novamente para consistência, apesar de não ser estritamente necessário. Após este código ser executado, o módulo terá ganho um novo método público chamado <code>MODULE.anotherMethod</code>. Este arquivo “ampliado” também manterá seu próprio estado interno privado e importações.</p>
<p>&nbsp;</p>
</div>
<h2>Loose Augmentation</h2>
<p>Enquanto o exemplo acima requer a criação inicial do módulo em primeiro lugar e a ampliação acontecer depois disso, isso nem sempre é necessário. Uma das melhores coisas que um aplicativo JavaScript pode fazer em relação a desempenho é carregar scripts de forma assíncrona. É possível criar módulos flexíveis de várias partes que podem se carregar em qualquer ordem com o <strong>Loose Augmentation</strong> (Ampliação Fraca). Cada arquivo deve ter a seguinte estrutura:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">var MODULE = (function (my) {
    // Adiciona recursos...
    return my;
}(MODULE || {}));</pre>
</div>
<p>Neste padrão, a instrução <code>var</code> é sempre necessária. Note que a importação vai criar o módulo se ele ainda não existir. Isto significa que você pode usar uma ferramenta como <a href="http://labjs.com/">LABjs</a> e carregar todos os seus arquivos de módulo em paralelo, sem a necessidade de bloquear.</p>
<p>&nbsp;</p>
<h2>Tight Augmentation</h2>
<p><strong>Tight Augmentation</strong> (Ampliação Forte) é excelente, mas coloca algumas limitações no módulo, dentre as quais se destaca a impossibilidade de poder substituir as propriedades do módulo de maneira segura. Também não é possível usar as propriedades do módulo de outros arquivos durante a inicialização — embora seja possível em tempo de execução após a inicialização. Loose Augmentation implica numa ordem estabelecida de carregamento, mas permite substituições.</p>
<p>Eis um exemplo simples (ampliando o módulo-exemplo original):</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">var MODULE = (function (my) {
    var old_moduleMethod = my.moduleMethod;
 
    my.moduleMethod = function () {
        // sobrescrita de método com acesso ao antigo através de old_moduleMethod foi 
    };
 
    return my;
}(MODULE));</pre>
<p><code>MODULE.moduleMethod</code> foi substituído, mas manteve uma referência para o método original, caso fosse necessário.</p>
<p>&nbsp;</p>
</div>
<h2>Cloning and Inheritance (Clonagem e Herança)</h2>
<p>Dentre os Padrões de Module Pattern, talvez este seja a opção mais flexível. Ele permite que algumas composições elegantes, mas que vem à custa da flexibilidade: propriedades que são objetos ou funções não serão duplicadas e existirão como um objeto com duas referências. Mudando uma, mudará a outra. Isso pode ser corrigido para objetos com um processo de clonagem recursiva, mas, provavelmente, não pode ser fixado para funções — exceto, talvez, com <code>eval()</code>.</p>
<pre class="lang:js decode:true">var MODULE_TWO = (function (old) {
    var my = {},
           key;
&amp;nbsp;
    for (key in old) {
        if (old.hasOwnProperty(key)) {
            my[key] = old[key];
        }
    }
&amp;nbsp;
    var super_moduleMethod = old.moduleMethod;
    my.moduleMethod = function () {
        // sobrescreve método ao clonar, acesso ao super através de super_moduleMethod
    };
&amp;nbsp;
    return my;
}(MODULE));</pre>
<p>&nbsp;</p>
<h2>Cross-File Private State (Estado Privado Entre-Arquivos)</h2>
<p>Uma limitação grave de dividir um módulo em vários arquivos é que cada arquivo mantém seu próprio estado privado e não tem acesso ao estado privado dos outros arquivos. Mas isso pode ser corrigido. Aqui está um exemplo de um módulo com Ampliação Fraca que vai manter o estado privado em todos as ampliações:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">var MODULE = (function (my) {
    var _private = my._private = my._private || {},
        _seal = my._seal = my._seal || function () {
            delete my._private;
            delete my._seal;
            delete my._unseal;
        },
        _unseal = my._unseal = my._unseal || function () {
            my._private = _private;
            my._seal = _seal;
            my._unseal = _unseal;
        };
 
        // Acesso permanente a _private, _seal e _unseal
 
        return my;
}(MODULE || {}));</pre>
</div>
<p>Qualquer arquivo pode definir propriedades em sua variável local <code>_private</code> e esta será imediatamente disponível para os outros. Uma vez que este módulo foi completamente carregado, o aplicativo deve chamar <code>MODULE._seal()</code>, que irá impedir o acesso externo ao interno <code>_private</code>.</p>
<p>Se este módulo fosse ampliado novamente, mais à frente na vida aplicativo um dos métodos internos, em qualquer arquivo, pode chamar <code>_unseal()</code> antes de carregar o novo arquivo e <code>_seal()</code> novamente depois de ter sido executado.</p>
<p>&nbsp;</p>
<h2>Submódulo</h2>
<p>O padrão de Module Pattern <strong>Submódulo</strong> (Sub-module) é considerado pela maioria como o mais simples. Há muitos bons casos para a criação de submódulos. É como criar módulos regulares:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true ">MODULE.sub = (function () {
    var my = {};
    // ...
    return my;
}());</pre>
</div>
<p>Embora isso possa parecer bastante óbvio, vale a pena ser mencionado em um artigo desse tipo, haja vista que submódulos têm todas as capacidades avançadas de módulos normais, incluindo ampliação e estado privado.</p>
<p>&nbsp;</p>
<h2>Conclusão</h2>
<p>A maioria dos Padrões Avançados de Module Pattern podem ser combinados uns com os outros para criar padrões mais úteis. Não raramente é possível encontrar, em aplicações mais complexas, a combinação de Ampliação Fraca, Estado Privado e Submódulos.</p>
<p>No decorrer do artigo, não se mencionou a respeito de performance, mas uma nota rápida sobre isso seria: Module Pattern é bom para performance! Ele passa por minificação muito bem, o que faz com que o download seja mais rápido. Usar Loose Augmentation permite downloads paralelos, fáceis e sem bloqueios. O tempo de inicialização é, provavelmente, um pouco mais lento do que outros métodos, mas o custo-benefício vale a pena. Desempenho em tempo de execução não deve sofrer penalidades desde que globais sejam importados corretamente e, provavelmente, há aumento de velocidade em submódulos, encurtando a cadeia de referência com variáveis ​​locais.</p>
<p>Para fechar sobre Module Patterns, aqui está um exemplo de um submódulo que se carrega dinamicamente a seu parent (criando-se se ele não existe) — o estado privado foi deixado de fora para que o exemplo fique mais conciso, mas incluir isso seria simples.</p>
<div class="wp_syntax">
<pre class="lang:js decode:true ">var UTIL = (function (parent, $) {
    var my = parent.ajax = parent.ajax || {};
 
    my.get = function (url, params, callback) {
        // Um pouquinho de trapaça... xD
        return $.getJSON(url, params, callback);
    };
 
    // etc
 
    return parent;
}(UTIL || {}, jQuery));</pre>
<p>Este padrão de código permite que toda uma base de códigos complexa hierárquica seja completamente carregada em paralelo, com sub-módulos e tudo o mais.</p>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>JavaScript IIFE como contêiner de códigos</title>
		<link>https://www.turbosite.com.br/blog/javascript-iife-como-conteiner-de-codigos/</link>
		
		<dc:creator><![CDATA[turboajuda]]></dc:creator>
		<pubDate>Thu, 06 Nov 2014 13:21:07 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Destaque]]></category>
		<category><![CDATA[IIFE]]></category>
		<category><![CDATA[javascript]]></category>
		<guid isPermaLink="false">http://blog.turbosite.com.br/?p=3697</guid>

					<description><![CDATA[Nessa postagem, repassamos nosso conhecimento sobre JavaScript IIFE. Descubra o que é e por que é uma boa prática usá-la sempre que puder.]]></description>
										<content:encoded><![CDATA[<p>Encontramos uma postagem interessante sobre Javascript IIFE no blog <a href="http://desenvolvimentoparaweb.com/javascript/javascript-iife-conteiner-de-codigos/">Desenvolvimento Para Web</a>, que explica em muitos detalhes a sintaxe e as funcionalidades do IIFE. A equipe da <a href="https://www.turbosite.com.br/">Turbosite</a> repassa esse conhecimento para os leitores do nosso blog, com a postagem a seguir.</p>
<p>&nbsp;</p>
<p><strong>JavaScript puro</strong> ou <em>Vanilla JavaScript</em> (felizmente) está voltando. E com força. Mas, quando você decide continuar nos estudos e começa a inspecionar códigos alheios, inevitavelmente você se depara com algo como:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function (window, document, undefined) {
    //
})(window, document);</pre>
<p>E você encontra isso em diversos códigos; e vê outros desenvolvedores indicando; e colegas dizendo que esta é uma boa prática. Mas você sabe o que, realmente, isso significa? Continue lendo.</p>
<p>&nbsp;</p>
</div>
<p>Frequentemente desenvolvedores descobrindo (ou redescobrindo) o JavaScript puro se perguntam sobre <strong>IIFE</strong> (Expressão de Função Imediatamente Invocada ou <em>Immediately-Invoked Function Expression</em>), frequentemente apresentado da seguinte maneira:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function (window, document, undefined) {
    //
})(window, document);</pre>
<p>Na verdade, várias coisas estão acontecendo aí. Analisemos cada uma delas.</p>
<p>&nbsp;</p>
</div>
<h2>Escopo privado em IIFE</h2>
<p>JavaScript tem maneiras interessantes de trabalhar com escopo de função; então, primeiramente essa expressão cria um “âmbito privado” (private scope). Por exemplo:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function (window, document, undefined) {
    var name = 'Foo';
})(window, document);
console.log(name); // "name" não definido, está em um escopo diferente</pre>
<p>&nbsp;</p>
</div>
<h2>Como funciona IIFE</h2>
<p>Uma função normal se parece com isso:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">var logMyName = function (name) {
    console.log(name);
};
logMyName('Foo');</pre>
</div>
<p>Ela é chamada (<em>invoke</em>) quando necessário, por escolha do programador, em qualquer ponto do código em que se queira e/ou seja possível.</p>
<p>A razão pela qual essa <strong>IIFE em JavaScript</strong> foi criada, foi para ser uma expressão de função imediatamente invocada, o que significa que elas são imediatamente chamadas em tempo de execução – também, não é possível chamá-la novamente, já que elas só rodam uma vez, mais ou menos assim:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">var logMyName = (function (name) {
    console.log(name); // Todd
})('Todd');</pre>
<p>O pulo-do-gato aqui é isso (que já foi atribuído a uma variável no exemplo anterior):</p>
</div>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function () {
})();</pre>
</div>
<p>O par de parênteses extra é necessário. Isso não funciona:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">function () {
}();</pre>
<p>Embora existam vários truques que podem ser feitos para “enganar” o JavaScript e fazê-lo funcionar. Este, por exemplo, força o parser de JavaScript a tratar o código que segue <code>!</code> como uma expressão:</p>
</div>
<div class="wp_syntax">
<pre class="lang:js decode:true">!function () {
}();</pre>
<p>E existem variantes:</p>
</div>
<div class="wp_syntax">
<pre class="lang:js decode:true">+function () {
}();
 
-function () {
}();
 
~function () {
}();</pre>
</div>
<p>Mas não é preciso se forçar a decorar isso para usar a todo momento para fazer uma IIFE.</p>
<p>&nbsp;</p>
<h2>Argumentos da IIFE</h2>
<p>Agora que foi explicado como isso funciona, passemos para os argumento da IIFE:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function (window) {
})(window);</pre>
<p>Como isso funciona? Lembre-se, <code>(window);</code> é onde a função é chamada, e onde é passado o Objeto <code>window</code>. Então ele é passado para a função – que também foi chamada de <code>window</code>.</p>
</div>
<p>Então, o que mais é possível fazer? Passar tudo o que for necessário! Por exemplo, passar o Objeto <code>document</code>:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function (window, document) {
    // é possível usar "window" e "document" normalmente
})(window, document);</pre>
</div>
<p>A resolução de variáveis ​​locais é mais rápida que a de variáveis ​​globais, mas esta está numa escala enorme e dificilmente alguém vai perceber o aumento da velocidade – mas vale a pena considerar se há muitas referências a globais!</p>
<p>&nbsp;</p>
<h2>E sobre o <code>undefined</code>?</h2>
<p>Em ECMAScript 3, <code>undefined</code> é mutável. Isso significa que o valor poderia ser transferido com, por exemplo, <code>undefined = true;</code>…! Felizmente, no ECMAScript 5 em modo estrito (<code>'use strict';</code>) o parser lança um erro quando se depara com isso. Antes disso, começou-se a proteger uma IIFE da maneira já vista:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function (window, document) {
    // é possível usar "window" e "document" normalmente
})(window, document);</pre>
<pre class="lang:js decode:true">(function (window, document, undefined) {
})(window, document);</pre>
<p>O que significa que se alguém fizesse isso estaria tudo bem:</p>
</div>
<div class="wp_syntax">
<pre class="lang:js decode:true">undefined = true;
(function (window, document, undefined) {
    // "undefined" é uma variável local undefined
})(window, document);</pre>
<p>&nbsp;</p>
</div>
<h2>Minificando</h2>
<p>Ao minificar as variáveis ​​locais é que a grandiosidade do padrão IIFE realmente pode ser vista. Nomes de variáveis ​​locais não são realmente necessários se estas foram passadas dessa maneira​​, então, é possível dar o nome que quiser para elas.</p>
<p>Por exemplo, mudar disso:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function (window, document, undefined) {
    console.log(window); // Object window
})(window, document);</pre>
</div>
<p>Pra isso:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function (a, b, c) {
    console.log(a); // Object window
})(window, document);</pre>
</div>
<p>Imagine todas as referências a bibliotecas e <code>window</code> e <code>document</code> minificadas. Claro que você não precisa parar por aí; é possível passar jQuery, também, ou qualquer outra coisa que esteja disponível dentro no escopo léxico:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function ($, window, document, undefined) {
    // use $ para se referir à jQuery
    // $(document).addClass('test');
})(jQuery, window, document);
 
(function (a, b, c, d) {
    // Se torna
    // a(c).addClass('test');
})(jQuery, window, document);</pre>
</div>
<p>Isso também significa que você não precisa chamar <code>jQuery.noConflict();</code> ou qualquer coisa como <code>$</code> é atribuído localmente ao módulo. Aprender como escopos e variáveis ​​globais/locais funcionam ajuda ainda mais.</p>
<p>Passar o código por um bom minificador certamente garantirá a renomeação de <code>undefined</code> para <code>c</code> (por exemplo, e apenas se for usado). É importante atentar para o fato de que o nome <code>undefined</code> é irrelevante; só é preciso saber que o Objeto referenciado é indefinido (undefined) e, como <code>undefined</code> não tem qualquer significado especial – <code>undefined</code> é o valor que o JavaScript dá às coisas que são declaradas mas não têm nenhum valor (nem em IIFE).</p>
<p>&nbsp;</p>
<h2>Ambientes globais não-navegador</h2>
<p>Devido a algumas tecnologias, Node.js, o navegador não é sempre o Objeto global, o que pode ser realmente problemático se você está tentando criar uma IIFE para funcionar em múltiplos ambientes. Por esta razão, há determinadas “alternativas”, como isso:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true ">(function (root) {
})(this);</pre>
</div>
<p>Em um navegador, o ambiente global <code>this</code> se refere ao Objeto <code>window</code>, de modo que não é preciso passar em <code>window</code>, é sempre possível reduzir para <code>this</code>.</p>
<p>Alguns preferem o nome <code>root</code>, já que ele pode se referir tanto a ambientes não-navegador, quanto à raiz do browser.</p>
<p>Se você estiver interessado em uma solução universal (muito útil para ser usada para a criação de módulos em projetos de código aberto) é o <strong>UMD</strong> (<em>Universal Module Definition</em>):</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function (root, factory) {
    if (typeof define === 'function' &amp;&amp; define.amd) {
        define(factory);
    } else if (typeof exports === 'object') {
        module.exports = factory;
    } else {
        root.MYMODULE = factory();
    }
})(this, function () {
    // 
});</pre>
</div>
<p>A função está sendo invocado com outra função sendo passada para ela. É possível, então, atribuí-la ao ambiente relevante “de dentro”. No navegador, <code>root.MYMODULE = factory();</code> é o módulo IIFE; em qualquer outro ambiente (como Node.js), será usado <code>module.exports</code> ou requireJS se <code>define === 'function' &amp;&amp; define.amd</code> resolver como <code>true</code>.</p>
<p>&nbsp;</p>
<h2>Conclusão</h2>
<p>Como foi visto, usar <strong>IIFE</strong> (Expressão de Função Imediatamente Invocada ou <em>Immediately-Invoked Function Expression</em>) é extramente benéfico. Além de ajudar na performance, por permitir que não seja preciso lookups no código a procura de variáveis globais, permite que seu código possa ficar “isolado”, protegendo o escopo de uma porção de código ou módulo do ambiente em que foi colocado.</p>
<p>O fato de diversos frameworks e bibliotecas JavaScript de renome como jQuery, Backbone.js, Modernizr e outros usarem IIFE já é bastante significativo. Use código de qualidade para fazer código de qualidade. </p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
