Categoria: Javascript

Feed desta categoria: javascript

Um exemplo, porque vivo esquecendo.

$.ajax({
  dataType: 'json'
  ,url: url
  ,data: form.serialize()
  ,method:'POST'
  ,success: function(data){
    sucesso(data);
  }
  ,error: function(jqXHR, textStatus, errorThrown){

  }
  ,complete: function(){
    $('#carregando').slideUp();
  }
});

Um plugin simples para utilizar a função hasAttr com jQuery, que funciona do mesmo jeito que hasClass.

$.fn.hasAttr = function(name) { return this.attr(name) !== undefined; };

assim:
 $.validator.addMethod(  
      "date",  
      function(value, element) {  
           var check = false;  
           var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;  
           if( re.test(value)){  
                var adata = value.split('/');  
                var gg = parseInt(adata[0],10);  
                var mm = parseInt(adata[1],10);  
                var aaaa = parseInt(adata[2],10);  
                var xdata = new Date(aaaa,mm-1,gg);  
                if ( ( xdata.getFullYear() == aaaa ) && ( xdata.getMonth () == mm - 1 ) && ( xdata.getDate() == gg ) )  
                     check = true;  
                else  
                     check = false;  
           } else  
                check = false;  
           return this.optional(element) || check;  
      },  
      "Insira uma data válida"  
 );  
 


Quando, por motivos pré-históricos, for necessário trabalhar com iframes ou frames, acontece um problema se o link onde o (pobre) usuário clicar estiver muito pra baixo, na tela.

O problema é que a página carrega no iframe/frame, mas a tela continua lá embaixo. Então o usuário tem que rolar a página pra cima, pra ver o inicio do frame (a menos que o programador tenha pensado nisso e colocado os controles na parte de baixo do frame, o que eu duvido muito que alguém faça, mas vai saber).

Pra fazer com que o frame role automaticamente pra cima, quando abrir, é só colocar esse código em algum lugar na página:


<script>
 parent.scrollTo(0, 0);
</script>


 

Ontem, precisei de uma função em javascript pra tirar acentos e caracteres especiais de textos, tipo essa que o wordpress faz quando vamos criar um novo post.
O problema não era só trocar os caracteres especiais por traços, e sim trocar as letras acentuadas pelas respectivas sem acentos. Acabei achando  nesse blog o que eu precisava pra fazer essa parte.
O resto foi com expressões regulares.
A função ficou assim:
function limpar(texto)
{
 texto = texto.replace(/^\s+|\s+$/g, "");//tira espaços do inicio e do fim
 texto = texto.replace(/\s{2,}/g, " ");//tira espaços duplicados
 
 replacements = {
  "[áãàäâª]": "a",
  "[éèëê]": "e",
  "[íìï]": "i",
  "[óòôõö]": "o",
  "[ùúûü]": "u",
  "[ç]": "c"
 };
 regex = {};
 for (key in replacements) {
   regex[key] = new RegExp(key, 'g');
 }

 for(key in replacements){
   texto = texto.replace(regex[key], replacements[key]);//tira caracteres acentuados
 }
 texto = texto.replace(/[^A-Za-z0-9]/g, "-");//tira caracteres especiais
 texto = texto.toLowerCase();//coloca em minusculo
 return texto;
}

Ás vezes precisamos alterar uma função que já existe, adicionando mais parâmetros.
Pra não quebrar a compatibilidade com outras partes do sistema que estejam usando a função, e pra não precisar revisar tudo pra encontrar as chamadas à tal função,  o jeito é criar os novos parâmetros como opcionais.

 function war(enemy,reason) {  
      if(!enemy) { //The mandatory argument is not present - die with error(no pun intended)  
           alert("Please choose an enemy before starting a war");  
           return false;  
      }  
      if(!reason) { //If the optional argument is not there, create a new variable with that name.  
           var reason = "They have Nukes!";  
      }  
      /* ...Do what you want with the arguments... */  
 }  
Fonte: http://www.openjs.com/articles/optional_function_arguments.php

Tive problemas com o comando parseInt no firefox.
Algumas vezes ele não retornava o valor certo, mas  sim retornava 0.
Executando isso no console do Firebug, retornou algo estranho:

 console.log(parseInt('01'));  
 console.log(parseInt('02'));  
 console.log(parseInt('03'));  
 console.log(parseInt('04'));  
 console.log(parseInt('05'));  
 console.log(parseInt('06'));  
 console.log(parseInt('07'));  
 console.log(parseInt('08'));  
 console.log(parseInt('09'));  
 console.log(parseInt('010'));  

Retornou isso:
 1  
 2  
 3  
 4  
 5  
 6  
 7  
 0 //não deveria ser 8, 9 e 10?
 0  
 8  

Segundo essse link, isso acontece porque o navegador está retornando esse valor em base 8, e não base 10.
Pra resolver isso, precisamos dizer a ele pra usar base 10:
 console.log(parseInt('01','10'));  
 console.log(parseInt('02','10'));  
 console.log(parseInt('03','10'));  
 console.log(parseInt('04','10'));  
 console.log(parseInt('05','10'));  
 console.log(parseInt('06','10'));  
 console.log(parseInt('07','10'));  
 console.log(parseInt('08','10'));  
 console.log(parseInt('09','10'));  
 console.log(parseInt('010','10'));  


Que no fim vai  retornar:
 1  
 2  
 3  
 4  
 5  
 6  
 7  
 8  
 9  
 10  


Existem aproximadamente 362,57 jeitos diferentes de se verificar se uma variável em javascript existe ou não.
Esse é o que eu vou usar:

 if (typeof variavel!== "undefined")  


Pronto, agora não preciso mais pesquisar cada vez que precisar disso.

Mais um problema com datas, dessa vez em javascript.

 var str = "05/04/2015 23:59";  
 var tmp = str.split(' ');  
 var data = tmp[0].split('/'); 
 
 var data_certa = new Date();  
 var data_errada = new Date();
  
 data[0] = parseInt(data[0]);  
 data[1] = parseInt(data[1]);  
 data[1] = data[1] -1;  
 data[2] = parseInt(data[2]);  

 data_certa.setFullYear(data[2]);  
 data_certa.setDate(data[0]);  
 data_certa.setMonth(data[1]);//setmonth deve vir depois de setdate  

 data_errada.setFullYear(data[2]);  
 data_errada.setMonth(data[1]);  
 data_errada.setDate(data[0]); 
 
 console.log(data_certa);  //Sun Apr 05 2015 12:33:04 GMT-0300 (BRT)
 console.warn(data_errada);  //Tue May 05 2015 12:33:04 GMT-0300 (BRT)


Por algum motivo, setMonth deve ser chamado depois de setDate, senão a data acaba indo parar no mês que vem.

Quem disse que a ordem dos fatores não altera o produto, não programava em javascript.