Desde a publicação do artigo [JavaScript] Personalizando MessageBox, muitos internautas escreveram perguntando como chamar o método ShowInfo no lado do servidor. Pensei em um método de compromisso para conseguir isso durante o fim de semana.
Em primeiro lugar, devemos ser capazes de esclarecer por que usamos Page.Write para enviar o método JS personalizado para a página e por que o IE não consegue reconhecê-lo e um erro "XXX não está definido" aparecerá. A razão é simples, porque o script que geramos usando Page.Write aparece no topo da página. Quando o IE lê que é uma função javascript, ele começa a executá-la. No entanto, o arquivo js ao qual vinculamos não é lido pelo IE neste momento, portanto, o IE não pode reconhecer o método que definimos no arquivo js. Então por que o alerta de gravação é possível? Como o alerta é uma função de script incorporada no IE, o IE irá reconhecê-lo independentemente de haver uma página ou não.
Depois de encontrar o problema, ele será resolvido naturalmente:
1. Incorpore nosso método personalizado ao IE. ---> Parece um pouco caprichoso, haha
2. Espere até que a página seja carregada antes de acionar o evento. ---> Evento de gatilho, sim.
Como saber se a página terminou de carregar?
1. Através do status do documento
2. Acionado pelo evento (windows.onload)
O primeiro parece ser menos seguro. Às vezes ainda mostra que está transmitindo dados mesmo tendo sido completamente carregado (FF é a situação mais óbvia), por isso é mais seguro usar eventos.
Defina um método simples, monte-o em windows.onload e marque ao executar
var loadComplete = falso;
função LoadCompleted()
{
carregarComplete= verdadeiro;
}
window.attachEvent("onload",LoadCompleted);
Haha, desta forma só precisamos julgar se a página está carregada julgando loadComplete.
var mImgdir = "";
var mCaption = "legenda";
var mMsg = "Mensagem";
var mOkClick= null;
função ShowMessage(imgdir,caption,msg,OkClick)
{
if(carregarCompleto)
{
KMessageBox.ShowInfo(mImgdir,mCaption,mMsg,mOkClick);
}
}
Desta forma, quando loadComplete não for falso, não executaremos o método KMessageBox.ShowInfo(), mas não haverá prompt de erro JS.
Isso por si só não é suficiente, porque o script de saída é executado apenas uma vez pelo IE ao gerar a página, mas loadComplete=false neste momento, portanto, precisamos detectar regularmente se a página foi carregada. Quando se trata de tempo, usamos apenas setTimeout e setInterval. Precisamos de detecção constante aqui, então usamos o método setInterval. O código final é o seguinte:
var loadComplete = falso;
var mImgdir = "";
var mCaption = "legenda";
var mMsg = "Mensagem";
var mOkClick= null;
var timerID;
função ShowMessage(imgdir,caption,msg,OkClick)
{
if(carregarCompleto)
{
KMessageBox.ShowInfo(mImgdir,mCaption,mMsg,mOkClick);
//Descarrega este evento window.detachEvent("onload",function(){LoadCompleted;}); //Para o disparo do tempo
janela.clearInterval(timerID);
}
}
função LoadCompleted() { loadComplete=true }
window.attachEvent("onload",LoadCompleted);
//Definir o mecanismo de detecção de tempo
timerID = window.setInterval(ShowMessage,1);
Claro, o código acima só é compatível com o IE porque usa attachmentEvent e detachEvent. Para torná-lo compatível com outros navegadores, consulte [JavaScript] Personalizando o método de exibição de título para o método de tratamento:
if(!document.attachEvent)//Não é IE
{
document.attachEvent = function(){document.addEventListener(argumentos[0].substr(2),argumentos[1],argumentos[2])}
}
if(!window.attachEvent)//Não é IE
{
window.attachEvent = function(){window.addEventListener(argumentos[0].substr(2),argumentos[1],argumentos[2])}
}
No lado do servidor, desde que StringBuilder produza o script acima e depois o grave, é o suficiente. O texto acima apenas fornece uma ideia. Claro, existem outras maneiras. Por exemplo, eu não uso a detecção agendada, eu a monto diretamente no windows.onload e deixo a página monitorar e executar automaticamente. :), como diz o ditado. Todos os caminhos levam a Roma~~~~~.
As idéias acima vêm de yui, e yui implementa um MessageBox personalizado mais bonito. Amigos interessados podem estudá-lo juntos.
http://www.cnblogs.com/walkingboy/archive/2006/08/28/autorun_customerfunction.html