SlideShare une entreprise Scribd logo
1  sur  92
Télécharger pour lire hors ligne
Desenvolvimento
de jogos com
Javascript e HTML5
por
Willian Molinari
a.k.a. PotHix
Slides em: goo.gl/wfaZ3n
Delivery
Engineering
?
≠
?
Linguagens
¯_(“.)_/¯
Histórico
by @pothix e @crocidb
Robotz Warehouse
https://github.com/PotHix/RobotzWarehouse
Quase lá! ;)
WarOS
https://github.com/pothix/waros
@pothix, @rmasoni, @_bojak, @crocidb
Reconquesthttps://pothix.github.io/RECONQUEST
https://github.com/pothix/reconquest
Jogando e Aprendendo
http://jogandoeaprendendo.com.br
https://github.com/pothix/jogando_e_aprendendo
Skeleton Jigsaw
http://plaev.github.io/skel
https://github.com/plaev/skeleton-jigsaw
@pothix e @rmasoni
Desenv. de Jogos
casuais com HTML5
http://goo.gl/t5zLEJ
Jogos no browser
Porque Javascript?
Vantagens
■ Distribuição bem mais fácil
■ Ambiente de desenvolvimento simples
■ Possibilidade de rodar em vários devices
Desvantagens
■ Limitações e suporte de cada device
■ Testes em vários navegadores
■ Debug ainda é difícil
HTML5*
Canvas
WebGL
WebSockets
Offline cache
Audio
gamepad api
localStorage
Canvas
ctx.beginPath();
// Circulo maior
ctx.arc(75,75,50,0,Math.PI*2,true);
ctx.moveTo(110,75);
// Boca
ctx.arc(75,75,35,0,Math.PI,false);
ctx.moveTo(65,65);
// Olho direito
ctx.arc(60,65,5,0,Math.PI*2,true);
ctx.moveTo(95,65);
// Olho esquerdo
ctx.arc(90,65,5,0,Math.PI*2,true);
ctx.stroke();
canvas.drawImage()
drawImage(
img, // image
0, // onde no x começar cortar
0, // onde no y começar cortar
0, // tamanho para corte do x
0, // tamanho para corte do y
0, // onde no x colocar no canvas
0, // onde no y colocar no canvas
14, // largura
20, // altura
)
drawImage(
img, // image
0, // onde no x começar cortar
0, // onde no y começar cortar
0, // tamanho para corte do x
0, // tamanho para corte do y
0, // onde no x colocar no canvas
0, // onde no y colocar no canvas
14, // largura
20, // altura
)
0,0
0,20
drawImage(img, 0, 20, 15, 20, 0, 0, 15, 20)
drawImage(img, 15, 20, 15, 20, 0, 0, 15, 20)
drawImage(img, 30, 20, 15, 20, 0, 0, 15, 20)
Áudio
// pegando o elemento audio
var audio = document.getElementById('audiotagid')
// tocar
audio.play()
// pausar
audio.pause()
// aumentar / diminuir o volume
audio.volume+=0.1
audio.volume-=0.1
// vários outros
...
Áudio
Latencia
Mobile
Web Audio API
Tempos exatos
Fonte: html5 rocks
Fonte: caniuse.com
WebGL
Quake
iOS Rage
http://blog.tojicode.com/
http://middle-earth.thehobbit.com/
The hobbit Experiment
Emscripten
Banana Bread
https://developer.mozilla.org/en/demos/detail/bananabread
Websockets
// criando a conexão
var url = “ws://pothix.com/websocket”
var connection = new WebSocket(url);
// funções para executar assim que acontecer
// o dado estado
connection.onopen = function () {
};
connection.onerror = function (error) {
};
connection.onmessage = function (e) {
};
connection.onclose = function (e) {
};
Websockets
Swarmation
http://swarmation.com
Offline Cache
CACHE MANIFEST
# revision 1
NETWORK:
http://www.google-analytics.com
FALLBACK:
resources/audio resources/audio/silence.mp3
CACHE:
src/maingame_packaged.js
resources/audio/silence.mp3
resources/sprites.png
cache.manifest
localStorage
// Criando um novo item no localStorage
localStorage.setItem("myGame","The amazing HTML5
programmer")
// Retornando um item do localStorage
localStorage.getItem("myGame")
# => "The amazing HTML5 programmer"
// Criando com outra Syntax
localStorage["myGame.stage"] = 1
// Retornando. Tudo é armazenado como string.
localStorage["myGame.stage"]
# => "1"
localStorage
Gamepad API
Vários controles
http://www.html5rocks.com/en/tutorials/doodles/gamepad
https://hacks.mozilla.org/2013/12/the-gamepad-api/
id: "PLAYSTATION(R)3 Controller (STANDARD GAMEPAD Vend …) "
index: 1
timestamp: 18395424738498
buttons: Array[8]
0: 0
1: 0,
…
6: 0.03291,
7: 0
axes: Array[4]
0: -0.01176
1: 0.01961
2: -0.00392
3: -0.01176
Gamepad API
Engines
Várias!
https://github.com/bebraw/jswiki/wiki/Game-Engines
https://github.com/bebraw/jswiki/wiki/Game-engine-feature-matrix
Destaques
■ MelonJS (melonjs.org)
■ LimeJS (limejs.com)
■ Akihabara (github.com/akihabara)
■ PandaJS (pandajs.net) new!
■ Crafty (craftyjs.com)
■ Impact (impactjs.com)
Engines
Akihabara
Akihabara
ImpactJS
Desenho e fases
Map editor
http://impactjs.com/documentation/weltmeister
Entity system
1 ig.module('game.entities.hud')
2 .requires('impact.entity')
3 .defines(function () {
4 EntityHud = ig.Entity.extend({
5 _wmIgnore: true,
6 animSheet: new ig.AnimationSheet('media/hud.png', 10, 10),
7 gravityFactor: 0,
8 zIndex: 2,
9 name: "hud",
10 piece_collected: false,
11
12 init: function (x, y, settings) {
13 this.parent(x, y, settings);
14 this.addAnim('empty', 1, [0]);
15 this.addAnim('full', 1, [1]);
16 },
17
18 update: function () {
19 if( this.piece_collected ){ this.currentAnim = this.anims.full; }
20 this.parent();
21 }
22 });
23 });
Áudio
Audio inicial em multiplos formatos
Otimização!
Vai fazer parte da sua vida
Audio otimizado
Antes 2.5MB
Depois 1.0MB
Compressão
*aproximado
Mobile
Mobile Safari
http://youtu.be/aPYeNaR5ps0
Android Browser
Vários problemas
Muitos devices
com muitos browsers
Fallbacks
Um mal necessário
Estatísticas
Baseadas no Skeleton Jigsaw
1260 linhas de código Javascript no total (segundo sloc)
4.0K analytics.js
1.2M game.min.js
4.0K index.html
2.6M media
Tamanho total
Tempo investido
demo de 4 fases com intro, final e créditos
26 * 4 = 104 horas
Duas semanas de trabalho full time
Quase 1 ano
desde o início
Conclusão
É difícil mas vale a pena! :)
Perguntas?
http://goo.gl/wfaZ3n
Willian Molinari
@PotHix
pothix@pothix.com
http://pothix.com

Contenu connexe

Tendances

Como Perder Peso (no browser)
Como Perder Peso (no browser)Como Perder Peso (no browser)
Como Perder Peso (no browser)Zeno Rocha
 
Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!Creditas
 
Criando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerCriando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerGiovanni Kenji Shiroma
 
Redis um banco chave valor
Redis um banco chave valorRedis um banco chave valor
Redis um banco chave valorKinn Julião
 
Design Responsivo com Sass
Design Responsivo com SassDesign Responsivo com Sass
Design Responsivo com SassVitor Garcia
 
Minicurso Play Framework - Tão fácil que nem parece Java
Minicurso Play Framework - Tão fácil que nem parece JavaMinicurso Play Framework - Tão fácil que nem parece Java
Minicurso Play Framework - Tão fácil que nem parece JavaWandesson Soares
 
PHP básico para iniciantes
PHP básico para iniciantesPHP básico para iniciantes
PHP básico para iniciantesEduardo Mendes
 
Palestra ganeti puppet
Palestra ganeti puppetPalestra ganeti puppet
Palestra ganeti puppetDaniel Sobral
 

Tendances (11)

Como Perder Peso (no browser)
Como Perder Peso (no browser)Como Perder Peso (no browser)
Como Perder Peso (no browser)
 
Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
 
Criando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerCriando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & Docker
 
Bsides4cooler
Bsides4coolerBsides4cooler
Bsides4cooler
 
Redis na Prática
Redis na PráticaRedis na Prática
Redis na Prática
 
Redis um banco chave valor
Redis um banco chave valorRedis um banco chave valor
Redis um banco chave valor
 
Mean Stack
Mean StackMean Stack
Mean Stack
 
Design Responsivo com Sass
Design Responsivo com SassDesign Responsivo com Sass
Design Responsivo com Sass
 
Minicurso Play Framework - Tão fácil que nem parece Java
Minicurso Play Framework - Tão fácil que nem parece JavaMinicurso Play Framework - Tão fácil que nem parece Java
Minicurso Play Framework - Tão fácil que nem parece Java
 
PHP básico para iniciantes
PHP básico para iniciantesPHP básico para iniciantes
PHP básico para iniciantes
 
Palestra ganeti puppet
Palestra ganeti puppetPalestra ganeti puppet
Palestra ganeti puppet
 

Similaire à Desenvolvimento de jogos com HTML5 e javascript

DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsSuissa
 
FLISOL SJC - Desenvolvimento de jogos com javascrit e HTML5
FLISOL SJC - Desenvolvimento de jogos com javascrit e HTML5FLISOL SJC - Desenvolvimento de jogos com javascrit e HTML5
FLISOL SJC - Desenvolvimento de jogos com javascrit e HTML5Willian Molinari
 
Mobileconf dicas-android
Mobileconf dicas-androidMobileconf dicas-android
Mobileconf dicas-androidAlberto Souza
 
Rio Info 2010 - Oficina - Oficina Papel Devigner Novidades HTML5 - Ricardo Pa...
Rio Info 2010 - Oficina - Oficina Papel Devigner Novidades HTML5 - Ricardo Pa...Rio Info 2010 - Oficina - Oficina Papel Devigner Novidades HTML5 - Ricardo Pa...
Rio Info 2010 - Oficina - Oficina Papel Devigner Novidades HTML5 - Ricardo Pa...Rio Info
 
Html5 storage api
Html5 storage apiHtml5 storage api
Html5 storage apiSuissa
 
DOMinando JavaScript
DOMinando JavaScriptDOMinando JavaScript
DOMinando JavaScriptThiago Poiani
 
Os desafios de desenvolver o demo do skeleton jigsaw com html5
Os desafios de desenvolver o demo do skeleton jigsaw com html5Os desafios de desenvolver o demo do skeleton jigsaw com html5
Os desafios de desenvolver o demo do skeleton jigsaw com html5tdc-globalcode
 
Rodando PHP em um container Java
Rodando PHP em um container JavaRodando PHP em um container Java
Rodando PHP em um container Javanetinhoteixeira
 
PyData - Consumindo e publicando web APIs com Python
PyData - Consumindo e publicando web APIs com PythonPyData - Consumindo e publicando web APIs com Python
PyData - Consumindo e publicando web APIs com PythonBruno Rocha
 
Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Felipe Mamud
 
Golang para desenvolvedores pragmáticos parte 2
Golang para desenvolvedores pragmáticos  parte 2Golang para desenvolvedores pragmáticos  parte 2
Golang para desenvolvedores pragmáticos parte 2Wilson Júnior
 
Android chat app com Node.js
Android chat app com Node.jsAndroid chat app com Node.js
Android chat app com Node.jsLuiz Duarte
 
Arquitetura JavaScript Escalável da Netflix
Arquitetura JavaScript Escalável da NetflixArquitetura JavaScript Escalável da Netflix
Arquitetura JavaScript Escalável da NetflixBruno Tavares
 

Similaire à Desenvolvimento de jogos com HTML5 e javascript (20)

Minicurso groovy grails
Minicurso groovy grailsMinicurso groovy grails
Minicurso groovy grails
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webapps
 
FLISOL SJC - Desenvolvimento de jogos com javascrit e HTML5
FLISOL SJC - Desenvolvimento de jogos com javascrit e HTML5FLISOL SJC - Desenvolvimento de jogos com javascrit e HTML5
FLISOL SJC - Desenvolvimento de jogos com javascrit e HTML5
 
Fabric
FabricFabric
Fabric
 
Mobileconf dicas-android
Mobileconf dicas-androidMobileconf dicas-android
Mobileconf dicas-android
 
iOS libraries
iOS librariesiOS libraries
iOS libraries
 
Rio Info 2010 - Oficina - Oficina Papel Devigner Novidades HTML5 - Ricardo Pa...
Rio Info 2010 - Oficina - Oficina Papel Devigner Novidades HTML5 - Ricardo Pa...Rio Info 2010 - Oficina - Oficina Papel Devigner Novidades HTML5 - Ricardo Pa...
Rio Info 2010 - Oficina - Oficina Papel Devigner Novidades HTML5 - Ricardo Pa...
 
Html5
Html5Html5
Html5
 
Html5 storage api
Html5 storage apiHtml5 storage api
Html5 storage api
 
DOMinando JavaScript
DOMinando JavaScriptDOMinando JavaScript
DOMinando JavaScript
 
Os desafios de desenvolver o demo do skeleton jigsaw com html5
Os desafios de desenvolver o demo do skeleton jigsaw com html5Os desafios de desenvolver o demo do skeleton jigsaw com html5
Os desafios de desenvolver o demo do skeleton jigsaw com html5
 
Plack
PlackPlack
Plack
 
Realtime com node.js e socket.io
Realtime com node.js e socket.ioRealtime com node.js e socket.io
Realtime com node.js e socket.io
 
Rodando PHP em um container Java
Rodando PHP em um container JavaRodando PHP em um container Java
Rodando PHP em um container Java
 
PyData - Consumindo e publicando web APIs com Python
PyData - Consumindo e publicando web APIs com PythonPyData - Consumindo e publicando web APIs com Python
PyData - Consumindo e publicando web APIs com Python
 
Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?
 
Modern PHP
Modern PHPModern PHP
Modern PHP
 
Golang para desenvolvedores pragmáticos parte 2
Golang para desenvolvedores pragmáticos  parte 2Golang para desenvolvedores pragmáticos  parte 2
Golang para desenvolvedores pragmáticos parte 2
 
Android chat app com Node.js
Android chat app com Node.jsAndroid chat app com Node.js
Android chat app com Node.js
 
Arquitetura JavaScript Escalável da Netflix
Arquitetura JavaScript Escalável da NetflixArquitetura JavaScript Escalável da Netflix
Arquitetura JavaScript Escalável da Netflix
 

Plus de Willian Molinari

As escolhas do desenvolvedor
As escolhas do desenvolvedorAs escolhas do desenvolvedor
As escolhas do desenvolvedorWillian Molinari
 
Javascript and browser games
Javascript and browser gamesJavascript and browser games
Javascript and browser gamesWillian Molinari
 
How we used ruby to build locaweb's cloud (http://presentations.pothix.com/ru...
How we used ruby to build locaweb's cloud (http://presentations.pothix.com/ru...How we used ruby to build locaweb's cloud (http://presentations.pothix.com/ru...
How we used ruby to build locaweb's cloud (http://presentations.pothix.com/ru...Willian Molinari
 
Html5, gamedev e o skeleton jigsaw
Html5, gamedev e o skeleton jigsawHtml5, gamedev e o skeleton jigsaw
Html5, gamedev e o skeleton jigsawWillian Molinari
 
Implementações paralelas
Implementações paralelasImplementações paralelas
Implementações paralelasWillian Molinari
 
Abertura do ruby_rails_no_mundo_real_guru_sp
Abertura do ruby_rails_no_mundo_real_guru_spAbertura do ruby_rails_no_mundo_real_guru_sp
Abertura do ruby_rails_no_mundo_real_guru_spWillian Molinari
 
What is and how does work RubyLearning.org
What is and how does work RubyLearning.orgWhat is and how does work RubyLearning.org
What is and how does work RubyLearning.orgWillian Molinari
 

Plus de Willian Molinari (14)

Desconstruindo a web
Desconstruindo a webDesconstruindo a web
Desconstruindo a web
 
Mesos
MesosMesos
Mesos
 
As escolhas do desenvolvedor
As escolhas do desenvolvedorAs escolhas do desenvolvedor
As escolhas do desenvolvedor
 
Javascript and browser games
Javascript and browser gamesJavascript and browser games
Javascript and browser games
 
How we used ruby to build locaweb's cloud (http://presentations.pothix.com/ru...
How we used ruby to build locaweb's cloud (http://presentations.pothix.com/ru...How we used ruby to build locaweb's cloud (http://presentations.pothix.com/ru...
How we used ruby to build locaweb's cloud (http://presentations.pothix.com/ru...
 
Html5, gamedev e o skeleton jigsaw
Html5, gamedev e o skeleton jigsawHtml5, gamedev e o skeleton jigsaw
Html5, gamedev e o skeleton jigsaw
 
Ruby e xmpp
Ruby e xmppRuby e xmpp
Ruby e xmpp
 
Game network programming
Game network programmingGame network programming
Game network programming
 
Locasberos
LocasberosLocasberos
Locasberos
 
Simplestack
SimplestackSimplestack
Simplestack
 
Implementações paralelas
Implementações paralelasImplementações paralelas
Implementações paralelas
 
Abertura do ruby_rails_no_mundo_real_guru_sp
Abertura do ruby_rails_no_mundo_real_guru_spAbertura do ruby_rails_no_mundo_real_guru_sp
Abertura do ruby_rails_no_mundo_real_guru_sp
 
Vim
VimVim
Vim
 
What is and how does work RubyLearning.org
What is and how does work RubyLearning.orgWhat is and how does work RubyLearning.org
What is and how does work RubyLearning.org
 

Dernier

Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuisKitota
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfSamaraLunas
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 

Dernier (8)

Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 

Desenvolvimento de jogos com HTML5 e javascript