Posts na categoria ‘js’

25jan2012

Alterar dimensões de embed do youtube com javascript

(0) comentários

Repositório, para deixar arquivado aqui.
Veja que ao clicar em cada botão, o tamanho do vídeo se altera.

<html>
<head>
<style type="text/css">
* { margin: 0; padding: 0; }
html, body { height: 100%; }
</style>
<script type="text/javascript">
function sizeIframe( w, h )
{
	document.getElementById('yt').width = w;
	document.getElementById('yt').height = h;
}
window.onload = function(){
	sizeIframe( document.body.offsetWidth, document.body.offsetHeight-30 );
}
</script>
</head>
<body>
	<iframe width="420" height="315" src="http://www.youtube.com/embed/tvaPMNq4Ey0" frameborder="0" allowfullscreen id="yt"></iframe>

	<input type="button" name="mudar" value="600x480" onclick="sizeIframe( 600, 480 )" />
	<input type="button" name="mudar" value="600x480" onclick="sizeIframe( 420, 315 )" />
	<input type="button" name="mudar" value="300x240" onclick="sizeIframe( 300, 240 )" />
</body>
</html>

É isso. Me diga se vc usar.

25jan2012

Exibir restante de conteúdo, que já estava sendo mostrado pela “metade”- jQuery exibe-esconde

(0) comentários

Boas,

A idéia aqui, foi chegar próximo do efeito de “Exibir mais” do youtube:
Escondido:

A mostra:

Ok ?
Uma parte do conteúdo fica a mostra, e clicando no botão aparece o restante.

O primeiro passo é resolver o efeito no css. Todos os efeitos são apenas css. O javascript manipulando css. jQuery só entra para facilitar essa manipulação, porém é importante ressaltar, que toda a lógica e o efeito em si, ficou no css.

Depois de conseguir resolver tanto o estado aberto, qnto o fechado, usando apenas css e html, sem nenhuma linha de js, fazer o comportamento fica super simples.

<html>
<head>
<style type="text/css">
* { margin: 0; padding: 0; }
p { margin-bottom: 10px; }
.content { margin: 0 auto; width: 500px; }
#panel { position: relative; width: 500px; margin: 0 auto; }
#content { }
.hidden { height: 100px; overflow: hidden; }
#toggle { width: 488px; height: 20px; padding: 5px;
	background: #fff; border: 1px solid #ccc; cursor: pointer;
	text-align: center;
}
</style>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript">
jQuery(document).ready(function(){
	jQuery('#toggle').click(function(){
		jQuery('#panel').toggleClass('hidden');
	});
});
</script>
</head>
<body>
	<div id="panel" class="hidden content">
		<div id="content">
			<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sed gravida dolor. Fusce aliquam, urna sit amet
            luctus adipiscing, massa sem venenatis dui, quis accumsan mi orci eu orci. Mauris nec massa non mi iaculis tincidunt
            eget a lectus. Curabitur suscipit, magna vel laoreet volutpat, sem mauris placerat risus, nec pretium mauris orci non dui.</p>

			<p>Cras in massa dapibus leo tincidunt molestie nec ut sem. Aenean sit amet ipsum risus. Class aptent taciti sociosqu
            ad litora torquent per conubia nostra, per inceptos himenaeos. Cras vitae erat at magna volutpat consequat ut a justo.
            Mauris dapibus dolor at orci placerat congue. Praesent facilisis sodales molestie. Quisque eget lacus eget justo aliquet
             sagittis. Duis sed elit id dui semper feugiat. Vivamus risus magna, facilisis at hendrerit sit amet, accumsan nec felis.</p>

			<p>Nunc massa tellus, fringilla ut tincidunt consequat, ultricies eget nunc. </p>
         </div><!-- /content -->
	</div><!-- /panel -->
	<div id="toggle" class="content">toggle</div>
</body>
</html>

Demonstração

7dez2011

Alterando tamanho de fonte no resize da janela – javascript

(0) comentários

Boas !

Utilizando hoje o evento window.onresize.
Deixei 800px de largura como sendo a nossa largura inicial. Apartir dela, vou aumentar a fonte do documento, conforme a janela adquira mais largura, e caso seja menor que 800px; volto ao meu inicial…

<html>
<head>
<script type="text/javascript">
window.onload = function(){
	document.getElementById('result').innerHTML = document.body.offsetWidth;

}
window.onresize = function(){
	document.getElementById('result').innerHTML = document.body.offsetWidth;

	var bodyWidth = document.body.offsetWidth;
	if( bodyWidth>800 )
		fs = ( bodyWidth-800 )/10;
	else
		fs = 0;

	document.getElementsByTagName('h1')[0].style.fontSize = (fs+20)+'px';
	document.body.style.fontSize = (fs+12)+'px';
}
</script>
<style type="text/css">
body { font-size: 12px; }
h1 { font-size: 20px; }
</style>
</head>
<body>
	<h1>Algum texto aqui</h1>
	<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse a leo dolor. Etiam fermentum mi metus,
	vel dignissim dui. Sed non adipiscing risus. Suspendisse sed massa ac ipsum consequat ornare. Donec pretium
	urna at ipsum adipiscing ut sagittis ligula malesuada. Mauris nec quam fringilla massa hendrerit consequat.
	Aenean congue porta consectetur. In pellentesque auctor elementum. Curabitur eleifend, ante eget fringilla
	tempus, metus sem viverra enim, eu ullamcorper urna neque non ante. In sagittis malesuada faucibus. Nam nec
	malesuada nulla. Suspendisse semper suscipit lacinia. Etiam commodo tellus nec eros auctor ac malesuada arcu
	rutrum. Quisque tortor sapien, volutpat at consequat sed, dapibus tincidunt libero. Quisque malesuada est at
	erat suscipit sit amet suscipit dui blandit.</p>

	<p>Quisque in nulla hendrerit arcu facilisis hendrerit vitae sit amet massa. Suspendisse fermentum ligula
	congue sem fringilla sit amet pulvinar sem iaculis. Donec turpis orci, tempor sit amet sodales eu, cursus a
	nunc. Nulla sagittis velit id lorem dignissim porta. In congue ipsum ut ligula elementum suscipit nec sed ante.
	Cras felis eros, faucibus quis malesuada non, aliquet sed risus. Nullam pellentesque dui ligula. Lorem ipsum
	dolor sit amet, consectetur adipiscing elit. Sed neque metus, posuere porta luctus eget, molestie non lectus. </p>

	<div id="result"></div>
</body>
</html>

Demonstração

22nov2011

Descobrir se foi aberto como popup, ou se abriram diretamente.

(0) comentários

Dúvida rápida no fórum..
Será que é possível saber, se um documento foi aberto diretamente ? ou se ele foi aberto ‘como popup’ ?

b.html

<script type="text/javascript">
alert( window.opener );
</script>

Qndo acessarmos diretamente esse arquivo, o alert irá mostrar: null (digitando na url, ou copiando e colando daqui)
http://wbruno.com.br/scripts/b.html

e agora:
a.html

<script type="text/javascript">
window.open( 'b.html', '', 'width=300, height=200;')
</script>

ao acessarmos o arquivo a.html, o alert do nosso b.html, que foi aberto como popup, irá mostrar: [Object Window]

a.html

19nov2011

Navegando pela lista do suggest com as setas do teclado – autocomplete teclado javascript

(0) comentários

boas pessoal!

Eu já tinha colocado aqui, um suggest jQuery com ajax. Pensando como eu poderia deixar o usuário se movimentar pela lista de suggest, usando as setas do teclado, me dei conta que era desnecessário, tentar ficar trocando o .focus() dos elementos.


Na verdade, eu só preciso ‘fingir’ isso. Mostrar no input, o .text(), do item do suggest, e mostrar com um background em qual está.
Foi oq eu fiz. Bem simples.

<html>
<head>
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript">
jQuery(document).ready(function(){
	var active = -1;
	jQuery("input[name='autocomplete']").keypress(function( event ){
		var suggest_a = jQuery('#suggest a');
		var qnts_a = suggest_a.length;

		if( 40==event.keyCode )//seta baixo
			active = active>=(qnts_a-1) ? 0 : active+1;
		else if( 38==event.keyCode )//seta cima
			active = ( active<=0 ) ? qnts_a-1 : active-1;

		var a = suggest_a.removeClass('active').eq( active ).addClass('active');
		jQuery( this ).val( a.text() );
	});
});
</script>
<style type="text/css">
label { position: relative; }
#suggest {
	position: absolute;
	top: 20px;
	left: 0;
}
.active {
	background: #ccc;
}
</style>
</head>
<body>
	<label>
		<input type="text" name="autocomplete" />
		<ul id="suggest">
			<li><a href="">Item 1</a></li>
			<li><a href="">Item 2</a></li>
			<li><a href="">Item 3</a></li>
			<li><a href="">Item 4</a></li>
		</ul><!-- /suggest -->
	</label>
</body>
</html>


e vc? faria de outro jeito ?

ainda vou pesquisar para ver como ‘costumam fazer por ai’. Essa foi a forma que eu pensei para resolver.

19jul2011

Fazendo um ‘gif animado’ com javascript e um sprite .jpg

(0) comentários

hehe ^^

about:mozilla [digite isso na barra de endereços do teu Firefox]
Sei lá, pelo menos eu não sabia disso, até hoje.

Okay, fiquei curioso, pesquisei um pouco, li sobre “O Livro de Mozilla“, ai no finzinho do artigo da Wikipédia, vi isso aqui:

Netscape
Antes do Netscape 1.1, about:mozilla produzia o texto “Mozilla rulles!” (Mozilla governa!).
Digitando about:mozilla em uma versão Unix do Netscape o símbolo altera para uma animação do Mozilla vindo por detrás do ícone “planeta” e cuspindo fogo. (Imagens visíveis aqui)

Fiquei meio triste de não ter visto a animação do dragão subindo por trás do logo do Nestscape, e cuspindo fogo..

Mas ai resolvi brincar, e fazer um ‘gif animado’, só que sem o .gif.
Okay, preciso começar:

<html>
<head>
<script type="text/javascript">

</script>
<style type="text/css">

</style>
</head>
<body>
	<div id="mozilla"></div>
</body>
</html>

Bom, eu sabia que precisava de um documento .html, de javascript e algum css.
E como vou usar o sprite, preciso fazer o sprite:

Beleza, tive a iniciativa. Comecei a fazer. Sabendo usar sprites, sei que o meu container ali #mozilla, deve ter uma altura e largura tal, para mostrar apenas ‘um frame’ do sprite.

#mozilla {
	background: url('sprite_mozilla.jpg') no-repeat;
	height: 64px;
	width: 64px;
}

Tranquilo ne?!
Agora já vejo o dragãozinho, o primeiro frame do filme.

CSS Sprite, é uma técnica que se baseia fortemente na propriedade background-position.
Então, sei apartir disso, que preciso de um script js capaz de alterar essa propriedade, a cada x tempo.

Hum..background-position, em javascript quer dizer:

obj.style.backgroundPosition

e ‘a cada x tempo’, deve me lembrar ou setTimeout() [nesse caso recursivo], ou setInterval();

Blz, escolho o setInterval(); preciso criar uma função que altere o position.

var anima = function(){
	var left = 64*i+i;

	id('mozilla').style.backgroundPosition = '-'+left+' top';
	i++;
}

A ‘fórmula’ é simples. Deixei 1pixel de espaço entre cada frame do sprite. Então somo a minha variavel $i, para representar esse espaço. 64 é a largura de cada frame. $i é um contador que aumenta de 1 em 1. Multiplico o contador pela largura de cada frame, e faço o backgroundPosition se mexer de frame em frame.

Prévia Online

Tranquilo, ne?!
(note que o número embaixo da animação, representa o valor da variavel left, e veja como ele vai arbitrariamente crescendo, até passar os 715px de largura do sprite, para o além e adiante.)

Dai então, só vejo tela em branco. Pois lembrem-se do meu ‘no-repeat’ no css.

Se eu tivesse deixado o css assim:

background: url('sprite_mozilla.jpg');

Acontece oque vc imaginou (ou pelo menos deveria ter imaginado). A animação se repete do começo.
O dragão escondido, vai aparecendo, cospe fogo. [corte] O dragão escondido, vai aparecendo…

Prévia Online

Só que essa animação não me agradou muito, e eu queria que o dragão fosse ‘sumindo’ para fazer a volta. E foi isso que fiz:

Demonstração Online

Bom, é isso. Uso conceitual de css sprite e da função setInterval().
=)

21jun2011

Afinal, o que é o this ? – javascript

(0) comentários

Apenas para deixar claro de uma vez por todas.
E tentar diminuir a quantidade de scripts parecidos com isso aqui:

<script type="text/javascript" src="jquery-1.4.2.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
	$('.paragrafo span').hide();
	$('.botao').click(function(){
		$('.botao').val('carregando..');
		window.setTimeout(function(){
			$('.botao').fadeOut();

			$('.paragrafo span').show();
		}, 1000 );
	});
});
</script>

<p class="paragrafo">
	<input type="button" name="botao" value="Click Me" class="botao" />
	<span>Lero Lero</span>
</p>

Bem simples:

No evento onclick do elemento com a class=”botao”, disparo uma function, que vai trocar o atributo .value dos elementos com a class botão, pela string: ‘carregando’, e depois de 1 segundo(por causa do atrazo do setTimeout(), esses elementos sumirão da tela, com um efeito de fadeOut();

Encontrei ótimos textos sobre o this:
http://www.fredericoemidio.com/post/entendendo-javascript-this.aspx

Porém, o meu intuito é escrever algo mais básico, bem mais nível iniciante mesmo.
Já que um texto escrito neste nível: http://imasters.com.br/artigo/20785/javascript/compreendendo-a-palavra-chave-this-do-javascript não elucida muita coisa, se vc já não tiver um nível considerável de conhecimento.

Bom, voltando.
O script apresentado resolve a questão. Faz oque foi escrito para fazer, mas, e se tivéssemos mais botões?

<p class="paragrafo">
	<input type="button" name="botao" value="Click Me" class="botao" />
	<span>Lero Lero</span>
</p>
<p class="paragrafo">
	<input type="button" name="botao" value="Click Me" class="botao" />
	<span>Lero Lero</span>
</p>
<p class="paragrafo">
	<input type="button" name="botao" value="Click Me" class="botao" />
	<span>Lero Lero</span>
</p>

Então, a ação em 1 deles, dispararia o efeito em todos os outros.

Não é oque queremos. E precisamos entender o motivo disso acontecer.
No caso, o seletor jQuery: $(‘.botao’), nos retorna um array de objetos que possuem a class=”botao”.

E como estamos trabalhando diretamente e sempre com esse array, cada trecho do script, está sendo aplicado a todos os elementos do conjunto, e não apenas ao clicado, como queríamos.

Lhes apresento(ou não), o objeto this. Olhe para essa palavra chave como um ‘apontador’, um ‘ponteiro’, que representa o objeto atual, ou seja, o elemento com o qual estamos trabalhando nesse exato momento.

$( this ).val('carregando..');

Maravilha! Agora, o nosso carregando.. só será exibido no botão em que clicarmos.
Continuando..

		var $this = $( this );
		$this.val('carregando..');
		window.setTimeout(function(){
			$this.fadeOut();

Okay, agora só some o botão que clicamos.. porém e o span ?
continua aparecendo todos os 3, mesmo que só cliquemos em 1 botão.

Nesse caso, vamos usar o nosso ponteiro this, para apartir dele, buscarmos o nosso texto:

$this.next('span').show();

E então, uma outra forma, navegando pelo nosso DOM:

$this.parent('p').find('span').show();

Isso é oque todo programador javascript precisa saber de início sobre o this.

20jun2011

Botões Mais e Menos, adicionando/removendo itens, e calculando valor automaticamente

(0) comentários

Bom.. bem simples e básico..

porém fica de exemplo, para quem precisar.

<html>
<head>
<script type="text/javascript">
function id( el ){
        return document.getElementById( el );
}
window.onload = function(){
        id('mais').onclick = function(){
                id('format').value = parseInt( id('format').value )+1;

                id('total').value = 20*id('format').value;
        }
        id('menos').onclick = function(){
                if( id('format').value>0 )
                        id('format').value = parseInt( id('format').value )-1;

                id('total').value = 20*id('format').value;
        }
}
</script>
</head>
<body>
        <input type="button" name="mais" id="mais" value="+" />
        <input type="button" name="menos" id="menos" value="-" />

        <br />
        Formatacao <input type="text" name="format" value="0" id="format" size="2" /> x 20,00

        <br /><br />
        Total: <input type="text" name="total" id="total" value="" />
</body>
</html>

É isso ai, só mais um script rápido que criei para responder uma dúvida no fórum.

2jun2011

JavaScript não obstrutivo – usando a função window.confirm()

(0) comentários

Alguns ‘cases’ rápidos e simples, de como podemos usar javascript para melhorar a vida do usuário, sem estragar a navegação dele, e ainda deixar tudo funcionando, caso não haja suporte a js, ou o script simplesmente pare de funcionar.

confirm() indo para uma página

<html>
<head>
<script type="text/javascript">
function id( el ){
	return document.getElementById( el );
}
window.onload = function(){
	id('link').onclick = function(){
		return confirm( 'Deseja ir para '+this.href+' ?' );
	}
}
</script>
</head>
<body>
	<a href="http://wbruno.com.br" id="link">wbruno</a>
</body>
</html>

Veja que o código javascript é super simples. Não precisa de muito, e nem de nada complicado.

confirm() em um formulário

<html>
<head>
<script type="text/javascript">
function id( el ){
	return document.getElementById( el );
}
window.onload = function(){
	id('form').onsubmit = function(){
		return confirm( 'Tem certeza que deseja enviar o formulário ?' );
	}
}
</script>
</head>
<body>
	<form action="" method="post" id="form">
		Email: <input type="text" name="email" />
		<input type="submit" name="ok" value="ok" />
	</form>
</body>
</html>

Algumas aplicações que vejo são: ‘confirmar exclusão de registro’ (tanto pelo link direto, qnto pelo formulário), confirmar abertura de link externo, onde o usuário ‘sai’ do teu site…

A metodologia é simples: ‘Faça funcionar mesmo sem suporte a javascript’.
O difícil é a maioria dos programadores de hoje em dia, levarem em consideração ela.

31mai2011

Atrelar evento em elementos que não existiam no DOM

(0) comentários

Salve salve galera !!

Bom, eu já havia postado como carregar conteudo com ajax, apenas com javascript puro.

Porém, se junto com o xmlHttp.responseText, vierem alguns links, eles não terão o evento onclick, atrelados. Pois nós fizemos o ‘bind’ da function no window.onload, e nossos novos elementos foram trazidos muito depois desse instante.

Para entendimento, rode esse script isoladamente:

<html>
<head>
	<script type="text/javascript">
	window.onload = function(){
		id('teste').innerHTML = '<span id="ae">aeee</span>';

		attach( id('ae'), teste );
	}

	function attach( el, f ){
		if( window.addEventListener )
			el.addEventListener("click", f, false);
		else
			el.attachEvent("click", f );
	}
	function id( el ){
		return document.getElementById( el );
	}
	function teste(){
		alert( 'ae' );
	}
	</script>
</head>
<body>
	<div id="teste"></div>
</body>
</html>

Entendeu oque fizemos ?
Criamos uma tag <a> dentro da div#teste com javascript. E logo depois de criar, nos fizemos o bind do evento.

Precisaremos do mesmo para ‘dar vida’ aos nossos novos elementos que trouxemos com ajax.

			var as = id('content').getElementsByTagName('a');
			for( var i=0; i<as.length; i++ ){
				var arq = pega_arq( as[i].href );
				if( window.addEventListener )
					as[i].addEventListener( 'click', function(){ abre( arq ); }, false );
				else
					as[i].attachEvent( 'click', function(){ abre( arq ); } );
			}

Note que primeiro guardamos apenas os nossos ‘novos links’ (os que estiverem dentro da div#content), na variavel as.
depois com um loop for(), iteramos por essas tags <a>, e vamos uma a uma, adicionando no evento onclick a function abre(), responsável pela requisição ajax.

	as[i].addEventListener( 'click', function(){ abre( arq ); }, false );

Aqui, usamos uma function anônima, pois queremos que a arq() só seja executada, no evento onclick.

Demonstração Online

Switch to our mobile site