ajaxPost - submeter formulários via Post facilmente

Posted by micox at Dezembro 28th, 2007

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

Posted in ajax, funções, javascript| 9 Comments | 

Ajax Acentuação - 1 linha de código

Posted by micox at Junho 26th, 2007

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)”.

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&gt/

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.

Posted in ajax, funções, javascript| 4 Comments | 

Link tem que ser link

Posted by micox at Junho 26th, 2007

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…

Posted in ajax, bate-papo, dicas, javascript, webstandards| 4 Comments | 

Ajax - Função rápida e simples

Posted by admin at Março 23rd, 2007

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
Agora o fórum da vez é o iEvolution. Postei esta solução lá. Visitem e tirem suas dúvidas sobre ela lá.

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…

Posted in ajax, javascript| 3 Comments | 

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

Posted by admin at Março 12th, 2007

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.

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
 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);
  }
 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.

Posted in ajax, javascript| 1 Comment |