Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

JGD

função mascara moeda - Bolquerar objeto readonly... Como?

Recommended Posts

Olá Pessoa,

 

Uso a função abaixo para formatar moeda.. Funciona legal.

 

Porem em inputs com atributo readonly... Ela pemite alteração.

 

Estou tentando bloquea-la pelo atribuito... Mais não tá rolando...

 

Segue função:

 

 

 

//===================================
//MÁSCARA DE MOEDA
//onkeypress='reais(this,event)' onkeydown="backspace(this,event)'

documentall = document.all;

function formatamoney(c) {
var t = this; if(c == undefined) c = 2;
var p, d = (t=t.split("."))[1].substr(0, c);
for(p = (t=t[0]).length; (p-=3) >= 1;) {
t = t.substr(0,p) + "." + t.substr(p);
}
return t+","+d+Array(c+1-d.length).join(0);
}

String.prototype.formatCurrency=formatamoney

function demaskvalue(valor, currency){

var val2 = '';
var strCheck = '0123456789';
var len = valor.length;
if (len== 0){
return 0.00;
}

if (currency ==true){

for(var i = 0; i < len; i++)
if ((valor.charAt(i) != '0') && (valor.charAt(i) != ',')) break;

for(; i < len; i++){
if (strCheck.indexOf(valor.charAt(i))!=-1) val2+= valor.charAt(i);
}

if(val2.length==0) return "0.00";
if (val2.length==1)return "0.0" + val2;
if (val2.length==2)return "0." + val2;

var parte1 = val2.substring(0,val2.length-2);
var parte2 = val2.substring(val2.length-2);
var returnvalue = parte1 + "." + parte2;
return returnvalue;

}
else{

val3 ="";
for(var k=0; k < len; k++){
if (strCheck.indexOf(valor.charAt(k))!=-1) val3+= valor.charAt(k);
}
return val3;
}
}

function reais(obj,event){

var whichCode = (window.Event) ? event.which : event.keyCode;


if (whichCode == 8 && !documentall) {

if (event.preventDefault){ //standart browsers
event.preventDefault();
}else{ // internet explorer
event.returnValue = false;
}
var valor = obj.value;
var x = valor.substring(0,valor.length-1);
obj.value= demaskvalue(x,true).formatCurrency();
return false;
}


FormataReais(obj,'.',',',event);
} // end


function backspace(obj,event){

var whichCode = (window.Event) ? event.which : event.keyCode;
if (whichCode == 8 && documentall) {
var valor = obj.value;
var x = valor.substring(0,valor.length-1);
var y = demaskvalue(x,true).formatCurrency();

obj.value ="";
obj.value += y;

if (event.preventDefault){
event.preventDefault();
}else{ // internet explorer
event.returnValue = false;
}
return false;

}// end if
}// end backspace

function FormataReais(fld, milSep, decSep, e) {
var sep = 0;
var key = '';
var i = j = 0;
var len = len2 = 0;
var strCheck = '0123456789';
var aux = aux2 = '';
var whichCode = (window.Event) ? e.which : e.keyCode;

/

if (whichCode == 0 ) return true;
if (whichCode == 9 ) return true; //tecla tab
if (whichCode == 13) return true; //tecla enter
if (whichCode == 16) return true; //shift internet explorer
if (whichCode == 17) return true; //control no internet explorer
if (whichCode == 27 ) return true; //tecla esc
if (whichCode == 34 ) return true; //tecla end
if (whichCode == 35 ) return true; //tecla end
if (whichCode == 36 ) return true; //tecla home




if (e.preventDefault){
e.preventDefault()
}else{ // internet explorer
e.returnValue = false
}

var key = String.fromCharCode(whichCode);
if (strCheck.indexOf(key) == -1) return false;


fld.value += key;

var len = fld.value.length;
var bodeaux = demaskvalue(fld.value,true).formatCurrency();
fld.value=bodeaux;

if (fld.createTextRange) {
var range = fld.createTextRange();
range.collapse(false);
range.select();
}
else if (fld.setSelectionRange) {
fld.focus();
var length = fld.value.length;
fld.setSelectionRange(length, length);
}
return false;

}
//==========================================

 

 

 

Tipo algo assim:

 

 

 

for(var i = 0; i < obj.attributes.length; i++){
if(obj.attributes[i].specified)
if(obj.attributes[i].readonly=="true"){ ///  
obj.attributes[i].alt=="bloq"
return false;
}
}

 

 

 

Mas tb não bloqueia... Agradeço qualuer ajuda.

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu uso isso aqui: 10 vezes menos codigo, e não tem bugs

function mascara(o,f){  
    v_obj=o  
    v_fun=f  
    setTimeout("execmascara()",1)  
}  
function execmascara(){  
    v_obj.value=v_fun(v_obj.value)  
}  
function mvalor(v){  
    v=v.replace(/\D/g,"");//Remove tudo o que não é dígito  
    v=v.replace(/(\d)(\d{8})$/,"$1.$2");//coloca o ponto dos milhões  
    v=v.replace(/(\d)(\d{5})$/,"$1.$2");//coloca o ponto dos milhares  
  
    v=v.replace(/(\d)(\d{2})$/,"$1,$2");//coloca a virgula antes dos 2 últimos dígitos  
    return v;  
}  

http://wbruno.com.br/2011/03/12/diversas-mascaras-com-er/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Willian, Obrigado por responder....

 

Eu já havia localizado sua função. Mas não consegui implementar para moeda.

 

Em um input vazio... Ao digitar, ela não coloca o ponto e a virgula automaticamente como a que estou usado...

E se coloco (digito) a virgula ele aceita mais de um virgula... Onde posso estar errando em relação a implementação da sua função.

 

 

Não tem mesmo como bloquer via atributo??

Compartilhar este post


Link para o post
Compartilhar em outros sites

o atributo bloqueia, mas a tua função é problemática, e ignora ele.

 

use a minha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

William,

 

Cara não manjo muito de ER... Testei sua função para moeda.

Não formatou corretamente. Passa + de uma virgula, passa + de um ponto e não impede mais de 2 zeros no final.

Teste e verá.

Compartilhar este post


Link para o post
Compartilhar em outros sites

vc ta usando errado cara.. veja:

<script type="text/javascript">
function mascara(o,f){  
    v_obj=o  
    v_fun=f  
    setTimeout("execmascara()",1)  
}  
function execmascara(){  
    v_obj.value=v_fun(v_obj.value)  
}  
function mvalor(v){  
    v=v.replace(/\D/g,"");//Remove tudo o que não é dígito  
    v=v.replace(/(\d)(\d{8})$/,"$1.$2");//coloca o ponto dos milhões  
    v=v.replace(/(\d)(\d{5})$/,"$1.$2");//coloca o ponto dos milhares  
  
    v=v.replace(/(\d)(\d{2})$/,"$1,$2");//coloca a virgula antes dos 2 últimos dígitos  
    return v;  
}  
</script>


<input type="text" onkeypress="mascara(this, mvalor);" maxlength="12" />
ele não aceita vc digitar virgula não.. formata certinho:

http://postimage.org/image/dslwgbqw7/

 

E se tivesse o readonly:

<input type="text" onkeypress="mascara(this, mvalor);" value="1.231,23" maxlength="12" readonly="readonly" />
vc não consegue editar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Blz William,

 

Agora "funfou"... Só identiquei , a princíopo... de diferente aspas simple de aspas duplas em relação ao seu exemplo.

 

Obrigado mesmo.

 

PS. Se deseja da uma forcinha na questão do selects... http://forum.imasters.com.br/topic/489512-validao-da-seleo-de-checkboxs/

Tb agradeço

 

Abraço

 

 

William, me ajuda!?

 

 

 

Disse que funcionava sua solução da mascara... Mas não havia pecebido que no I.E..

se usamos "backspace" o ponto e virgula não acompanha. zoando uma somatório por exemplo.

 

Como tratar "event.keyCode " com ER ???

Compartilhar este post


Link para o post
Compartilhar em outros sites

qual ie vc tá usando ?

 

e pq vc ta trabalhando com keyCode ? no meu código não é necessário.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Wiliam,

 

O IE... versão 8.0...

 

No Firefox... Ok certinho versão 16

No chrome... Tb falha no backspace versçao 25

 

 

Não estou usando keyCode... O Código está igualzinho ao que você recomendou... Falei porque é o que é geralmente utilizando para pegar a tecla...

Compartilhar este post


Link para o post
Compartilhar em outros sites

no ie o objeto event é global, e no chrome ou firefox, o event é argumento da função.

 

juro que não consegui reproduzir essa falha. Aqui tá redondinho no chrome e ie.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Willian,

 

Ainda sobre a sua função... E o problema das casas decimais com 2 digitos antes da virgula no backspace.

 

Pesquisei por aí sobre o backspace...

 

Me parece que para o backspace funcionar... Deve utilizar um comando especial... [^]

 

O problema é que não manjo tanto de ER..... O comando deve ser colocado no início da cadeia...

Onde começa a cadeia na sua função?

 

Veja fontes de referencias:

http://www.codeproject.com/Questions/113758/Regular-Expression-for-alphanumeric-and-backspace

 

http://stackoverflow.com/questions/7226402/help-with-regex-pattern-for-delete-arrows-and-escape-keys

 

http://regexlib.com/CheatSheet.aspx?AspxAutoDetectCookieSupport=1

 

Abraço

 

JGD

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda sobre a sua função... E o problema das casas decimais com 2 digitos antes da virgula no backspace.

explica novamente por favor, qual o problema ?

 

Mesmo testando, não consegui encontrar nenhum erro. Oque acontece ?

Qual o comportamento para que dê algo errado ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

No imput vazio
- Coleque cursor. Digite: 100000 o resultado no campo é: 1.000,00 - Correrto

O caracter pipe("|") represta o cursor...

No imput com valor igual: 1.000,00.

Se colocar o cursor no final (1.000,00"|")
Se colocar o cursor no final ( 100,00"|")
Se colocar o cursor no final ( 10,00"|")


a)E deletar 1 item: o resultado no campo é: 1.000,0 // Qdo deveria ser 100,00
b)E deletar 2 itens: o resultado no campo é: 1.000, // Qdo deveria ser 10,00

 

Para backspace:
Se colocar o cursor no meio do valor (1.00"|"0,00) ou no inicio ("|"1.000,00) // mesma situação ele deveria formar

Ele não re-format as casas descimnais como na ida. (1ª insersão.

 

Tem como forçar o cursor para sempre iniciar no final do imput (right)... Creio que isso já ajudaria na função..

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.