Depuis la publication de l'article [JavaScript] Customizing MessageBox, de nombreux internautes ont écrit pour demander comment appeler la méthode ShowInfo côté serveur. J'ai pensé à une méthode de compromis pour y parvenir pendant le week-end.
Tout d'abord, nous devrions être en mesure de clarifier pourquoi nous utilisons Page.Write pour afficher la méthode JS personnalisée sur la page et pourquoi IE ne peut pas la reconnaître et une erreur « XXX n'est pas défini » apparaîtra. La raison est simple, car le script que nous générons à l'aide de Page.Write apparaît en haut de la page. Lorsque IE lit qu'il s'agit d'une fonction javascript, il commence à l'exécuter. Cependant, le fichier js auquel nous avons lié n'est pas lu par IE pour le moment, donc IE ne peut pas reconnaître la méthode que nous avons définie dans le fichier js. Alors pourquoi une alerte d'écriture est-elle possible ? Étant donné que l'alerte est une fonction de script intégrée à IE, IE la reconnaîtra, qu'il y ait ou non une page.
Une fois que vous aurez trouvé le problème, il sera naturellement résolu :
1. Intégrez notre méthode personnalisée dans IE. ---> Cela semble un peu fantaisiste, haha
2. Attendez que la page soit chargée avant de déclencher l'événement. --->Événement déclencheur, oui.
Comment savoir si la page a fini de se charger ?
1. Par l'état du document
2. Déclenché par l'événement (windows.onload)
Le premier semble moins sûr. Parfois, il indique toujours qu'il transmet des données même si elles ont été complètement chargées (FF est la situation la plus évidente), il est donc plus sûr d'utiliser des événements.
Définissez une méthode simple, montez-la dans windows.onload et faites une marque lors de l'exécution
var loadComplete = faux;
fonction LoadCompleted()
{
loadComplete= vrai ;
}
window.attachEvent("onload",LoadCompleted);
Haha, de cette façon, nous devons seulement juger si la page est chargée en jugeant loadComplete.
var mImgdir = "";
var mCaption = "légende";
var mMsg = "Message";
var mOkClick=null;
fonction ShowMessage (imgdir, caption, msg, OkClick)
{
si (chargementComplet)
{
KMessageBox.ShowInfo(mImgdir,mCaption,mMsg,mOkClick);
}
}
De cette façon, lorsque loadComplete n'est pas faux, nous n'exécuterons pas la méthode KMessageBox.ShowInfo(), mais il n'y aura pas d'invite d'erreur JS.
Cela ne suffit pas à lui seul, car le script de sortie n'est exécuté qu'une seule fois par IE lors de la sortie de la page, mais loadComplete=false à ce moment-là, nous devons donc détecter régulièrement si la page a été chargée. En ce qui concerne le timing, nous utilisons simplement setTimeout & setInterval. Nous avons besoin d'une détection constante ici, nous utilisons donc la méthode setInterval. Le code final est le suivant :
var loadComplete = faux;
var mImgdir = "";
var mCaption = "légende";
var mMsg = "Message";
var mOkClick=null;
varIDminuterie ;
fonction ShowMessage (imgdir, caption, msg, OkClick)
{
si (chargementComplet)
{
KMessageBox.ShowInfo(mImgdir,mCaption,mMsg,mOkClick);
//Décharger cet événement window.detachEvent("onload",function(){LoadCompleted;}); //Arrêter le déclenchement du timing
window.clearInterval(timerID);
}
}
function LoadCompleted() { loadComplete=true }
window.attachEvent("onload",LoadCompleted);
//Définir le mécanisme de détection de synchronisation
timerID = window.setInterval(ShowMessage,1);
Bien entendu, le code ci-dessus n'est compatible qu'avec IE car il utilise attachEvent et detachEvent. Quant à le rendre compatible avec d'autres navigateurs, veuillez vous référer à [JavaScript] Personnalisation de la méthode d'affichage du titre pour la méthode de traitement :
if(!document.attachEvent)//Pas IE
{
document.attachEvent = function(){document.addEventListener(arguments[0].substr(2),arguments[1],arguments[2])}
}
if(!window.attachEvent)//Pas IE
{
window.attachEvent = function(){window.addEventListener(arguments[0].substr(2),arguments[1],arguments[2])}
}
Côté serveur, tant que StringBuilder produit le script ci-dessus puis l'écrit, cela suffit. Ce qui précède ne donne qu'une idée. Bien sûr, il existe d'autres moyens. Par exemple, je n'utilise pas de détection programmée, je le monte directement dans windows.onload et je laisse la page surveiller et s'exécuter automatiquement. :), comme le dit le proverbe, tous les chemins mènent à Rome~~~~~.
Les idées ci-dessus viennent de Yui, et Yui implémente une MessageBox personnalisée plus belle. Les amis intéressés peuvent l'étudier ensemble.
http://www.cnblogs.com/walkingboy/archive/2006/08/28/autorun_customerfunction.html