<?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>JulioGreff.net &#187; dom</title>
	<atom:link href="http://juliogreff.net/tag/dom/feed/" rel="self" type="application/rss+xml" />
	<link>http://juliogreff.net</link>
	<description>A mesma web, um novo estilo de desenvolvimento</description>
	<lastBuildDate>Sat, 07 May 2011 17:07:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Firefox, Event Listeners e Return</title>
		<link>http://juliogreff.net/firefox-event-listeners-e-return/</link>
		<comments>http://juliogreff.net/firefox-event-listeners-e-return/#comments</comments>
		<pubDate>Thu, 07 Feb 2008 20:39:47 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[event]]></category>

		<guid isPermaLink="false">http://www.juliogreff.blog.br/firefox-event-listeners-e-return/</guid>
		<description><![CDATA[Quem já não perdeu alguns fios de cabelo usando return false em um Event Listener no Firefox? Por mais que se tente, o evento continua com seu comportamento padrão. Nesse post vou mostrar a &#8220;grande&#8221; solução. De acordo com a especificação do ECMAScript, Event Listeners (definidos através da famosa addEvent, para execvent, para executar funções [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/drag-and-drop-parte-1/' rel='bookmark' title='Permanent Link: Drag and Drop &#8211; Parte 1'>Drag and Drop &#8211; Parte 1</a></li>
<li><a href='http://juliogreff.net/mootools-menu-sanfona/' rel='bookmark' title='Permanent Link: Mootools &#8211; Menu Sanfona'>Mootools &#8211; Menu Sanfona</a></li>
<li><a href='http://juliogreff.net/drag-and-drop-parte-2/' rel='bookmark' title='Permanent Link: Drag and Drop &#8211; Parte 2'>Drag and Drop &#8211; Parte 2</a></li>
<li><a href='http://juliogreff.net/mootools-eventos/' rel='bookmark' title='Permanent Link: Mootools &#8211; Eventos'>Mootools &#8211; Eventos</a></li>
<li><a href='http://juliogreff.net/efeito-glide/' rel='bookmark' title='Permanent Link: Efeito Glide'>Efeito Glide</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>Quem já não perdeu alguns fios de cabelo usando <code>return false</code> em um Event Listener no Firefox? Por mais que se tente, o evento continua com seu comportamento padrão. Nesse post vou mostrar a &#8220;grande&#8221; solução.</p>
<p>De acordo com a especificação do ECMAScript, Event Listeners (definidos através da famosa <code>addEvent</code>, para execvent, para executar funções no disparo de eventos) não possuem valores de retorno, ou seja, <code>return false</code> não faz efeito algum (pelo menos no Firefox, que segue esse padrão).</p>
<p>A solução é simples: a função não possui valor de retorno, mas recebe como parâmetro um objeto <code>Event</code>. Através dele, podemos usar <code>Event.preventDefault</code> para impedir que o comportamento padrão seja executado. Veja o código:</p>
<pre><code>addEvent(myForm, "submit", function(e) {
		if(e &amp;&amp; e.preventDefault) e.preventDefault();
		else return false; // JavaScript à moda IE
	})</code></pre>
<p>Simples, não? Espero que possa ajudar, já que também tive esse pequeno problema. Até o próximo post!</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/drag-and-drop-parte-1/' rel='bookmark' title='Permanent Link: Drag and Drop &#8211; Parte 1'>Drag and Drop &#8211; Parte 1</a></li>
<li><a href='http://juliogreff.net/mootools-menu-sanfona/' rel='bookmark' title='Permanent Link: Mootools &#8211; Menu Sanfona'>Mootools &#8211; Menu Sanfona</a></li>
<li><a href='http://juliogreff.net/drag-and-drop-parte-2/' rel='bookmark' title='Permanent Link: Drag and Drop &#8211; Parte 2'>Drag and Drop &#8211; Parte 2</a></li>
<li><a href='http://juliogreff.net/mootools-eventos/' rel='bookmark' title='Permanent Link: Mootools &#8211; Eventos'>Mootools &#8211; Eventos</a></li>
<li><a href='http://juliogreff.net/efeito-glide/' rel='bookmark' title='Permanent Link: Efeito Glide'>Efeito Glide</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/firefox-event-listeners-e-return/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Drag and Drop &#8211; Parte 2</title>
		<link>http://juliogreff.net/drag-and-drop-parte-2/</link>
		<comments>http://juliogreff.net/drag-and-drop-parte-2/#comments</comments>
		<pubDate>Thu, 08 Mar 2007 22:08:36 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[cross browser]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[drag and drop]]></category>

		<guid isPermaLink="false">http://www.juliogreff.blog.br/?p=76</guid>
		<description><![CDATA[Esse post é continuação de Drag and Drop &#8211; Parte 1. Nessa segunda parte sobre Drag and Drop, vou explicar como &#8220;soltar&#8221; os objetos, como prometido no post anterior. Ficou curioso? Então vamos ao trabalho. Antes de começar, vamos tomar como exemplo uma lixeira: devemos carregar itens para dentro dela. Simples, não acha? Pois é, [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/drag-and-drop-parte-1/' rel='bookmark' title='Permanent Link: Drag and Drop &#8211; Parte 1'>Drag and Drop &#8211; Parte 1</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-1/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 1'>JavaScript Orientado a Objetos &#8211; Parte 1</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-2/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 2'>JavaScript Orientado a Objetos &#8211; Parte 2</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-3/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 3'>JavaScript Orientado a Objetos &#8211; Parte 3</a></li>
<li><a href='http://juliogreff.net/estendendo-objetos-dom/' rel='bookmark' title='Permanent Link: Estendendo Objetos DOM'>Estendendo Objetos DOM</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p class="post-see">Esse post é continuação de <a title="Drag and Drop - Parte 1" href="http://juliogreff.net/drag-and-drop-parte-1/">Drag and Drop &#8211; Parte 1</a>.</p>
<p>Nessa segunda parte sobre <a title="Drag and Drop - Parte 1" href="http://juliogreff.net/drag-and-drop-parte-1/">Drag and Drop</a>, vou explicar como &#8220;soltar&#8221; os objetos, como prometido no post anterior. Ficou curioso? Então vamos ao trabalho.</p>
<p>Antes de começar, vamos tomar como exemplo uma lixeira: devemos carregar itens para dentro dela. Simples, não acha? Pois é, se você respondeu &#8220;sim&#8221;, ledo engano.<br />
Como estamos carregando um item, ele ess carregando um item, ele está sempre <strong>diretamente</strong> abaixo do ponteiro do mouse. Desse modo, é impossível disparar um evento de mouse (<code>mouseup</code>, <code>mousedown</code>, <code>mouseover</code>&#8230;) em qualquer elemento da página. Se você carregar um item para uma lixeira, o mouse ainda estará acima do elemento, e não da lixeira.<br />
Existem algumas maneiras para resolver o problema, muito fáceis até. O problema da maioria delas é o mesmo: estética. Não mover o elemento até que o mouse seja soltado, colocar o elemento logo abaixo do ponteiro, entre outras coisas não muito bonitas de se ver.<br />
Mas pra tudo existe uma solução. Difícil, mas é uma boa solução. O plano é o seguinte: vamos criar uma lista de todos os alvos. Não vamos atirar em ninguém, esses alvos serão os lugares onde os itens podem ser largados. Quando o botão do roedor eletrônico for soltado, checaremos a posição do mouse e a posição de cada alvo, para sabermos se o ponteiro está em cima de algum desses alvos.<br />
Vamos ao código:</p>
<pre><code>/*
Ainda precisamos de todo o código dos exemplos anteriores,
com exceção da função mouseUp (substituída agora)
*/

var dropTargets = [];

function addDropTarget(dropTarget){
	dropTargets.push(dropTarget);
}

function mouseUp(ev){
	ev           = ev || window.event;
	var mousePos = mouseCoords(ev);

	for(var i=0; i &lt; dropTargets.length; i++){
		var curTarget  = dropTargets[i];
		var targPos    = getPosition(curTarget);
		var targWidth  = parseInt(curTarget.offsetWidth);
		var targHeight = parseInt(curTarget.offsetHeight);

		if(
			(mousePos.x &gt; targPos.x)                &amp;&amp;
			(mousePos.x &lt; (targPos.x + targWidth))  &amp;&amp;
			(mousePos.y &gt; targPos.y)                &amp;&amp;
			(mousePos.y &lt; (targPos.y + targHeight))){
// Aqui executamos a ação desejada.
		}
	}

	dragObject   = null;
}
</code></pre>
<p>Usamos assim: definimos um alvo com a função <code>addDropTarget</code>, assim como <code>makeDraggable</code> de antes. Quando soltamos o mouse, a função <code>mouseUp</code> checa a posição de cada alvo e a posição do mouse, e então executa a ação que precisamos.<br />
Tudo OK, tudo prontinho. É claro que o resto é criatividade: containers, organização de dados, alguma coisa pra ser carregada pela sua página, ou qualquer outra bugiganga sem muita utilidade. Até!</p>
<p><em>Este texto é uma versão do original, <a title="How to Drag and Drop in JavaScript" rel="external" href="http://www.webreference.com/programming/javascript/mk/column2/index.html">How to Drag and Drop in JavaScript</a>.</em></p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/drag-and-drop-parte-1/' rel='bookmark' title='Permanent Link: Drag and Drop &#8211; Parte 1'>Drag and Drop &#8211; Parte 1</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-1/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 1'>JavaScript Orientado a Objetos &#8211; Parte 1</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-2/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 2'>JavaScript Orientado a Objetos &#8211; Parte 2</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-3/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 3'>JavaScript Orientado a Objetos &#8211; Parte 3</a></li>
<li><a href='http://juliogreff.net/estendendo-objetos-dom/' rel='bookmark' title='Permanent Link: Estendendo Objetos DOM'>Estendendo Objetos DOM</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/drag-and-drop-parte-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drag and Drop &#8211; Parte 1</title>
		<link>http://juliogreff.net/drag-and-drop-parte-1/</link>
		<comments>http://juliogreff.net/drag-and-drop-parte-1/#comments</comments>
		<pubDate>Tue, 06 Mar 2007 21:43:00 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[cross browser]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[drag and drop]]></category>

		<guid isPermaLink="false">http://www.juliogreff.blog.br/?p=74</guid>
		<description><![CDATA[&#8220;Drag and Drop&#8221; é aquele conhecido efeito de arrastar e soltar, comum em muitos serviços que encontramos na Internet hoje em dia, e acredito que você já tenha se deparado com muitos desses serviços. Dividi este tutorial em duas partes, pra não ficar muito cansativo. Nessa primeira parte, vou explicar o básico, como &#8220;arrastar&#8221;. Na [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/drag-and-drop-parte-2/' rel='bookmark' title='Permanent Link: Drag and Drop &#8211; Parte 2'>Drag and Drop &#8211; Parte 2</a></li>
<li><a href='http://juliogreff.net/firefox-event-listeners-e-return/' rel='bookmark' title='Permanent Link: Firefox, Event Listeners e Return'>Firefox, Event Listeners e Return</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-1/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 1'>JavaScript Orientado a Objetos &#8211; Parte 1</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-2/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 2'>JavaScript Orientado a Objetos &#8211; Parte 2</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-3/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 3'>JavaScript Orientado a Objetos &#8211; Parte 3</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>&#8220;Drag and Drop&#8221; é aquele conhecido efeito de arrastar e soltar, comum em muitos serviços que encontramos na Internet hoje em dia, e acredito que você já tenha se deparado com muitos desses serviços.<br />
Dividi este tutorial em duas partes, pra não ficar muito cansativo. Nessa primeira parte, vou explicar o básico, como &#8220;arrastar&#8221;. Na outra, vamos aprender a &#8220;soltar&#8221; (parece meio óbvio, mas vai ser útil, aguarde).</p>
<h3>Capturando Movimentos do Mouse</h3>
<p>A primeira coisa que devemos fazer é capturar as coordenadas do mouse quando ele se move. Isso é feito adicionando uma função ao evento <code>document.onmousemove</code>.</p>
<pre><code>document.onmousemove = mouseMove;// Essa não é a melhor maneira de fazer isso// Quando for "de verdade", use addEventfunction mouseMove(ev){        ev           = ev || window.event;        var mousePos = mouseCoords(ev);}function mouseCoords(ev){        if(ev.pageX || ev.pageY){                return {x:ev.pageX, y:ev.pageY};        }        return {                x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,                y:ev.clientY + document.body.scrollTop  - document.body.clientTop        };}</code></pre>
<p>Primeiro vamos ao evento. Praticamente tudo que fizemos quando estamos em uma página dispara um evento (um clique, um movimento de mouse, uma tecla pressionada&#8230;). No IE, esse evento é global, e fica na variável <code>window.event</code>. Nos browsers de verdade (Firefox, Opera, Safari&#8230;), esse evento é passado como argumento para a função que está vinculada a ação.<br />
Sempre diferente, o IE dá um jeito de atrapalhar. Nos browsers (Firefox, Opera, Safari&#8230;, IE não é browser), <code>event.pageX</code> e <code>event.pageY</code> representam a posição do mouse em relação ao documento, onde o topo esquerdo é a posição 0&#215;0. Se você rolar a página 100 pixels abaixo, <code>pageY</code> será 100, e assim por diante.<br />
Já se você clicar num ícone com um &#8220;E&#8221; azul e for testar, a posição do mouse em relação a <strong>janela</strong> estará armazenada em <code>event.clientX</code> e <code>event.clientY</code>. Assim sendo, mesmo se você rolar a página (e manter o mouse no lugar), a posição será sempre 0&#215;0 (já que a posição é em relação a janela, e não ao documento inteiro). As variáveis <code>scrollTop</code> e <code>scrollLeft</code> nos ajudam a resolver o problema, já que elas armazenam a &#8220;quantidade&#8221; rolada. Piorando um pouco a situação (e aumentando mais um termo em nossa expressão algébrica &#8220;made-for-ie&#8221;), o documento não fica na posição 0&#215;0, há uma pequena borda ao redor. <code>document.body.clientLeft</code> e <code>document.body.clientTop</code> contém a largura dessa borda.<br />
Pra não nos preocuparmos com isso, o dito cujo criador da função (que permanece desconhecido pra mim) deixou tudo pronto. Em todos os exemplos, suprimirei essa função, mas ela deve estar lá sempre!</p>
<h3>Capturando Cliques do Mouse</h3>
<p>Agora precisamos saber quando o botão do mouse é pressionado e quando ele é soltado. Novamente usamos os eventos, agora <code>onmousedown</code> e <code>onmouseup</code>. Note que eles não devem ser vinculados ao documento, e sim ao objeto que queremos arrastar. Assim só eles poderão ser arrastados, e não o documento.</p>
<pre><code>document.onmouseup = mouseUp;var dragObject     = null;

function makeClickable(object){        object.onmousedown = function(){                dragObject = this;        }}

function mouseUp(ev){        dragObject = null;}</code></pre>
<p>A variável dragObject conterá o objeto que está sendo carregado. Se o objeto for &#8220;arrastável&#8221;, e clicarmos nele, ele vai pra essa variável. Caso contrário, ela permanece nula. E quando soltamos o botão do mouse, idem. E para tornar um objeto possível de se arrastar (&#8220;arrastável&#8221;, não sei se isso existe), usamos a função <code>makeClickable</code>, passando o dito objeto como parâmetro.</p>
<h3>Movendo um Objeto</h3>
<p>Agora na reta final. Primeiro, para podermos arrastar um objeto, precisamos que o estilo <code>position</code> seja <code>absolute</code>, obviamente porque a sua posição é relativa ao topo esquerdo do documento, assim como a posição do mouse.<br />
Uma vez que <code>objeto.style.position = "absolute"</code>, tudo que temos que fazer é mudar os estilos <code>top</code> e <code>left</code>. So, voila! Só falta saber como fazer isso:</p>
<pre><code>document.onmousemove = mouseMove;document.onmouseup   = mouseUp;

var dragObject  = null;var mouseOffset = null;

function mouseMove(ev){        ev           = ev || window.event;        var mousePos = mouseCoords(ev);}

// mouseCoords(ev)...

function getMouseOffset(target, ev){        ev = ev || window.event;

     var docPos    = getPosition(target);        var mousePos  = mouseCoords(ev);        return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};}

function getPosition(e){        var left = 0;        var top  = 0;

     while (e.offsetParent){                left += e.offsetLeft;                top  += e.offsetTop;                e     = e.offsetParent;        }

     left += e.offsetLeft;        top  += e.offsetTop;

     return {x:left, y:top};}

function mouseMove(ev){        ev           = ev || window.event;        var mousePos = mouseCoords(ev);

     if(dragObject){                dragObject.style.position = 'absolute';                dragObject.style.top      = mousePos.y - mouseOffset.y;                dragObject.style.left     = mousePos.x - mouseOffset.x;

             return false;        }}function mouseUp(){        dragObject = null;}

function makeDraggable(item){        if(!item) return;        item.onmousedown = function(ev){                dragObject  = this;                mouseOffset = getMouseOffset(this, ev);                return false;        }}          </code></pre>
<p>Esse &#8220;juntão&#8221; de códigos (e alguns a mais) nos permite mover livremente um objeto (desde que seja &#8220;arrastável&#8221; (preciso de um substituto pra essa palavra), através de <code>makeDraggable</code>).<br />
Algo mais que possa interessar: quando clicamos em um item (item = objeto &#8220;arrastável&#8221;, ufa), guardamos outra variável: <code>mouseOffset</code>. Ela contém o lugar em que clicamos em nosso item. Isso para que possamos posicionar o item abaixo do mouse da mesma maneira quando clicado.<br />
Outra função diferente que usamos: <code>getPosition</code>. Ela retorna a posição de um item relativo ao documento. Como seu <code>offsetLeft e offsetTop</code> são relativos ao seu elemento pai, a função vai somando até chegar ao documento.</p>
<h3>Soltando um Objeto</h3>
<p>Até agora cumprimos tudo, carregamos o item para qualquer lugar da página. Mas podemos fazer mais que isso, como encaixar o item em um lugar específico, ou carrega-lo para uma lixeira, pasta&#8230;</p>
<p>Isso é legal, concorda? E tenho um segredo pra contar: só na <a title="Drag and Drop - Parte 2" href="http://juliogreff.net/drag-and-drop-parte-2/">parte 2</a>, até!</p>
<p class="post-see">Não esqueça de ler a <a title="Drag and Drop - Parte 2" href="http://juliogreff.net/drag-and-drop-parte-2/">parte 2</a> do artigo!</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/drag-and-drop-parte-2/' rel='bookmark' title='Permanent Link: Drag and Drop &#8211; Parte 2'>Drag and Drop &#8211; Parte 2</a></li>
<li><a href='http://juliogreff.net/firefox-event-listeners-e-return/' rel='bookmark' title='Permanent Link: Firefox, Event Listeners e Return'>Firefox, Event Listeners e Return</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-1/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 1'>JavaScript Orientado a Objetos &#8211; Parte 1</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-2/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 2'>JavaScript Orientado a Objetos &#8211; Parte 2</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-3/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 3'>JavaScript Orientado a Objetos &#8211; Parte 3</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/drag-and-drop-parte-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Estendendo Objetos DOM</title>
		<link>http://juliogreff.net/estendendo-objetos-dom/</link>
		<comments>http://juliogreff.net/estendendo-objetos-dom/#comments</comments>
		<pubDate>Sun, 18 Feb 2007 21:35:00 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[cross browser]]></category>
		<category><![CDATA[dom]]></category>

		<guid isPermaLink="false">http://www.juliogreff.blog.br/?p=66</guid>
		<description><![CDATA[Estender objetos DOM vem sendo um problema desde que IE é browser (ou quase isso, IE não é um browser, pode ser usado até como torradeira (?), mas browser não). Como o bichinho azul não nos deixa estender Object ou Element (não me pergunte o porquê), nos vemos em um grande problema, que muitos desenvolvedores [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/estendendo-o-javascript/' rel='bookmark' title='Permanent Link: Estendendo o JavaScript'>Estendendo o JavaScript</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-1/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 1'>JavaScript Orientado a Objetos &#8211; Parte 1</a></li>
<li><a href='http://juliogreff.net/mootools-classes/' rel='bookmark' title='Permanent Link: Mootools &#8211; Classes'>Mootools &#8211; Classes</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-2/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 2'>JavaScript Orientado a Objetos &#8211; Parte 2</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-3/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 3'>JavaScript Orientado a Objetos &#8211; Parte 3</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>Estender objetos DOM vem sendo um problema desde que IE é browser (ou quase isso, IE não é um browser, pode ser usado até como torradeira (?), mas browser não).<br />
Como o bichinho azul não nos deixa estender <code>Object</code> ou <code>Element</code> (não me pergunte o porquê), nos vemos em um grande problema, que muitos desenvolvedores já tentaram resolver. Um dos mais bem-sucedidos nisso (dos que conheço) foi o <a title="Bernardo Rufino" rel="external friend" href="http://bermonruf.wordpress.com/">Bermonruf</a>, <a title="Estendendo Objetos JS Cross Browser - Parte 1" rel="external friend" href="http://bermonruf.wordpress.com/2007/01/05/extendendo-objetos-js-cross-browser-parte-1/">nesse post</a>. Ele usa uma maneira criativa de estender os objetos DOM. Não tão eficiente quanto estender a raíz dos objetos (maldito IE!), mas funciona impressionantemente bem, devido as restrições a nós, pobres mortais, impostas. O <a title="Estendendo Objetos JS Cross Browser - Parte 1" rel="external friend" href="http://bermonruf.wordpress.com/2007/01/05/extendendo-objetos-js-cross-browser-parte-1/">post</a> explica melhor a idéia do que eu.<br />
Eu, perfeccionista não satisfeito, continuei atrás de uma maneira &#8220;elegante&#8221;, como diz o Bernardo. Não encontrei, mas encontrei uma maneira diferente, e que se aplica melhor ao meu estilo de desenvolvimento (me ajudou muito, não só com o DOM). Baseia-se em <a title="Extending DOM Nodes with Mootools" rel="external" href="http://www.coryhudson.com/blog/2006/09/26/extending-dom-nodes-with-mootools/">Extending DOM Nodes with Mootools</a>, de <a title="Cory Hudson" rel="external" href="http://www.coryhudson.com/blog/">Cory Hudson</a>. Como não sou bom pra re-explicar soluções dos outros, leia lá.</p>
<h3>Fuçando na Mootools</h3>
<p>Como estou desenvolvendo uma biblioteca, não quero que seja necessário outras para fazê-la funcionar. Então fui fuçar na <a title="Mootools Library" rel="external" href="http://mootools.net/">Mootools</a>. Achei a &#8220;solução&#8221; para nosso &#8220;problema&#8221;. Vamos criar algumas funções daqui a pouco, baseadas em <code>Object.extend</code>, <code>Element.extend</code> e <code>$</code>. É tudo que iremos precisar para estender nossos objetos.<br />
Utilizaremos a mesma idéia do Bernardo (estender objeto por objeto), mas de uma maneira diferente (apenas os elementos retornados pela função <code>$</code> serão estendidos).</p>
<h3>As Funções para Estender</h3>
<p>As funções que apresentarei a vocês vêm diretamente da minha biblioteca. Elas tem algumas pequenas modificações que julguei necessárias, mas são praticamente a mesma coisa.</p>
<pre><code>Object.extend = function(objDestination, objSource) {  if(typeof objSource == "undefined") {    objSource = objDestination;    objDestination = this;  }  for(var property in objSource)    objDestination[property] = objSource[property];  return objDestination;}Element.extend = function(objSource) {  return Object.extend(Element.prototype, objSource);}</code></pre>
<p>Antes de <code>Element.extend</code>, precisamos definir a função <code>Element</code>, também da minha biblioteca, também baseada na <a title="Mootools Library" rel="external" href="http://mootools.net/">Mootools</a>.</p>
<pre><code>var Element = function(mElement) {  if(typeof mElement == "string")    mElement = document.createElement(mElement);  return $(mElement);}</code></pre>
<p>Quase tudo que precisamos está aí. Agora falta a função <code>$</code>, que retornará nossos objetos DOM já estendidos.</p>
<h3>A função pra objeto e$tendido</h3>
<p>Como já disse, apenas os objetos retornados por <code>$</code> serão e$tendidos. Essa função retornará o objeto estendido com tudo que estiver no <a title="JavaScript Orientado a Objetos - Parte 2" href="http://juliogreff.net/javascript-orientado-a-objetos-parte-2/">protótipo</a> (<code>prototype</code>) da &#8220;classe&#8221; <code>Element</code>. Mais simples: todos os métodos da &#8220;classe&#8221; <code>Element</code> estarão em todos os objetos retornados por <code>$</code>. Como? Vamos codificar:</p>
<pre><code>// Adaptado da Mootoolsvar $ = function(el) {        el = document.getElementById(el);        el.extend = Object.extend;        el.extend(Element.prototype);        return el;}</code></pre>
<p>Pronto, aí está! That&#8217;s all folks! Peraí, ainda não. Não vão embora ainda, temos que estender <code>Element</code> ainda! Lembre-se, tudo que estiver em <code>Element</code> está nos objetos retornados em <code>$</code>.</p>
<h3>Estendendo Element</h3>
<p>Caramba, postagem concisa essa, não? Estende isso, aquilo&#8230; Vou deixar que o código abaixo se auto-explique:</p>
<pre><code>Element.extend({  "metodo": function() { alert(this.innerHTML); },  "bold": function() { this.style.fontWeight = "bold"; }}</code></pre>
<p>Estendemos (quase) tudo. Cada par desses aí resultará em um método (nesse caso, 2 pares, 2 métodos). Colocamos dois métodos no <code>prototype</code> de <code>Element</code>, e eles irão parar nos nossos objetos DOM.</p>
<h3>Reaproveitando isso tudo</h3>
<p>Um dos grandes méritos da <a title="JavaScript Orientado a Objetos - Parte 1" href="http://juliogreff.net/javascript-orientado-a-objetos-parte-1"><abbr title="Programação Orientada a Objetos">POO</abbr></a> é que podemos reutilizar tudo. Usando <code>Object.extend</code>, você pode estender qualquer objeto: strings, arrays, objetos DOM individuais, qualquer coisa. Basta chamar a função com dois argumentos: <code>objDestination</code> (objeto de destino) e <code>objSource</code> (métodos ou propriedades a serem adicionados, no formato <a title="JavaScript Object Notation" href="http://juliogreff.net/javascript-object-notation/">JSON</a>).<br />
Espero que eu tenha sido claro, e utilizem bem!</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/estendendo-o-javascript/' rel='bookmark' title='Permanent Link: Estendendo o JavaScript'>Estendendo o JavaScript</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-1/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 1'>JavaScript Orientado a Objetos &#8211; Parte 1</a></li>
<li><a href='http://juliogreff.net/mootools-classes/' rel='bookmark' title='Permanent Link: Mootools &#8211; Classes'>Mootools &#8211; Classes</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-2/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 2'>JavaScript Orientado a Objetos &#8211; Parte 2</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-3/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 3'>JavaScript Orientado a Objetos &#8211; Parte 3</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/estendendo-objetos-dom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XML Sem Ajax</title>
		<link>http://juliogreff.net/xml-sem-ajax/</link>
		<comments>http://juliogreff.net/xml-sem-ajax/#comments</comments>
		<pubDate>Fri, 09 Feb 2007 20:15:36 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.juliogreff.blog.br/?p=61</guid>
		<description><![CDATA[Ando meio relapso aqui no blog. A explicação é o jsFrameWorX, estou trabalhando direto com ele (a propósito, mudei a &#8220;documentação&#8221; para fora do script). O que escreverei hoje será a próxima função do bichinho. Quem usa Ajax vai achar isso aqui loucura, quem sempre sonhou com XML direto no JavaScript vai ficar admirado (e [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/ajax-sem-o-x/' rel='bookmark' title='Permanent Link: Ajax sem o X'>Ajax sem o X</a></li>
<li><a href='http://juliogreff.net/fila-de-requisicoes-em-ajax/' rel='bookmark' title='Permanent Link: Fila de Requisições em Ajax'>Fila de Requisições em Ajax</a></li>
<li><a href='http://juliogreff.net/ajax-com-a-mootools/' rel='bookmark' title='Permanent Link: Ajax com a Mootools'>Ajax com a Mootools</a></li>
<li><a href='http://juliogreff.net/utilizando-o-metodo-post/' rel='bookmark' title='Permanent Link: Utilizando o Método POST em Ajax'>Utilizando o Método POST em Ajax</a></li>
<li><a href='http://juliogreff.net/responsexml/' rel='bookmark' title='Permanent Link: ResponseXML'>ResponseXML</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>Ando meio relapso aqui no blog. A explicação é o jsFrameWorX, estou trabalhando direto com ele (a propósito, mudei a &#8220;documentação&#8221; para fora do script). O que escreverei hoje será a próxima função do bichinho.</p>
<p>Quem usa Ajax vai achar isso aqui loucura, quem sempre sonhou com XML direto no JavaScript vai ficar admirado (e não falo de E4X). Usaremos uma simples função chamada <code>loadXMLDoc</code> (achei na Internet, não sei o autor).</p>
<pre><code>function loadXMLDoc(dname){var xmlDoc;// code for IE

if (window.ActiveXObject)

{

xmlDoc=new ActiveXObject("Microsoft.XMLDOM");

}

// code for Mozilla, Firefox, Opera, etc.

else if (document.implementation &amp;&amp; document.implementation.createDocument)

{

xmlDoc=document.implementation.createDocument("","",null);

}

else

{

alert('Your browser cannot handle this script');

}

xmlDoc.async=false;

xmlDoc.load(dname);

return(xmlDoc);

}</code></pre>
<p>Esta acima é a gloriosa função. Ela não manterá a mesma forma no jsFrameWorX, e adicionarei algumas características. Assim como o <code>responseXML</code> do <code>XmlHttpRequest</code>, temos a disposição qualquer método <a href="http://www.w3schools.com/dom/default.asp" rel="external" title="XML DOM">DOM do XML</a>. O que mais usaremos provavelmente será <code>getElementsByTagName</code> e <code>getElementById</code>, mas não vem ao caso.</p>
<p>Podemos usar tanto XML estático quanto dinâmico. Como? Lembra-se do <a href="http://juliogreff.net/ajax-sem-o-x/">Ajax sem o X</a>? Usamos o mesmo princípio, passando query strings para um script no lado do servidor, ou mesmo sem query strings, mas com dados já coletados e guardados em algum lugar.</p>
<pre><code>loadXMLDoc("xml_dinamico.php?qs=xml_dinamico");</code></pre>
<p>Aí você pode trabalhar com XML como se estivesse dentro do script, sem precisar usar Ajax (ou o <code>XMLHttpRequest</code>), apesar de podermos fazer requisições síncronas e assíncronas. Esse XML pode ser usado de diversas maneiras: <a href="http://bermonruf.wordpress.com/2006/12/05/criando-graficos-dinamicamente-com-ajax-e-xml/" rel="external friend" title="Criando Gráficos Dinamicamente com Ajax e XML">criar um gráfico</a>, importar informações para uma aplicação, e, talvez no futuro, importar <abbr title="Scalable Vector Graphics">SVG</abbr> direto no HTML.</p>
<p>Quem estiver interessado em XML DOM, visite o <a href="http://www.w3schools.com/dom/default.asp" rel="external" title="XML DOM">W3Schools</a>. Quem ainda não conhece o site, visite, tem ótimos tutoriais sobre tudo que você imaginar (e um pouco mais).</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/ajax-sem-o-x/' rel='bookmark' title='Permanent Link: Ajax sem o X'>Ajax sem o X</a></li>
<li><a href='http://juliogreff.net/fila-de-requisicoes-em-ajax/' rel='bookmark' title='Permanent Link: Fila de Requisições em Ajax'>Fila de Requisições em Ajax</a></li>
<li><a href='http://juliogreff.net/ajax-com-a-mootools/' rel='bookmark' title='Permanent Link: Ajax com a Mootools'>Ajax com a Mootools</a></li>
<li><a href='http://juliogreff.net/utilizando-o-metodo-post/' rel='bookmark' title='Permanent Link: Utilizando o Método POST em Ajax'>Utilizando o Método POST em Ajax</a></li>
<li><a href='http://juliogreff.net/responsexml/' rel='bookmark' title='Permanent Link: ResponseXML'>ResponseXML</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/xml-sem-ajax/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>24 Ways</title>
		<link>http://juliogreff.net/24-ways/</link>
		<comments>http://juliogreff.net/24-ways/#comments</comments>
		<pubDate>Tue, 05 Dec 2006 23:17:08 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[Diversos]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[links]]></category>
		<category><![CDATA[web standards]]></category>

		<guid isPermaLink="false">http://www.juliogreff.blog.br/?p=42</guid>
		<description><![CDATA[O 24 Ways está de volta. Desde o dia 1º até o dia 24 de dezembro, serão apresentados vários artigos &#8220;muito dos interessante&#8221;, escritos por grandes gurus da web. Dentre esses gurus, temos: Inman, Hicks, Collison, Johansson, Molly além do próprio McLellan, criador do site. Alguns dos temas abordados: CSS, DOM scripting, acessibilidade, microformats dentre [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/primeiro-post/' rel='bookmark' title='Permanent Link: Primeiro Post'>Primeiro Post</a></li>
<li><a href='http://juliogreff.net/ficando-bem-informado/' rel='bookmark' title='Permanent Link: Ficando Bem-Informado'>Ficando Bem-Informado</a></li>
<li><a href='http://juliogreff.net/e-a-tal-da-web-20/' rel='bookmark' title='Permanent Link: E a tal da Web 2.0?'>E a tal da Web 2.0?</a></li>
<li><a href='http://juliogreff.net/divless/' rel='bookmark' title='Permanent Link: DIVless'>DIVless</a></li>
<li><a href='http://juliogreff.net/yoomp-primeiras-impressoes/' rel='bookmark' title='Permanent Link: Yoomp &#8211; Primeiras Impressões'>Yoomp &#8211; Primeiras Impressões</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://24ways.org/2006" rel="external" title="24 Ways">24 Ways</a> está de volta. Desde o dia 1º até o dia 24 de dezembro, serão apresentados vários artigos &#8220;muito dos interessante&#8221;, escritos por grandes gurus da web.</p>
<p>Dentre esses gurus, temos:  Inman, Hicks, Collison, Johansson, Molly além do próprio McLellan, criador do site.</p>
<p>Alguns dos temas abordados: CSS, DOM scripting, acessibilidade, microformats dentre outros. Ahh! Também estão disponíveis os artigos do ano passado: <a href="http://24ways.org/2005/" rel="external" title="24 Ways 2005">24 Ways 2005</a>.</p>
<p>Espalhe a notícia! Fonte: <a href="http://www.revolucao.etc.br/archives/24-ways-esta-de-volta/" rel="external" title="24 Ways está de volta">Revolução Etc</a></p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/primeiro-post/' rel='bookmark' title='Permanent Link: Primeiro Post'>Primeiro Post</a></li>
<li><a href='http://juliogreff.net/ficando-bem-informado/' rel='bookmark' title='Permanent Link: Ficando Bem-Informado'>Ficando Bem-Informado</a></li>
<li><a href='http://juliogreff.net/e-a-tal-da-web-20/' rel='bookmark' title='Permanent Link: E a tal da Web 2.0?'>E a tal da Web 2.0?</a></li>
<li><a href='http://juliogreff.net/divless/' rel='bookmark' title='Permanent Link: DIVless'>DIVless</a></li>
<li><a href='http://juliogreff.net/yoomp-primeiras-impressoes/' rel='bookmark' title='Permanent Link: Yoomp &#8211; Primeiras Impressões'>Yoomp &#8211; Primeiras Impressões</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/24-ways/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

