<?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>GUJS - Grupo de Usuários Javascript &#187; DOM</title>
	<atom:link href="http://gujs.com.br/blog/categoria/dom/feed/" rel="self" type="application/rss+xml" />
	<link>http://gujs.com.br/blog</link>
	<description>O Maior Site Javascript do Brasil</description>
	<lastBuildDate>Tue, 27 Oct 2009 14:12:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Barra de rolagem dinâmica com Ajax</title>
		<link>http://gujs.com.br/blog/2007/04/barra-de-rolagem-dinamica-com-ajax/</link>
		<comments>http://gujs.com.br/blog/2007/04/barra-de-rolagem-dinamica-com-ajax/#comments</comments>
		<pubDate>Thu, 12 Apr 2007 00:00:21 +0000</pubDate>
		<dc:creator>Matheus Zeuch</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[Downloads e Exemplos]]></category>
		<category><![CDATA[Tutoriais Avançados]]></category>

		<guid isPermaLink="false">http://gujs.com.br/blog/2007/04/barra-de-rolagem-dinamica-com-ajax/</guid>
		<description><![CDATA[Um recurso muito interessante do Google Reader é a área onde são listados os posts dos feeds que você assina. Quando os posts são carregados, apenas alguns aparecem na tela, e conforme você vai rolando aquela página para baixo, os demais posts vão aparecendo pouco a pouco. Isso é uma forma de navegação pouco utilizada [...]]]></description>
			<content:encoded><![CDATA[<p>Um recurso muito interessante do Google Reader é a área onde são listados os posts dos feeds que você assina. Quando os posts são carregados, apenas alguns aparecem na tela, e conforme você vai rolando aquela página para baixo, os demais posts vão aparecendo pouco a pouco. Isso é uma forma de navegação pouco utilizada na web, mas muito útil em alguns casos.<span id="more-16"></span></p>
<p>Além da vantagem de não precisar carregar mais itens que o necessário, o usuário também não perde de vista os posts que já estavam carregados quando os novos são exibidos. Este é um problema que acontece naquele conhecido modelo de paginação com os links das páginas e os de próxima página e página anterior.</p>
<p>O objetivo é carregar somente o número de mensagens que preencha o espaço na tela do usuário e, caso o usuário baixe até o final a barra de rolagem, o sistema carregue novas mensagens, mantendo na tela as anteriores. </p>
<p>No <a href="http://gujs.com.br/demo/scroll-ajax">exemplo deste artigo</a>, você pode ver na prática como funciona este modelo de paginação. Se preferir, <a href="http://gujs.com.br/blog/wp-content/uploads/2007/04/scroll-ajax.zip">baixe os códigos fontes</a> para fazer seus estudos e alterações.</p>
<p><strong>Como funciona?</strong> </p>
<p>Não vou me aprofundar explicando a utilização da classe Ajax utilizada no projeto, deixo isso para um futuro post. No momento, veremos as funções essenciais do exemplo, e a primeira delas é a função <code><strong>addLine()</strong></code>, que insere (via DOM) uma nova linha no div dos itens.</p>
<p>A função recebe como parâmetro um objeto contendo os atributos id e text e monta a linha que será inserida logo em seguida. Note que a função também controla a variável global <code>id</code> que será passada como parâmetro em todas as requisições dos notos itens. No nosso caso, apenas para que cada mensagem tenha um número maior que a anterior.</p>
<p>As funções <code><strong>paginationComplete()</strong></code> e <code><strong>pagination()</strong></code> são as responsáveis por fazer as requisições das próximas mensagens.</p>
<p>A função <code><strong>onScroll()</strong></code> verifica se a barra de rolagem está no rodapé da página. Se estiver, executa a função <code>pagination()</code>, que como vimos, fará a requisição das novas mensagens.</p>
<p>A função <code><strong>init()</strong></code> é quem chama pela primeira vez a função <code>pagination()</code>. Ela também atribui aos eventos <code>window.onscroll</code> e <code>window.onresize</code>, para que no sistema faça requisições sempre que ainda tiver espaço para novas mensagens.</p>
<p><strong>Onde utilizar o método?</strong></p>
<p>Utilizei este método (e estes mesmos códigos) em um sistema de monitoramento de mensagens, onde o usuário abria a tela de via as últimas mensagens, e conforme ia baixando a tela as mensagens antigas eram carregadas (até que não houvessem mais mensagens antigas no banco). Outro sistema de refresh fazia as requisições das novas mensagens, que eram exibidas no topo. Com isso consegui um bom sistema de monitoramento em tempo real de mensagens, e que ao mesmo tempo era prático para visualizar mensagens antigas.</p>
<p>Você pode usar sua imaginação para utilizar estes códigos em seus projetos. Acho que é um bom exemplo de se usar em sistemas de mensagens, leitor de e-mails, agregador de feeds rss, e em qualquer lugar onde o método convencional de paginação não é a melhor opção.</p>
<p><strong>Considerações finais</strong></p>
<p>Testei o exemplo no Firefox e no IE 7, portanto, se você encontrar algum erro por favor me avise que eu corrijo.</p>
<p>Se tiver dúvidas ou quiser fazer algum comentário sobre o artigo e o exemplo, sinta-se à vontade para utilizar o formulário de comentários abaixo ou então <a href="http://gujs.com.br/forum/viewtopic.php?p=502" title="Acompanhe a discussão no Fórum">acompanhar a discussão no fórum</a>.</p>
<p>Divirta-se!</p>
<p><a href="http://gujs.com.br/demo/scroll-ajax" title="Veja o exemplo"><strong>Exemplo</strong></a> | <a href="http://gujs.com.br/blog/wp-content/uploads/2007/04/scroll-ajax.zip" title="Faça o download dos arquivos"><strong>Download</strong></a></p>
]]></content:encoded>
			<wfw:commentRss>http://gujs.com.br/blog/2007/04/barra-de-rolagem-dinamica-com-ajax/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Movendo itens entre list boxs</title>
		<link>http://gujs.com.br/blog/2007/04/movendo-itens-entre-list-boxs/</link>
		<comments>http://gujs.com.br/blog/2007/04/movendo-itens-entre-list-boxs/#comments</comments>
		<pubDate>Tue, 10 Apr 2007 02:40:53 +0000</pubDate>
		<dc:creator>Rafael Quines</dc:creator>
				<category><![CDATA[Cross-browser]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[Tutoriais Básicos]]></category>

		<guid isPermaLink="false">http://gujs.com.br/blog/2007/04/movendo-itens-entre-list-boxs/</guid>
		<description><![CDATA[Hoje em dia, este é um recurso muito usado em formulários em geral. Permite que sejam selecionados vários itens para um relatório, por exemplo. Normalmente se tem um listbox com os ítens disponíveis, e outro, inicialmente vazio, ficam os itens selecionados na primeira list.

Um bom exemplo seria em um cadastro de vendedor, o usuário deve [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje em dia, este é um recurso muito usado em formulários em geral. Permite que sejam selecionados vários itens para um relatório, por exemplo. Normalmente se tem um listbox com os ítens disponíveis, e outro, inicialmente vazio, ficam os itens selecionados na primeira list.</p>
<p><span id="more-15"></span></p>
<p>Um bom exemplo seria em um cadastro de vendedor, o usuário deve selecionar as cidades que aquele vendedor atua. Numa list, aparece todas as cidades cadastradas. Na outra, só as seleiconadas para aquele vendedor.</p>
<p>Em primeiro lugar, teremos 2 lists: listOrigem e a listDestino.</p>
<pre class="prettyprint">
&lt;select name="listOrigem" id="listOrigem" MULTIPLE size="10"&gt;
&lt;option value="1"&gt;Porto Alegre&lt;/option&gt;
&lt;option value="2"&gt;São Paulo&lt;/option&gt;
&lt;option value="3"&gt;Rio de Janeiro&lt;/option&gt;
&lt;option value="4"&gt;Natal&lt;/option&gt;
&lt;option value="5"&gt;Fortaleza&lt;/option&gt;
&lt;/select&gt;

&lt;select name="listDestino" id="listDestino" MULTIPLE size="10"&gt;
&lt;/select&gt;
</pre>
<p>e quatro simples funções, facilmente adaptáveis para o uso em outras situações:</p>
<pre class="prettyprint">
//1. Para passar todos os ítens da list de origem para a de destino:

function allLeft2Right() {
  var listOri = document.getElementById("listOrigem")
  var listDest = document.getElementById("listDestino");
  for(var i = 0; i < listOri.length; i++) {
    var opcao = listOri.options[i];
    var novaOpcao = new Option(opcao.text, listDest.length);
    novaOpcao.value = opcao.value;
    listOri.remove(i);
    try {
      listDest.add(novaOpcao,null);
    } catch (e) {
      listDest.add(novaOpcao);
    }
    i--;
  }
}

//2. função para passar todos os ítens do destino para a origem:

function allRight2Left() {
  var listOri = document.getElementById("listOrigem")
  var listDest = document.getElementById("listDestino");
  for(var i = 0; i < listDest.length; i++) {
    var opcao = listDest.options[i];
    var novaOpcao = new Option(opcao.text, listOri.length);
    novaOpcao.value = opcao.value;
    listDest.remove(i);
    try {
      listOri.add(novaOpcao,null);
    } catch (e) {
      listOri.add(novaOpcao);
    }
    i--;
  }
}

//3. Função para apenas os ítens selecionados da origem para o destino:

function left2Right() {
  var listOri = document.getElementById("listOrigem")
  var listDest = document.getElementById("listDestino");
  for(var i = 0; i < listOri.length; i++) {
    var opcao = listOri.options[i];
    if(opcao.selected) {
      var novaOpcao = new Option(opcao.text, listDest.length);
      novaOpcao.value = opcao.value;
      listOri.remove(i);
      try {
        listDest.add(novaOpcao,null); //Firefox
      } catch(e) {
        listDest.add(novaOpcao); //IE
      }
      i--;
    }
  }
}

//4. e por último, para passar os ítens marcados do destino para a origem

function right2Left() {
  var listOri = document.getElementById("listOrigem")
  var listDest = document.getElementById("listDestino");
  for(var i = 0; i < listDest.length; i++) {
    var opcao = listDest.options[i];
    if(opcao.selected) {
      var novaOpcao = new Option(opcao.text, listOri.length);
      novaOpcao.value = opcao.value;
      listDest.remove(i);
      try {
        listOri.add(novaOpcao,null);
      } catch (e) {
        listOri.add(novaOpcao);
      }
      i--;
    }
  }
}
</pre>
<p>Exemplo funcionando:</p>
<table>
<tr>
<td>
<select name="listOrigem" id="listOrigem" MULTIPLE size="10">
<option value="1">Porto Alegre</option><br />
<option value="2">São Paulo</option><br />
<option value="3">Rio de Janeiro</option><br />
<option value="4">Natal</option><br />
<option value="5">Fortaleza</option><br />
</select>
</td>
<td>
<input type="button" value="&gt;" onclick="left2Right();"/><br/><br/></p>
<input type="button" value="&gt;&gt;" onclick="allLeft2Right()"/><br/><br/></p>
<input type="button" value="&lt;&lt;" onclick="allRight2Left()"/><br/><br/></p>
<input type="button" value="&lt;" onclick="right2Left();"/><br/><br/>
</td>
<td>
<select name="listDestino" id="listDestino" MULTIPLE size="10">
</select>
</td>
</tr>
</table>
<p><script type="text/javascript">
function allLeft2Right() {
  var listOri = document.getElementById("listOrigem")
  var listDest = document.getElementById("listDestino");
  for(var i = 0; i < listOri.length; i++) {
    var opcao = listOri.options[i];
    var novaOpcao = new Option(opcao.text, listDest.length);
    novaOpcao.value = opcao.value;
    listOri.remove(i);
    try {
      listDest.add(novaOpcao,null);
    } catch (e) {
      listDest.add(novaOpcao);
    }
    i--;
  }
}
//2. função para passar todos os ítens do destino para a origem:
function allRight2Left() {
  var listOri = document.getElementById("listOrigem")
  var listDest = document.getElementById("listDestino");
  for(var i = 0; i < listDest.length; i++) {
    var opcao = listDest.options[i];
    var novaOpcao = new Option(opcao.text, listOri.length);
    novaOpcao.value = opcao.value;
    listDest.remove(i);
    try {
      listOri.add(novaOpcao,null);
    } catch (e) {
      listOri.add(novaOpcao);
    }
    i--;
  }
}
//3. Função para apenas os ítens selecionados da origem para o destino:
function left2Right() {
  var listOri = document.getElementById("listOrigem")
  var listDest = document.getElementById("listDestino");
  for(var i = 0; i < listOri.length; i++) {
    var opcao = listOri.options[i];
    if(opcao.selected) {
      var novaOpcao = new Option(opcao.text, listDest.length);
      novaOpcao.value = opcao.value;
      listOri.remove(i);
      try {
        listDest.add(novaOpcao,null); //Firefox
      } catch(e) {
        listDest.add(novaOpcao); //IE
      }
      i--;
    }
  }
}
//4. e por último, para passar os ítens marcados do destino para a origem
function right2Left() {
  var listOri = document.getElementById("listOrigem")
  var listDest = document.getElementById("listDestino");
  for(var i = 0; i < listDest.length; i++) {
    var opcao = listDest.options[i];
    if(opcao.selected) {
      var novaOpcao = new Option(opcao.text, listOri.length);
      novaOpcao.value = opcao.value;
      listDest.remove(i);
      try {
        listOri.add(novaOpcao,null);
      } catch (e) {
        listOri.add(novaOpcao);
      }
      i--;
    }
  }
}
</script></p>
<p>Agora é só vc adaptar. Se preferir que no OnDblClick no combo de origem passar para o destino, é só colocar no OnDblClick do listOrigem a chamada ao left2Right. Poderia criar dois botões também para passar todos os ítens de um campo para o outro.</p>
<p>Bom, espero ter ajudado. Muitas vezes já procurei um artigo como esse, com exemplos na WEB, porém não encontrei. Então fica aqui minha contribuição.</p>
]]></content:encoded>
			<wfw:commentRss>http://gujs.com.br/blog/2007/04/movendo-itens-entre-list-boxs/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Ordenando listas com Javascript</title>
		<link>http://gujs.com.br/blog/2007/03/ordenando-listas-com-javascript/</link>
		<comments>http://gujs.com.br/blog/2007/03/ordenando-listas-com-javascript/#comments</comments>
		<pubDate>Mon, 26 Mar 2007 18:26:01 +0000</pubDate>
		<dc:creator>Matheus Zeuch</dc:creator>
				<category><![CDATA[Cross-browser]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[Downloads e Exemplos]]></category>
		<category><![CDATA[Orientação à Objetos]]></category>
		<category><![CDATA[Tutoriais Avançados]]></category>

		<guid isPermaLink="false">http://gujs.com.br/blog/2007/03/ordenando-listas-com-javascript/</guid>
		<description><![CDATA[A classe SortableList é um pequeno exemplo de utilização de métodos DOM sendo utilizados para facilitar a ordenação de itens de uma lista.
Para utilizar a classe, basta importar o arquivo js e instanciar um objeto que estará associado à sua lista. Feito isso você pode criar seus próprios links para manipular os eventos de ordenação [...]]]></description>
			<content:encoded><![CDATA[<p>A classe <code>SortableList</code> é um pequeno exemplo de utilização de métodos DOM sendo utilizados para facilitar a ordenação de itens de uma lista.<span id="more-10"></span></p>
<p>Para utilizar a classe, basta importar o arquivo js e instanciar um objeto que estará associado à sua lista. Feito isso você pode criar seus próprios links para manipular os eventos de ordenação da lista (mover para cima ou para baixo). Veja o exemplo abaixo:</p>
<pre class="prettyprint">var bozo;

function init() { bozo = new SortableList($('list')); } //&lt;ul id="list"&gt;

window.onload = init;</pre>
<p>Ao instanciar o <code>SortableList</code> você também pode definir duas opções interessantes:</p>
<ul>
<li><strong>A primeira é o &#8220;rotate&#8221;</strong>, que define se os itens vão girar ou não (<code>true</code> ou <code>false</code>), ou seja, se o primeiro da lista vai para baixo quando o usuário clicar para cima, e vice-versa, quando o último item se torna o primeira ao clicar para baixo.</li>
<li><strong>E a segunda é o onComplete</strong>, onde você pode setar uma função que será executada toda vez que a lista for reordenada. Nesta função você pode, por exemplo, fazer uma requisição Ajax que salvará a ordenação no seu banco de dados, onde você pode, para isso, acessar o atributo &#8220;<code>list</code>&#8220;, que contém a lista ordenada.</li>
</ul>
<p><strong><a href="http://gujs.com.br/demo/sortable-list/">Exemplo</a></strong> | <strong><a href="http://gujs.com.br/blog/wp-content/uploads/2007/03/sortable-list.zip">Download</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://gujs.com.br/blog/2007/03/ordenando-listas-com-javascript/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.297 seconds -->
<!-- Cached page served by WP-Cache -->
