Seit der Veröffentlichung des Artikels [JavaScript] Customizing MessageBox haben viele Internetnutzer geschrieben und gefragt, wie man die ShowInfo-Methode auf der Serverseite aufruft. Ich habe mir am Wochenende eine Kompromissmethode überlegt, um dies zu erreichen.
Zunächst sollten wir klären können, warum wir Page.Write verwenden, um die benutzerdefinierte JS-Methode auf der Seite auszugeben, und warum der IE sie nicht erkennen kann und ein Fehler „XXX ist nicht definiert“ angezeigt wird. Der Grund ist einfach, denn das Skript, das wir mit Page.Write ausgeben, erscheint oben auf der Seite. Wenn der IE liest, dass es sich um eine Javascript-Funktion handelt, beginnt er mit der Ausführung. Die von uns verlinkte js-Datei wird derzeit jedoch nicht vom IE gelesen, sodass der IE die in der js-Datei definierte Methode nicht erkennen kann. Warum ist dann eine Schreibwarnung möglich? Da es sich bei Alert um eine im IE eingebettete Skriptfunktion handelt, erkennt der IE sie unabhängig davon, ob eine Seite vorhanden ist oder nicht.
Sobald Sie das Problem gefunden haben, wird es natürlich gelöst:
1. Betten Sie unsere angepasste Methode in den IE ein. ---> Es kommt mir etwas skurril vor, haha
. 2. Warten Sie, bis die Seite geladen ist, bevor Sie das Ereignis auslösen. --->Trigger-Ereignis, ja.
Woher wissen Sie, ob die Seite vollständig geladen wurde?
1. Durch den Status des Dokuments
2. Ausgelöst durch das Ereignis (windows.onload)
Das erste scheint weniger sicher zu sein. Manchmal zeigt es immer noch an, dass es Daten überträgt, obwohl es vollständig geladen wurde (FF ist die offensichtlichste Situation), daher ist es sicherer, Ereignisse zu verwenden.
Definieren Sie eine einfache Methode, mounten Sie sie in windows.onload und markieren Sie sie bei der Ausführung
var loadComplete = false;
Funktion LoadCompleted()
{
loadComplete= true;
}
window.attachEvent("onload",LoadCompleted);
Haha, auf diese Weise müssen wir nur anhand von LoadComplete beurteilen, ob die Seite geladen ist.
var mImgdir = "";
var mCaption = "caption";
var mMsg = "Nachricht";
var mOkClick= null;
Funktion ShowMessage(imgdir,caption,msg,OkClick)
{
if(loadComplete)
{
KMessageBox.ShowInfo(mImgdir,mCaption,mMsg,mOkClick);
}
}
Wenn LoadComplete nicht falsch ist, führen wir auf diese Weise die Methode KMessageBox.ShowInfo() nicht aus, aber es wird keine JS-Fehlermeldung angezeigt.
Dies allein reicht nicht aus, da das Ausgabeskript beim Ausgeben der Seite nur einmal vom IE ausgeführt wird, zu diesem Zeitpunkt jedoch loadComplete=false ist, sodass wir regelmäßig erkennen müssen, ob die Seite geladen wurde. Wenn es um das Timing geht, verwenden wir einfach setTimeout und setInterval. Wir benötigen hier eine konstante Erkennung, also verwenden wir die setInterval-Methode. Der endgültige Code lautet wie folgt:
var loadComplete = false;
var mImgdir = "";
var mCaption = "caption";
var mMsg = "Nachricht";
var mOkClick= null;
var timerID;
Funktion ShowMessage(imgdir,caption,msg,OkClick)
{
if(loadComplete)
{
KMessageBox.ShowInfo(mImgdir,mCaption,mMsg,mOkClick);
//Dieses Ereignis entladen window.detachEvent("onload",function(){LoadCompleted;}); //Timing-Triggerung stoppen
window.clearInterval(timerID);
}
}
function LoadCompleted() { loadComplete=true;
window.attachEvent("onload",LoadCompleted);
//Legen Sie den Timing-Erkennungsmechanismus fest
timerID = window.setInterval(ShowMessage,1);
Natürlich ist der obige Code nur mit dem IE kompatibel, da er attachmentEvent und detachEvent verwendet. Informationen zur Kompatibilität mit anderen Browsern finden Sie unter [JavaScript] Anpassen der Titelanzeigemethode für die Behandlungsmethode:
if(!document.attachEvent)//Nicht IE
{
document.attachEvent = function(){document.addEventListener(arguments[0].substr(2),arguments[1],arguments[2])}
}
if(!window.attachEvent)//Nicht IE
{
window.attachEvent = function(){window.addEventListener(arguments[0].substr(2),arguments[1],arguments[2])}
}
Auf der Serverseite reicht es aus, solange StringBuilder das obige Skript erstellt und es dann schreibt. Das Obige bietet nur eine Idee. Natürlich gibt es auch andere Möglichkeiten. Ich nutze die geplante Erkennung nicht direkt in Windows.onload und lasse die Seite automatisch überwachen und ausführen :), wie das Sprichwort sagt. Alle Wege führen nach Rom~~~~~
Die oben genannten Ideen stammen von yui und yui implementiert eine schönere benutzerdefinierte MessageBox. Interessierte Freunde können sie gemeinsam studieren.
http://www.cnblogs.com/walkingboy/archive/2006/08/28/autorun_customerfunction.html