Tenho duas páginas que trabalham associadas. A página "pai" passa parâmetros na string para a página "filho". A página "filho" responde a página "pai" (parent.Resposta()) que executou sua função. Ocorre que sua função é salvar dados num banco de dados, cujo tempo de processamento não é o mesmo das páginas "pai" e "filho". Como a página "pai" pode mandar vários lotes de dados, usei uma rotina em javascript que gera uma pausa na execução do envio dos lotes e exibe uma barra de progresso, para que o usuário saiba que algum processamento ocorre.
O erro se dá quando a barra entra num loop - se não infinito - maior que o número de lotes.
Funciona mais ou menos assim (a página abaixo não tem o mesmo conteúdo que as minhas, mas os erros são idênticos):
página chamadora
<html>
<head>
<title>Implementing Wait in Javascript</title>
<script language="javascript" type="text/javascript" src="Barra.js"></script>
<script language="javascript" type="text/javascript">
//função chamada pela barra de progresso, só chamada ao final do tempo definido em Barra.js
function AcaoBarra(arg1, arg2){
//alert(arg1 + " - " + arg2);
}
function teste(){
for (var i=0;i<5;i++){
BarraCria('teste','PBouter1','PBdone1');
}
}
</script>
</head>
<body leftmargin="15" topmargin="0" bgcolor="#EEEEFF">
<input type="button" onclick="teste()" />
<br />
<div id="teste"></div>
</body>
</html>
O código "Barra.js" é o seguinte:
var AlturaAntes = 0;
var BarraAltura=15;
var BarraLargura = screen.availWidth;
var BarraTempo=2;
var BarraIndicador=(BarraLargura-2)/BarraTempo/10;
var BarraCarregada=0;
var CorAntes = "";
var Pid=0;
var BarraAvanca = true;
function BarraVars(){
AlturaAntes = 0;
BarraAltura=15;
BarraLargura = screen.availWidth;
BarraTempo=2;
BarraIndicador=(BarraLargura-2)/BarraTempo/10;
BarraCarregada=0;
CorAntes = "";
Pid=0;
BarraAvanca = true;
}
function BarraOculta(el_Ancora,el_Tabela,el_Barra,aArg){
el1 = document.getElementById(el_Tabela);
el2 = document.getElementById(el_Barra);
el2.style.width = 0;
el2.style.height = 0;
clearInterval(Pid);
window.status='';
AcaoBarra(aArg);
BarraCarregada = 0;
BarraAltura = 15;
linhaBarra = document.getElementById(el_Ancora);
linhaBarra.style.backgroundColor = CorAntes;
linhaBarra.style.height = AlturaAntes;
//el2.parentNode.removeChild(el2);
//el1.parentNode.removeChild(el1);
//BarraAvanca = false;
//BarraVars();
}
function BarraCria(el_Ancora,el_Tabela,el_Barra,aArg){
linhaBarra = document.getElementById(el_Ancora);
CorAntes = linhaBarra.style.backgroundColor;
AlturaAntes = linhaBarra.style.height;
linhaBarra.style.backgroundColor = "yellow";
vertab = document.getElementById(el_Tabela);
if (!vertab) {
//BarraAvanca = true;
CriaTab(el_Ancora,el_Tabela,el_Barra,1);
}
el1 = document.getElementById(el_Tabela);
BarraRedimensiona(el_Barra,0,0,BarraAltura-2,0);
el1.style.visibility="visible";
Pid=setInterval(function() { BarraAvanco(el_Ancora,el_Tabela,el_Barra,aArg); },95);
}
function BarraAvanco(el_Ancora,el_Tabela,el_Barra,aArg){
window.status="Carregando...";
BarraCarregada++;
if(BarraCarregada<0)BarraCarregada=0;
if(BarraCarregada>=BarraTempo*10){
clearInterval(Pid);
BarraCarregada=BarraTempo*10;
BarraOculta(el_Ancora,el_Tabela,el_Barra,aArg);
}
BarraRedimensiona(el_Barra, 0, BarraIndicador*BarraCarregada, BarraAltura-2, 0);
}
function BarraRedimensiona(id_elemento,t,r,b,l){
//alert(BarraAvanca)
if (BarraAvanca){
vertab = document.getElementById(id_elemento);
if (vertab) {
elemento = document.getElementById(id_elemento);
elemento.style.width=r+'px';
}
}
}
function CriaTab(idancora,idtabela,idlinha,celulas){
var elemento = document.getElementById(idancora);
tabela = document.createElement("<table border='0' cellpadding='0' cellspacing='0' style='height:" + BarraAltura + "; border-collapse: collapse;border:1px solid black; background-color:#FFFFFF;' id='" + idtabela + "'></table>");
elemento.appendChild(tabela);
Tabela_Base = document.getElementById(idtabela);
var Linha = Tabela_Base.insertRow();
if (celulas>1) {
for (i=0;i<celulas;i++){
var celula1 = Linha.insertCell();
celula1.id = "cel_" + i.toString();
celula1.style.width = Tamanho.toString() + "%";
if ((i % 2) == 0) {
celula1.style.backgroundColor ="red";
celula1.style.border = "0px solid black";
}
else {
celula1.style.backgroundColor ="white";
celula1.style.border = "1px solid black";
}
}
}
else {
var celula1 = Linha.insertCell();
celula1.id = idlinha;
celula1.style.backgroundColor ="red";
}
}
Algém poderia me ajudar a interromper a barra ao final das iterações? Ou alguém conhece outra solução para o problema?
Já criei algumas variáveis booleanas para tentar controlar o fluxo da barra, mas não consigo.
Pergunta
Lamenza
Tenho duas páginas que trabalham associadas. A página "pai" passa parâmetros na string para a página "filho". A página "filho" responde a página "pai" (parent.Resposta()) que executou sua função. Ocorre que sua função é salvar dados num banco de dados, cujo tempo de processamento não é o mesmo das páginas "pai" e "filho". Como a página "pai" pode mandar vários lotes de dados, usei uma rotina em javascript que gera uma pausa na execução do envio dos lotes e exibe uma barra de progresso, para que o usuário saiba que algum processamento ocorre.
O erro se dá quando a barra entra num loop - se não infinito - maior que o número de lotes.
Funciona mais ou menos assim (a página abaixo não tem o mesmo conteúdo que as minhas, mas os erros são idênticos):
página chamadora
O código "Barra.js" é o seguinte:Algém poderia me ajudar a interromper a barra ao final das iterações? Ou alguém conhece outra solução para o problema?
Já criei algumas variáveis booleanas para tentar controlar o fluxo da barra, mas não consigo.
Link para o comentário
Compartilhar em outros sites
2 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.