記事 [JavaScript] Customizing MessageBox が公開されて以来、多くのネチズンがサーバー側で ShowInfo メソッドを呼び出す方法を尋ねる質問を書いてきましたが、私は週末にそれを実現するための妥協方法を考えました。
まず、カスタム JS メソッドをページに出力するために Page.Write を使用する理由と、IE がそれを認識できずに「XXX が定義されていません」エラーが表示される理由を明確にする必要があります。理由は簡単で、Page.Writeで出力したスクリプトがページの上部に表示されるからです。 IE はそれが JavaScript 関数であることを読み取ると、その関数の実行を開始しますが、この時点ではリンク先の js ファイルは IE によって読み取られないため、IE は js ファイルに定義したメソッドを認識できません。では、なぜ書き込みアラートが可能になるのでしょうか?アラートはIEに組み込まれたスクリプト機能であるため、ページの有無に関わらずIEでは認識されます。
問題が見つかったら、自然に解決されます。
1. カスタマイズしたメソッドを IE に埋め込みます。 ---> ちょっと気まぐれな気がします (笑
) 2. ページがロードされるまで待ってから、イベントをトリガーします。 --->トリガーイベント、はい。
ページの読み込みが完了したかどうかはどうやってわかりますか?
1. ドキュメントのステータスを通じて
2. イベント (windows.onload) によってトリガー
最初の方法は安全性が低いようです。完全にロードされているにもかかわらずデータを送信していることが表示される場合があるため (FF が最も明白な状況です)、イベントを使用する方が安全です。
簡単なメソッドを定義し、windows.onloadにマウントし、実行時にマークを付けます。
varloadComplete = false;
関数LoadCompleted()
{
ロード完了= true;
}
window.attachEvent("onload",LoadCompleted);
はは、このように、loadComplete を判断することでページが読み込まれたかどうかを判断するだけで済みます。
var mImgdir = "";
var mCaption = "キャプション";
var mMsg = "メッセージ";
var mOkClick = null;
関数 ShowMessage(imgdir,caption,msg,OkClick)
{
if(loadComplete)
{
KMessageBox.ShowInfo(mImgdir,mCaption,mMsg,mOkClick);
}
}
このように、loadComplete が false でない場合、KMessageBox.ShowInfo() メソッドは実行されませんが、JS エラー プロンプトは表示されません。
IE ではページ出力時に出力スクリプトが一度だけ実行されるため、これだけでは不十分ですが、このときはloadComplete=falseとなっているため、ページが読み込まれたかどうかを定期的に検出する必要があります。タイミングに関しては、setTimeout と setInterval を使用するだけです。ここでは定数検出が必要なので、setInterval メソッドを使用します。最終的なコードは次のとおりです。
varloadComplete = false;
var mImgdir = "";
var mCaption = "キャプション";
var mMsg = "メッセージ";
var mOkClick = null;
var タイマー ID;
関数 ShowMessage(imgdir,caption,msg,OkClick)
{
if(loadComplete)
{
KMessageBox.ShowInfo(mImgdir,mCaption,mMsg,mOkClick);
//このイベントをアンロード window.detachEvent("onload",function(){LoadCompleted;}) //タイミングトリガーを停止します。
window.clearInterval(タイマーID);
関数
LoadCompleted() {loadComplete=true;
}
window.attachEvent("onload",LoadCompleted);
//タイミング検出メカニズムを設定します
timerID = window.setInterval(ShowMessage,1);
もちろん、上記のコードはattachEventとdetachEventを使用しているためIEのみに対応しています。他のブラウザへの対応については、「[JavaScript]タイトル表示方法のカスタマイズ」を参照してください。
if(!document.attachEvent)//IE ではありません
{
document.attachEvent = function(){document.addEventListener(arguments[0].substr(2),arguments[1],arguments[2])}
}
if(!window.attachEvent)//IE ではありません
{
window.attachEvent = function(){window.addEventListener(arguments[0].substr(2),arguments[1],arguments[2])}
}
サーバー側では、StringBuilder が上記のスクリプトを生成して書き込むだけで十分です。もちろん、上記はアイデアを提供しているだけです。たとえば、スケジュールされた検出を使用せずに、ページを自動的に監視して実行することも悪くありません。 :)、ことわざにあるように、すべての道はローマに通じています~~~~~
上記のアイデアは yui からのもので、yui はより美しいカスタム メッセージ ボックスを実装しています。興味のある友達は一緒に勉強することができます。
http://www.cnblogs.com/walkingboy/archive/2006/08/28/autorun_customerfunction.html