tadarank afiliados

Mostrando postagens com marcador ajax. Mostrar todas as postagens
Mostrando postagens com marcador ajax. Mostrar todas as postagens

06 outubro, 2008

Combo de estados e cidades em ajax - Seus problemas acabaram

Quer fazer aquela conhecida dupla de select's com os estados e, ao lado, as cidades respectivas mas está cansado de quebrar a cabeça?

Cansado de tentar entender ajax pra fazer isto?

Cansado de tentar organizar um banco de dados pra isto?

Cansado de aguardar o navegador carregar (loading) as mil cidades que têm?

SEUS PROBLEMAS SE ACABARAM-SE!!!

O grande DGMike fez um script espetacular que te poupará até de organizar o banco de dados com as cidades e estados. Já está tudo pronto.

Nas palavras do próprio:

Pensando nisso, resolvi escrever uma biblioteca que resolva este problema, além de estar disponível em uma única URL (hospedado no google) no qual qualquer um pode utilizar. Assim, o usuário guarda em cache apenas um arquivo, e se o usuário passar em um site que chama a biblioteca, no próximo site que ele entrar e usar a biblioteca de novo, carregará o arquivo em cache e não precisará fazer o download de novo.

Outra vantagem é que o arquivo possui os estados e cidades no próprio core, assim não é necessário de interação com o servidor, o que deixa a resposta ao usuário mais rápida, deixando-o satisfeito. Ah, e sem falar que ele é crossbrowser e funciona com (ou sem) todas as bibliotecas conhecidas (como jQuery, prototype, dojo ou mootools) por trabalhar com apenas as funções que já existem no javascript.

Pra usar, você só precisará incluir o arquivo javascript, fazer seus selects no html e chamar 1 (uma) função pra ativar o treco no onload. Muito simples e rápido. Eu vou usar.

Veja a solução do cara lá no blog dele: Combo de estados e cidades em ajax by DGMike

Gostou da dica acima? Então clica nos botões de compartilhamento abaixo e me ajude a dica a subir no Google.

28 dezembro, 2007

ajaxPost - submeter formulários via Post facilmente

Ae cidadãos e cidadoas,
Sei que ninguém vai ler essa parada hoje, mas Feliz Natal (atrazado, agora já era) e próspero ano novo. Pois é...
Bom, lembram-se quando eu fiz a velha e boa função pra ajax simples ajaxGet? Pois é...
Lembram-se que o malandro aqui prometeu fazer uma versão pra submeter formulários via 'Post' também? Pois é...
Passados mil anos, o atoa aqui ainda não fez. Mas teve uma boa alma, amigo da criançada, membro do Webly que fez: o Cráudio, ops Klawdyo.
A parada ficou beleza. Ainda não testei 100% pois resolvi usar este ânimo pra fazer logo uma nova função pra ajax ultra-simples.
Então quem quiser submeter formulários via post através de ajax já sabe: usem a ajaxPost do José Cláudio e do Micox. :)
Em breve uma nova função fácil pra ajax englobando submissão simples, de formulários, função de callback (retorno), etc, etc.
I'll be back!
Terminator - I'll be back Gostou da dica acima? Então clica nos botões de compartilhamento abaixo e me ajude a dica a subir no Google.

11 junho, 2007

Ajax Compilation - compilação de técnicas e ferramentas

Muito bão, compensa mesmo darem uma olhada: Ajax Compilation - compilação de técnicas e ferramentas

by Anieto2k

Gostou da dica acima? Então clica nos botões de compartilhamento abaixo e me ajude a dica a subir no Google.

05 junho, 2007

Ego moment

O brodi NGhorta me passou esta página da revista www.com.br deste mês pra eu dar uma bizuiada e ficar feliz:

Destes 2 citados aí, eu fiz o da acentuação.

Infelizmente, não fico 100% feliz pois não citaram os nomes dos autores. Mas nem tudo é perfeito né hehehe

Gostou da dica acima? Então clica nos botões de compartilhamento abaixo e me ajude a dica a subir no Google.

12 março, 2007

Upload Assíncrono (iframe como AJAX) - 1 função simples

Olá povo, conforme prometido, tô postando aqui uma função pra você fazer upload bem parecido com ajax (não é ajax!!). Função simples e fácil de usar.
Ela faz um upload assíncrono, ou seja, não recarrega a página toda (assim como o AJAX).
Quem usa alguns serviços do google como o GMail ou o GooglePages já conhece este recurso muito bem.

Editado 14/01/09: Já há uma nova versão disponível.
Veja em valeus.net/micox/micoxUpload2.htm (ainda não está muito bem testada).

Upload usando apenas AJAX não é viável no ambiente da Internet pois, por motivos de segurança, os navegadores por padrão não dão acesso ao sistema de arquivos para o JavaScript (se quiser descobrir como ativar esta característica não padrão, leia aqui, mas acredito não ser muito útil ajax upload dessa forma).

Esta minha função utiliza técnicas que envolvem iframes, mas não vou dar explicações aqui não. Explicações sobre como desenvolvi a função serão dadas em um novo post. Este post aqui é só para o código.

Ah, sim, no próximo post mostrarei também uma função um pouco mais customizável já pra quem entende melhor de JavaScript.

Testado no Firefox 2.0, Internet Explorer 6.0 e Opera 9.1. Pelamordedeus, quem puder testar em outros navegadores aí e quiser citar a experiência, faça este favor à humanidade e cite a experiência nos comentários. Obrigado.

1) Coloque o código abaixo em um arquivo chamado micoxUpload.js

/* funçõezinhas padrão pra facilitar */
function $m(quem){
 //apelido só pra não ficar repetindo o document.getElementById
 return document.getElementById(quem)
}
function remove(quem){
 quem.parentNode.removeChild(quem);
}
function addEvent(obj, evType, fn){
 //o velho do elcio.com.br/crossbrowser
    if (obj.addEventListener)
        obj.addEventListener(evType, fn, true)
    if (obj.attachEvent)
        obj.attachEvent("on"+evType, fn)
}
function removeEvent( obj, type, fn ) {
  if ( obj.detachEvent ) {
    obj.detachEvent( 'on'+type, fn );
  } else {
    obj.removeEventListener( type, fn, false ); }
} 
/* a que faz o serviço pesado */
function micoxUpload(form,url_action,id_elemento_retorno,html_exibe_carregando,html_erro_http){
/******
* micoxUpload - Submete um form para um iframe oculto e pega o resultado. Consequentemente pode
*               ser usado pra fazer upload de arquivos de forma assíncrona.
* Use a vontade mas coloque meu nome nos créditos. Licença Creative Commons.
* Versão: 1.0 - 03/03/2007 - Testado no FF2.0 IE6.0 e OP9.1
* Autor: Micox - Náiron JCG - elmicox.blogspot.com - micoxjcg@yahoo.com.br
* Parametros:
* form - o form a ser submetido ou seu ID
* url_action - url pra onde deve ser submetido o form
* id_elemento_retorno - id do elemento que irá receber a informação de retorno
* html_exibe_carregando - Texto (ou imagem) que será exibido enquanto se carrega o upload
* html_erro_http - texto (ou imagem) que será exibido se der erro HTTP.
*******/

 //testando se passou o ID ou o objeto mesmo
 form = typeof(form)=="string"?$m(form):form;
 
 var erro="";
 if(form==null || typeof(form)=="undefined"){ erro += "O form passado no 1o parâmetro não existe na página.\n";}
 else if(form.nodeName!="FORM"){ erro += "O form passado no 1o parâmetro da função não é um form.\n";}
 if($m(id_elemento_retorno)==null){ erro += "O elemento passado no 3o parâmetro não existe na página.\n";}
 if(erro.length>0) {
  alert("Erro ao chamar a função micoxUpload:\n" + erro);
  return;
 }

 //criando o iframe
 var iframe = document.createElement("iframe");
 iframe.setAttribute("id","micox-temp");
 iframe.setAttribute("name","micox-temp");
 iframe.setAttribute("width","0");
 iframe.setAttribute("height","0");
 iframe.setAttribute("border","0");
 iframe.setAttribute("style","width: 0; height: 0; border: none;");
 /* Não usei display:none pra esconder o iframe
    pois tem uma lenda que diz que o NS6 ignora
    iframes que tenham o display:none */
 
 //adicionando ao documento
 form.parentNode.appendChild(iframe);
 window.frames['micox-temp'].name="micox-temp"; //ie sucks
 
 //adicionando o evento ao carregar
/**** antigo que não funcionava no chrome
 var carregou = function() { 
   removeEvent( $m('micox-temp'),"load", carregou);
   var cross = "javascript: ";
   cross += "window.parent.$m('" + id_elemento_retorno + "').innerHTML = document.body.innerHTML; void(0); ";
   
   $m(id_elemento_retorno).innerHTML = html_erro_http;
   $m('micox-temp').src = cross;
   //deleta o iframe
   setTimeout(function(){ remove($m('micox-temp'))}, 250);
  }
*********/
//funfando no chrome graças ao Jhone turra
var iframeId = document.getElementById('micox-temp');
var carregou = function() {
window.document.getElementById( id_element ).innerHTML = iframeId.contentDocument.body.innerHTML;
}
 addEvent( $m('micox-temp'),"load", carregou)
 
 //setando propriedades do form
 form.setAttribute("target","micox-temp");
 form.setAttribute("action",url_action);
 form.setAttribute("method","post");
 form.setAttribute("enctype","multipart/form-data");
 form.setAttribute("encoding","multipart/form-data");
 //submetendo
 form.submit();
 
 //se for pra exibir alguma imagem ou texto enquanto carrega
 if(html_exibe_carregando.length > 0){
  $m(id_elemento_retorno ).innerHTML = html_exibe_carregando;
 }
 
}

2) Inclua (chame) este arquivo no seu HTML

<script type="text/javascript" src="micoxUpload.js"></script>

3) Os parâmetros na hora de chamar a função são:

  1. form - o form a ser submetido ou o ID de algum form que queira submeter.
  2. url_action - url pra onde deve ser submetido o form. Tem a mesma função do parâmetro "action" de um form.
  3. id_elemento_retorno - id do elemento que irá receber a informação de retorno.
  4. html_exibe_carregando - Texto (ou imagem) que será exibido enquanto se carrega o upload
  5. html_erro_http - Texto (ou imagem) que será exibido se der erro HTTP.

4) Pronto. Agora você várias formas de ativar o upload assíncrono. Vou exemplificar aqui 3 formas dentre as várias possíveis:

4.1) Uso básico. Você chama o upload a partir de um button (ou um input-type-button) em um form qualquer:

<legend>Uso b&aacute;sico</legend>
  <form>
    <input type="file" name="nome_qualquer" />
    <div id="recebe_up_basico" class="recebe">&nbsp;</div>
    <button onClick="micoxUpload(this.form,'upa.php','recebe_up_basico','Carregando...','Erro ao carregar'); return false;" type="button">testa</button>
  </form>
</fieldset>

4.2) Ativando o upload quando o campo file perde o foco (onblur):

<fieldset>
<legend>Uso no blur do input</legend>
  <form>
    <input type="file" name="nome_qualquer" onblur="micoxUpload(this.form,'upa.php','recebe_up_onblur','Carregando...','Erro ao carregar')" />
    <div id="recebe_up_onblur" class="recebe">&nbsp;</div>
  </form>
</fieldset>

4.3) Agora uma forma que deixará seu form/upload acessível mesmo que o javascript esteja desabilitado:

<fieldset>
<legend>Uso não intrusivo</legend>
    <form action="upa.php" target="_blank">
    <input type="file" name="nome_qualquer" onblur="micoxUpload(this.form,'upa.php','recebe_up_3','Carregando...','Erro ao carregar')" />
    <div id="recebe_up_3" class="recebe">&nbsp;</div>
  </form>
</fieldset>

Pronto. Customize aí agora e bora "uploadar". Bugs, erros, comenta ae.
Por favor, DÚVIDAS SOMENTE NO FÓRUM !!

No próximo post, a explicação e uma versão mais customizável pra quem já entende de JavaScript.

Gostou da dica acima? Então clica nos botões de compartilhamento abaixo e me ajude a dica a subir no Google.

08 dezembro, 2006

Trabalhar com XML usando JavaScript

Olá pessoal,

Hoje vou mostrar como trabalhar com XML usando apenas JavaScript (através de DOM).
Agente vê muito tutorial de XML com PHP, ASP, Java, etc, porém quase nenhum sobre JavaSript.

Ao final deste tutorial, você saberá manipular os dados de seu XML pra fazer um menu por exemplo, ou uma tabela, ou uma lista, puxar RSS, etc.

Um lembrete antes de iniciar: diferente das linguagens server-side (php, asp, etc), por motivo de segurança, o navegador não permite que você carregue qualquer arquivo que esteja fora de seu domínio, ou seja, nem adianta tentar carregar XML's ou RSS's de outros sites.

Editado em 19/12/06: Olha só outra forma interessante que eu achei no site da IBM (via MDC)

Postado também no fórum iEvolution.

Chega de papo, bora lá.

1. Fazendo um XML pro teste

(Se você já tem algum arquivo xml pode pular esta etapa)
Abra seu bloco de notas e coloque o seguinte conteúdo:

<?xml version="1.0" ?>
<pessoa>
   <identificacao id="1">
    <nome>Joao</nome>
    <email>joao@mail.com</email>
   </identificacao>
   <identificacao id="2">
    <nome familia="ze" data="2">Maria</nome>
    <email>maria@mail.com
    </email>
   </identificacao>
</pessoa>

Salve este arquivo com o nome de nomes.xml, por exemplo. Na mesma pasta deste arquivo xml, iremos criar nosso HTML que irá carregá-lo.

2) Carregando o XML

Os navegadores carregam um arquivo xml de formas diferentes. O IE usa ActiveX. Para o Firefox e Opera, iremos usar o XMLHttpRequest (o mesmo que se usa em ajax).

O código que irá retornar um objeto xml para os três navegadores citados é:

function xmlMicoxLoader(url){
  //by Micox: micoxjcg@yahoo.com.br.
    if(window.XMLHttpRequest){
        var Loader = new XMLHttpRequest();
        Loader.open("GET", url ,false);
        Loader.send(null);
        return Loader.responseXML;
    }else if(window.ActiveXObject){
        var Loader = new ActiveXObject("Msxml2.DOMDocument.3.0");
        Loader.async = false;
        Loader.load(url);
        return Loader;
    }
}

Perceba que tivemos que deixar o carregamento síncrono para que ao chegar na linha do "return" o carregamento já ter sido concluído.
Se você não sabe o que é modo síncrono ou assíncrono, no modo síncrono o script aguarda o carregamento antes de executar a próxima instrução. No modo assíncrono, o carregamento é feito em segundo plano e a execução das linhas continua indepentende de já ter chegado algum dado pelo open.
Para ler mais sobre estes modos (e suas consequências) veja esta parte do tutorial de ajax do Elcio do Tableless.com.br.

Se quiser mais informações sobre o responseXML, dê uma lida neste texto do Newton (blog Viche): a propriedade responseXML.

Pronto. Agora que agente já tem o objeto XML pra ser trabalhado, mãos à obra com o DOM.

3) Manipulando o XML

XML pode ser manipulado como se fosse um esquema de árvore através das rotinas do DOM, ou seja, pra trabalhar com o XML nós apenas manipularemos propriedades como childNodes, nodeType, nodeValue, firstChild e outras expressões bem comuns pra quem já mexeu com XML ou Javascript.

Na rotina que eu coloco abaixo, apenas faço um laço for que percorre todos os filhos do objeto XML retornado pela função xmlMicoxLoader.
A cada filho percorrido, eu pego o valor dele através de nodeValue, e os atributos através do array attributes[]. O nome dos elementos pode ser recuperado através de nodeName. Se determinado nó tem outros filhos, eu percorro estes filhos também e faço o mesmo. Bah, vá estudar DOM hehehe

Uma observação: o IE ignora os espaços em branco e não os interpreta como filhos. Eu acho isso bom. Porém o FF e o Opera, seguem os padrões e interpretam estes espaços em branco e Enter's como se fossem um elemento do tipo #text. Daí precisamos filtrar estes elementos testando o nodeType (elementos tem nodeType=1, textos tem nodeType=3).

Este exemplo apenas printa na tela o esquema XML feião mesmo. Mas já dá uma base pra você entender e trabalhar com o XML. Leia e entenda, isto é uma ordem:

function xmlMicoxArvore(xmlNode,identacao){
  //by Micox: micoxjcg@yahoo.com.br
    var arvoreTxt=""; //esta var armazenara o conteudo
    for(var i=0;i<xmlNode.childNodes.length;i++){//percorrendo os filhos do nó
  if(xmlNode.childNodes[i].nodeType == 1){//ignorar espaços em branco
   //pegando o nome do nó
   arvoreTxt = arvoreTxt + identacao + xmlNode.childNodes[i].nodeName + ": "
   if(xmlNode.childNodes[i].childNodes.length==0){
    //se não tiver filhos eu já pego o nodevalue
    arvoreTxt = arvoreTxt + xmlNode.childNodes[i].nodeValue 
    for(var z=0;z<xmlNode.childNodes[i].attributes.length;z++){
     var atrib = xmlNode.childNodes[i].attributes[z];
     arvoreTxt = arvoreTxt + " (" + atrib.nodeName + " = " + atrib.nodeValue + ")";
    }
    arvoreTxt = arvoreTxt + "<br />\n";
   }else if(xmlNode.childNodes[i].childNodes.length>0){
    //se tiver filhos eu tenho que pegar o valor pegando o valor do primeiro filho
    arvoreTxt = arvoreTxt + xmlNode.childNodes[i].firstChild.nodeValue;
    for(var z=0;z<xmlNode.childNodes[i].attributes.length;z++){
     var atrib = xmlNode.childNodes[i].attributes[z];
     arvoreTxt = arvoreTxt + " (" + atrib.nodeName + " = " + atrib.nodeValue + ")";
    }
    //recursividade para carregas os filhos dos filhos
    arvoreTxt = arvoreTxt + "<br />\n" + xmlMicoxArvore(xmlNode.childNodes[i],identacao + "> > ");
   }
      }
    }
    return arvoreTxt;
}

Agora é só chamar as funções:

xml = xmlMicoxLoader("nomes.xml"); //carrega o xml
document.write(xmlMicoxArvore(xml,"")); //printa a árvore na tela 

4) Carregando um RSS

Bom, o exemplo anterior não é muito útil não né? Serve só pra você aprender.
Vamo mostrar um exemplo mais útil: uma função que carrega um RSS de seu próprio site.

function xmlMicoxRSS(xmlNode){
 //by Micox: http://elmicox.blogspot.com
 var retorno = "";
 var objNodeList = xmlNode.getElementsByTagName("item")
 for(var i=0;i<objNodeList.length;i++){
  var strTitulo = ""
  var strURL = ""
  var strDescr = ""
  var objNode = objNodeList[i];
  if(objNode.nodeType == 1){//ignorar espaços em branco
   for(var j=0;j<objNode.childNodes.length;j++){
    var objNode2 = objNode.childNodes[j];
    if(objNode2.nodeType == 1){//ignorar espaços em branco
     switch (objNode2.nodeName) {
      case "title": 
       //alert(objNode.childNodes[j].firstChild.nodevalue);
       strTitulo = objNode2.firstChild.nodeValue; 
       break;
      case "link": 
       strURL = objNode2.firstChild.nodeValue; 
       break;
      case "description": 
       strDescr = objNode2.firstChild.nodeValue; 
       break;
     }
    }
   }
   retorno += " <li><a href='" + strURL + "'>" + strTitulo + "</a><br />" + strDescr + "</li>\n";
  }
 }
 retorno = "<ul>\n" + retorno + "</ul>";
 return retorno;
}

Agora é só jogar o resultado na sua div:

xml = xmlMicoxLoader("rss.xml"); //carrega o xml
document.getElementById(div_alvo).innerHTML = xmlMicoxRSS(xml); //lista o rss

Editado 12/12/06: O Bernardo Rufino fez outro ótimo exemplo de como se trabalhar com XML e Javascript: Criando Gráficos Dinamicamente com Ajax e XML

5) Conclusão

Pronto. Agora acho que você já tem uma base para trabalhar com XML no JavaScript da mesma forma que faz com outras linguagens.
Pra ficar bão mermo, repito, estude DOM, nem venha me fazer perguntas básicas sobre isso. :-)
Dúvidas ou se tiver algum bug aí é só me falar.

Ó, tô desestimulado de ficar escrevendo estes tutoriais gigantescos, postando notícias no blog, etc. Ninguém comenta nessa bagaça. Então comenta aí caramba.

Té a próxima.

Gostou da dica acima? Então clica nos botões de compartilhamento abaixo e me ajude a dica a subir no Google.

27 novembro, 2006

AJAX - botão voltar: A solução

Olá povo,

Hoje vim falar de um problema que atormenta o pessoal que usa ajax sem moderação (variação da utilização do ajax onde os desenvolvedores praticamente jogam fora a tag <a> - aqui outra ótima explicação do termo by JulioGreff): O maldito problema do botão voltar que não funciona com ajax.

Bom, como eu e o Julio já falamos, Ajax não foi feito pra reinventar o sistema de links, mâaas o pessoal que ainda insiste em usar o ajax dessa forma têm uma dúvida existencial: como é que o danado do Gmail faz pro tal botão "voltar" funfar?

Várias soluções já foram propostas: soluções complicadas, soluções gringas, soluções envolvendo server-side, soluções que funcionam só no IE, que só funcionam no FF, etc.

Porém agora, após uma longa briga travada por 3 paladinos do ajax (Bernardo Rufino, Julio Greff e Cau Guanabara), parece que finalmente está saindo uma solução definitiva: Solução simples para o Botão Voltar do Ajax, Cross Browser.

Texto da postagem do Bermonruf:

Começou tudo aqui, pelo menos para mim. Eu criei uma gambiarra feia e suja que só funcionava no Firefox, aí o JulioGreff criou uma (não gambiarra!) com a mesma lógica, só que beeeeeeeeemm mais simples e objetiva, porém ainda não funcionava no nosso amiguinho IE. Depois o Cau Guanabara criou uma solução baseada nesta página que apesar de bem objetiva tinha código pra caramba, o Júlio criou uma bem parecida e mais simples, e eu lá só vendo no que ia dar. Depois disso tudo, achei que ainda dava pra simplificar mais. Resolvi analisar a página que o Cau Guanabara passou, nem rolei a barra de rolagem e fui para , a solução dos utilizadores de Flash. Aí fiz uns desenhos, isso mesmo, não pra layout não, e consegui uma solução rápida, simples, não necessita linguagem server-side, e Cross Browser (Testada no Opera, IE e Firefox).

Este macaco aqui não participou da brincadeira hheeh.
Bom, chega. Já falei demais. Visita a página com a solução e a página com os códigos.
Lá na página com a solução tem a tabela de compatibilidade dos navegadores e o link para os screenshots.

Té. Adiós.

Gostou da dica acima? Então clica nos botões de compartilhamento abaixo e me ajude a dica a subir no Google.

19 outubro, 2006

Ajax - Use com moderação

Opa povo,

Quem frequenta o fórum iEvolution ou deu uma passada no Ajaxonline já deve ter lido este artigo. Para os visitantes do meu blog, transcrevo o texto completo abaixo :)

 

Bom, esta postagem está mais para um guia de boas maneiras no uso do AJAX do que para um tutorial propriamente dito.

Diversos programadores atuais, na euforia da Web 2 estão colocando AJAX em todo lugar: em links comuns, em menus, etc. Isto não é necessário. Isto é errado!
O navegador JÁ cuida dos links para nós. Não vamos re-inventar a roda.

Gostaria de lembrar a todos que AJAX não surgiu para substituir a barra de endereços no navegador e muito menos para complicar a vida do usuário impedindo acesso à links.
Ele surgiu para melhorar a experiência do usuário, impedindo reloads de página desnecessários, e para facilitar a vida do programador.

Não usem AJAX só por modismos. Não usem Ajax ao extremo. Usem com moderação.

Você deve planejar TODO o seu site como se a tecnologia AJAX não existisse, para só depois facilitar a vida do usuário incluindo os recursos em AJAX em locais como formulários, previsualizações, etc.

Se for fazer um menu, por exemplo, os links deste devem estar completamente disponíveis mesmo se o javascript do navegador do visitante estiver desativado.
Sim, é difícil eu sei, mas isto é deixar seu site acessível.

Não podemos nos esquecer também, que os usuários adoram recursos como "Favoritos" do navegador.

- Se o seu link não estiver disponível na barra de endereços, como o usuário poderá adicionar aquele seu artigo aos seus favoritos?
- Aos seu del.icio.us?
- Como poderá indicar o artigo para um amigo?
- Como poderá colocar um link para seu artigo no blog dele?
- Como poderá colocar um link em um fórum, por exemplo.

E o principal:
- COMO O GOOGLE ENCONTRARÁ SEU ARTIGO ???

Bom, caso eu não tenha te convencido, e você continue desejando usar o modismo do AJAX ao extremo, faça pelo menos de uma forma que o href ainda esteja com o endereço certo.
Assim será possível, tanto para o Google quanto para quem quiser abrir o link em nova janela/aba, chegarem até o destino.

<a href="http://elmicox.blogspot.com/" target="_blank" onclick="carregaAJAX(this.href); return false;">link menos mal</a>

Este truque consiste em deixar o endereço correto no link, porém cancela-lo com o return:false no onclick. Teste-o.

Enfim, a base da internet são os links. Não acabe com eles por modismos

Leia mais:
10 lugares onde usar (e não usar) AJAX - VS solutions
Link tem que ser link - El Micox
Javascript não obstrusivo - Busca no google

Gostou da dica acima? Então clica nos botões de compartilhamento abaixo e me ajude a dica a subir no Google.

02 junho, 2006

Ajax - Acentuação, a solução final - 1 linha de código

Nota do Autor após ler o tutorial depois de 2 anos: Este tutorial não presta, contem inverdades e enganos. Nem sempre ele funciona. Talvez ele dê certo pra você.

Atenção: Este artigo trata dos problemas de acentuação na RECUPERAÇÃO de um conteúdo via AJAX e NÃO do envio via métodos GET ou POST. Para o tratamento de problemas no ENVIO, veja esta solução (no sub-capítulo "Recebendo os dados (no PHP)".

Uma análise completa de como se comporta cada navegador nos diferentes tipos de requisição GET/POST, UTF-8/ISO-8859-1 DEVE ser lida aqui no blog do nghorta.

Dúvidas, postem no fórum... Comentários e testes, comentem aqui no blog mesmo.

Explicação:

O XMLHttpRequest, a criança por trás do ajax, trabalha no padrão UTF-8 por default, tanto pra enviar dados quanto pra receber. Isso vem do próprio browser mesmo. Nos primórdios da internet, o Tim Berners-Lee ainda não estava tão preocupado com a internacionalização do HTML. Este esforço só começou a acontecer em novembro de 1995, depois da formação da W3C, onde visavam extender as capacidades do HTML 2 (falarei disso no histórico do HTML que estará presente no meu TCC). Por este motivo o Ajax dá vários problemas com nossos caracteres.

Para tentar resolver este problema, já ví muitas viagens, que usam gambiarras de encode, escape, etc. nos scripts do lado do servidor (asp, php, jsp, etc). Uma complicação só!!!

Em minhas pesquisas, descobri que a forma correta de renderizar nosso português é simplesmente usando o charset ISO-8859-1 e não o UTF-8. Simples assim. Você deve enviar cabeçalhos pro navegador, informando que você usará ISO-8859-1. Agora é só você configurar seu servidor pra servir ISO-8859-1 por padrão, se você tiver acesso a isto (eu não pesquisei como se faz isso, pesquisem aí quem se interessar) OU indicar o charset no início do seu script server side, com apenas 1 (uma) linha de código!! -- Me perdoem o "servidor pra servir", é que não achei outros termos. :)

"Chega de enrolação mico, e mostra logo comé que faz. Você prometeu que este blog ia ser de coisas práticas..."

O código:

  • ASP:

    <% Response.Charset="ISO-8859-1" %>

  • PHP:

    <?php header("Content-Type: text/html; charset=ISO-8859-1",true) ?>

  • JSP:

    <%@ page contentType="text/html; charset=ISO-8859-1" %>

Lembrando que os códigos devem ser colocados no início de seu script (pra quem tem pouca experiência com a linguagem). Testado com sucesso no IE6 e FF1.5, quem puder testar em outros browsers, ou colocar seu testemunho aqui dizendo se funcionou ou não...

Você também pode tentar usar só a tag META em arquivos HTML simples, mas eu não consegui fazer dar certo, se alguém souber o porque, comenta ae... <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

Ah, dizem as lendas da mozilla.org que o responseXML interpreta corretamente o charset. Ou seja, se você for usar o responseXML, não se preocupe com isso. Eu não testei e não posso opinar sobre o assunto. Se você tiver testado, comente aqui.

<editado data="27/06/06">
Colocando aqui o comentário do Ederson sobre o responseXML (valeu Ederson):

...o responseXML interpreta certo sim (testei no Opera 9 e no Firefox 1,5), exceto no IE. Com a sua linha, até o IE aceitou o charset e mostrou os acentos.
</editado>/

Observações finais:

Gostaria de lembrar que esta solução que encontrei foi para a recuperação da página no servidor e não para o envio de dados via ajax! A melhor solução que eu achei para o envio dos dados na net foi esta aqui (no sub-capítulo "Recebendo os dados (no PHP)". Ah, pode ser que seu problema também esteja sendo gerado pelo banco de dados. Alguns BD's, guardam seus dados apenas em UTF-8, e aí há a perda de caracteres. Verifique isso também se meu código acima não deu retorno.

É isso aí. Como eu já disse: Dúvidas, postem no fórum... Comentários e testes, comentem aqui no blog mesmo.

Gostou da dica acima? Então clica nos botões de compartilhamento abaixo e me ajude a dica a subir no Google.

26 maio, 2006

Link tem que ser link

Malditas popups, malditos falsos links, MALDITAS POPUPS!!!! AARRRGHHH!

Pronto, acalmei. Bom, hoje vou sair um pouco do objetivo deste blog (só hoje hehe), que prometi NÃO ficar viajando nem divagando, mas sim, mostrando soluções práticas. É que estas malditas popups e falsos links me tiram do sério. Não, não me venham dizer pra baixar anti-popups. Sim, é lógico que eu uso o FF.

A questão que eu to levantando agora é daqueles malditos links que você pensa que é link, mas na verdade, lá na barra de rolagem tem escrito um maldito "javascript:open...blablabla...". Quais as consequências disso? Bom, a consequencia é que o usuário não consegue acessar aquele conteúdo abrindo sua própria aba, (ou janela pra quem ainda não evoluiu), entre outros problemas. Desta maldita forma, eu SOU OBRIGADO a abrir a maldita popup (a não ser que faça alguns truques trabalhosos).

Coincidentemente, ontem eu tinha lido um post no fatorW dizendo que os usuários tem que poder usar o site, onde o cara fala muito bem sobre usabilidade básica.
Eu quero apenas abrir o link em outra aba, só isso... Por que eles (e eles, e vários outros 'eles') não me deixam???

Os "infográficos" do Terra são uma piada. Pra quê popup naquilo meu deus??!?!!! Alguns usam as malditas popups pra "tentar" esconder o endereço real do visitante, ou pra configurar a janela, mas os do Terra... O endereço real tá à mostra. E a configuração de tela deles as vezes até esconde o conteúdo com uma barra de rolagem... Realmente algo sem motivo. E o do noblat (na parte da enquete), pra quê popup naquela enquete minha gente???

Por favor my friends, não cometam este pecado mortal... Desvantagem das popups dessa forma eu não preciso nem falar né?

  • Ganhará o ódio de alguns de seus visitantes (como eu)
  • Usabilidade baixa
  • Acessibilidade baixa
  • Mecanismos buscadores??? Ferrou-se
  • Browsers sem javascript??? Ferrou-se
  • Dificuldade do seu usuário colocar aquela página nos favoritos
  • etc, etc, etc...
Caso realmente seja necessário usar uma popup (não podemos generalizar, há alguns projetos em que popups realmente são necessárias), use com moderação e com algumas técnicas pra reduzir as desvantagens citadas acima:

Não coloque seu javascript direto no href do link. O href do link deve ser usado pra colocar o endereço da página. Assim seu usuário conseguirá abrir seu popup em outra aba diboas e não morrerá de ódio da sua página; os mecanismos de busca conseguirão chegar lá...; browsers sem javascript conseguirão chegar lá...; novamente etc, etc, etc...

"Mas micão, assim ele deixa de ser popup!". Calma meu filho, minha filha, muitos já escreveram sobre isso (no momento não lembro de nenhum link pra recomendar), mas é só colocar um javascriptzinho no "onclick" do link que abre seu popup.

Comparando:

<script>
function abrePopup(url){
    janela=window.open(url,'janela','width=400,height=500,top=100,left=100,resizable=yes')
}
</script>

<a href="javascript:abrePopup('http://elmicox.blogspot.com/');" >link maldito </a>
<a href="http://elmicox.blogspot.com/" target="_blank" onclick="abrePopup(this.href);return false;">link beleza</a>

Acho que não preciso explicar o código acima não né? Tá bem simples. No primeiro link, temos o exemplo maldito, onde você ferra com seu link. Percebam as coisas "bonitas" que aparecem na barra de status no link maldito.

No segundo exemplo, temos um link "menos mal". O href tá certo, abrindo em um novo target pra quem não quer o popup. Mas se o cara clicar normalmente, o evento onclick é disparado, a popup é aberta com o endereço do link (this.href) e o link é cancelado (return false). Testem aí e vejam. (Não vou entrar em detalhes de javascript não obstrusivo (Unobtrusive JavaScript) aqui não, to com pressa, e muita gente já falou sobre isso. Meu script tá errado nesse ponto sim, preguiça... hhehe)

Teste ele aqui: link maldito ; link beleza

Melhorando ainda mais... Voce poderia também marcar os links que são popup com uma classe daí colocaria os eventos nele através do attachEvent, e colocar uma estilização diferente nele pra seu visitante saber que se trata de uma popup, colocar uma figurinha ao lado do link, etc... Ficaria bonitim. heheh.

É isso aí povo. Té mais...

Gostou da dica acima? Então clica nos botões de compartilhamento abaixo e me ajude a dica a subir no Google.

19 maio, 2006

Ajax - Função rápida e simples

Ae povo,
Vou começando devagar aqui no blog. Tô meio sem tempo por causa do "bendito" TCC, por isso vou postando soluções que eu já desenvolvi lá no fórum Imasters mas que não tiveram a merecida atenção. heheh
ATUALIZAÇÃO: Vejam a versão nova do script (que também permite post) aqui

Bom, primeiramente vou postar algo que vai ajudar muito quem deseja parar de se preocupar com ajax.
Com esta minha função você não vai mais ficar se preocupando com instanciar, definir eventos de retorno, e toda aquela baboseira chata de 10 linhas que agente sempre tem que fazer na hora de usar o XMLHttpRequest.
Usem, testem e se tiverem algo a acrescentar, é só falar. Eu testei com sucesso no FF1.5 e no IE6.
Vantagens:
  1. Voce não precisa se preocupar com ficar instanciando ou coisa parecida. É só chamar a ajaxGet.
  2. Carrega também scripts javascript que vieram por ajax (exceto funções). Créditos para o skywalker.TO.
  3. Permite que voce carregue mais de um elemento ao mesmo tempo assincronamente.
  4. Permite que voce jogue o resultado da url em:
    • uma variável javascript,
    • diretamente no innerHTML de um elemento,
    • em um input
    • em um select sem se preocupar com nada.
  5. Você não precisa mais ficar se preocupando com a questão do cache.

  • Versão atual: 1.2
  • Atualizações futuras:
    • Melhorar o carregamento de javascripts que vierem pelo ajax usando a solução do pita.
    • Melhorar a parte de enviar caracteres acentuados usando o encodeURI
  • Forma de uso:
    • Coloque a função em um arquivo javascript e chame ele na página através do <script src="micoxAjax.js">
    • Chame a função assim: ajaxGet( sua_pagina [string] , variavel_ou_objeto_que_recebera_o_retorno [string ou object] , exibe_texto_carregando_ou_nao [true ou false])
  • Exemplos de uso:
    • Em um elemento qualquer: ajaxGet("http://www.suapagina.com/seuarquivo.htm",document.getElementById("div1"),true)
    • Em uma variável javascript: ajaxGet("http://localhost/lojavirtualfree/optionas.htm","document.getElementById('div2').innerHTML",false)
    • Em um input text: ajaxGet("http://localhost/lojavirtualfree/optionas.htm",document.getElementById("input1"),false)
    • Em um select (preenche com options): ajaxGet("http://localhost/lojavirtualfree/optionas.htm?viva",document.getElementById("select1"),true)
Enfim, a função. Copiem e colem ela em seu micoxAjax.js:
function ajaxGet(url,elemento_retorno,exibe_carregando){
/******
* ajaxGet - Coloca o retorno de uma url em um elemento qualquer
* Use a vontade mas coloque meu nome nos créditos. Dúvidas, me mande um email.
* A função é grande, coloque-a em um arquivo .js separado.
* Versão: 1.2 - 20/04/2006
* Autor: Micox - Náiron J.C.G - micoxjcg@yahoo.com.br - elmicox.blogspot.com
* Parametros:
* url: string; elemento_retorno: object||string; exibe_carregando:boolean
*  - Se elemento_retorno for um elemento html (inclusive inputs e selects),
*    exibe o retorno no innerHTML / value / options do elemento
*  - Se elemento_retorno for o nome de uma variavel
*    (o nome da variável deve ser declarado por string, pois será feito um eval)
*    a função irá atribuir o retorno à variável ao receber a url.
*******/
   var ajax1 = pegaAjax();
   if(ajax1){
       url = antiCacheRand(url)
       ajax1.onreadystatechange = ajaxOnReady
       ajax1.open("GET", url ,true);
       //ajax1.setRequestHeader("Content-Type", "text/html; charset=iso-8859-1");//"application/x-www-form-urlencoded");
       ajax1.setRequestHeader("Cache-Control", "no-cache");
       ajax1.setRequestHeader("Pragma", "no-cache");
       if(exibe_carregando){ put("Carregando ...")    }
       ajax1.send(null)
       return true;
   }else{
       return false;
   }
   function ajaxOnReady(){
       if (ajax1.readyState==4){
           if(ajax1.status == 200){
               var texto=ajax1.responseText;
               if(texto.indexOf(" ")<0) texto=texto.replace(/\+/g," ");
               //texto=unescape(texto); //descomente esta linha se tiver usado o urlencode no php ou asp
               put(texto);
               extraiScript(texto);
           }else{
               if(exibe_carregando){put("Falha no carregamento. " + httpStatus(ajax1.status));}
           }
           ajax1 = null
       }else if(exibe_carregando){//para mudar o status de cada carregando
               put("Carregando ..." )
       }
   }
   function put(valor){ //coloca o valor na variavel/elemento de retorno
       if((typeof(elemento_retorno)).toLowerCase()=="string"){ //se for o nome da string
           if(valor!="Falha no carregamento"){
               eval(elemento_retorno + '= unescape("' + escape(valor) + '")')
           }
       }else if(elemento_retorno.tagName.toLowerCase()=="input"){
           valor = escape(valor).replace(/\%0D\%0A/g,"")
           elemento_retorno.value = unescape(valor);
       }else if(elemento_retorno.tagName.toLowerCase()=="select"){       
           select_innerHTML(elemento_retorno,valor)
       }else if(elemento_retorno.tagName){
           elemento_retorno.innerHTML = valor;
           //alert(elemento_retorno.innerHTML)
       }   
   }
   function pegaAjax(){ //instancia um novo xmlhttprequest
       //baseado na getXMLHttpObj que possui muitas cópias na net e eu nao sei quem é o autor original
       if(typeof(XMLHttpRequest)!='undefined'){return new XMLHttpRequest();}
       var axO=['Microsoft.XMLHTTP','Msxml2.XMLHTTP','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.4.0','Msxml2.XMLHTTP.3.0'];
       for(var i=0;i<axO.length;i++){ try{ return new ActiveXObject(axO[i]);}catch(e){} }
       return null;
   }
   function httpStatus(stat){ //retorna o texto do erro http
       switch(stat){
           case 0: return "Erro desconhecido de javascript";
           case 400: return "400: Solicitação incompreensível"; break;
           case 403: case 404: return "404: Não foi encontrada a URL solicitada"; break;
           case 405: return "405: O servidor não suporta o método solicitado"; break;
           case 500: return "500: Erro desconhecido de natureza do servidor"; break;
           case 503: return "503: Capacidade máxima do servidor alcançada"; break;
           default: return "Erro " + stat + ". Mais informações em http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html"; break;
       }
   }
   function antiCacheRand(aurl){
       var dt = new Date();
       if(aurl.indexOf("?")>=0){// já tem parametros
           return aurl + "&" + encodeURI(Math.random() + "_" + dt.getTime());
       }else{ return aurl + "?" + encodeURI(Math.random() + "_" + dt.getTime());}
   }
}
function select_innerHTML(objeto,innerHTML){
/******
* select_innerHTML - altera o innerHTML de um select independente se é FF ou IE
* Corrige o problema de não ser possível usar o innerHTML no IE corretamente
* Veja o problema em: http://support.microsoft.com/default.aspx?scid=kb;en-us;276228
* Use a vontade mas coloque meu nome nos créditos. Dúvidas, me mande um email.
* Versão: 1.0 - 06/04/2006
* Autor: Micox - Náiron J.C.G - micoxjcg@yahoo.com.br - elmicox.blogspot.com
* Parametros:
* objeto(tipo object): o select a ser alterado
* innerHTML(tipo string): o novo valor do innerHTML
*******/
   objeto.innerHTML = ""
   var selTemp = document.createElement("micoxselect")
   var opt;
   selTemp.id="micoxselect1"
   document.body.appendChild(selTemp)
   selTemp = document.getElementById("micoxselect1")
   selTemp.style.display="none"
   if(innerHTML.toLowerCase().indexOf("<option")<0){//se não é option eu converto
       innerHTML = "<option>" + innerHTML + "</option>"
   }
   innerHTML = innerHTML.replace(/<option/g,"<span").replace(/<\/option/g,"</span")
   selTemp.innerHTML = innerHTML
   for(var i=0;i<selTemp.childNodes.length;i++){
       if(selTemp.childNodes[i].tagName){
           opt = document.createElement("OPTION")
           for(var j=0;j<selTemp.childNodes[i].attributes.length;j++){
               opt.setAttributeNode(selTemp.childNodes[i].attributes[j].cloneNode(true))
           }
           opt.value = selTemp.childNodes[i].getAttribute("value")
           opt.text = selTemp.childNodes[i].innerHTML
           if(document.all){ //IEca
               objeto.add(opt)
           }else{
               objeto.appendChild(opt)
           }                   
       }   
   }
   document.body.removeChild(selTemp)
   selTemp = null
}

function extraiScript(texto){
//Maravilhosa função feita pelo SkyWalker.TO do imasters/forum
//http://forum.imasters.com.br/index.php?showtopic=165277&
   // inicializa o inicio ><
   var ini = 0;
   // loop enquanto achar um script
   while (ini!=-1){
       // procura uma tag de script
       ini = texto.indexOf('<script', ini);
       // se encontrar
       if (ini >=0){
           // define o inicio para depois do fechamento dessa tag
           ini = texto.indexOf('>', ini) + 1;
           // procura o final do script
           var fim = texto.indexOf('</script>', ini);
           // extrai apenas o script
           codigo = texto.substring(ini,fim);
           // executa o script
           //eval(codigo);
           /**********************
           * Alterado por Micox - micoxjcg@yahoo.com.br
           * Alterei pois com o eval não executava funções.
           ***********************/
           novo = document.createElement("script")
           novo.text = codigo;
           document.body.appendChild(novo);
       }
   }
}
A função oi postada originalmente aqui, com as devidas discussões e atualizações iniciais. Agora postei ela aqui, onde devem prosseguir as discussões.
Té mais... Gostou da dica acima? Então clica nos botões de compartilhamento abaixo e me ajude a dica a subir no Google.

Resultado! Concursos