まず、カスタム 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;
function LoadCompleted()
{
loadComplete= true;
}
window.attachEvent("onload" ,LoadCompleted) ;
はは、この方法では、loadComplete を判定することでページが読み込まれたかどうかを判断するだけで済みます。
var mImgdir = "";
var mCaption = "caption";
var mMsg = "メッセージ";
var mOkClick= null;
function ShowMessage(imgdir,caption,msg,OkClick)
{
if(loadComplete)
{
KMessageBox.ShowInfo(mImgdir,mCaption,mMsg,mOkClick);
}
}
このようにして、loadComplete が指定されていない場合には実行されません。 JS エラー プロンプトが表示されない限り、KMessageBox.ShowInfo() メソッド。
IE はページを出力するときに出力スクリプトを 1 回しか実行しないため、これだけでは十分ではありませんが、このときはloadComplete=falseになっているため、ページが読み込まれたかどうかを定期的に検出する必要があります。タイミングに関しては、setTimeout と setInterval を使用するだけです。ここでは定数検出が必要なので、setInterval メソッドを使用します。最終的なコードは次のとおりです。
varloadComplete = false;
var mImgdir = "";
var mCaption = "caption";
var mMsg = "メッセージ";
var mOkClick= null;
var timerID;
関数ShowMessage(imgdir,caption, msg,OkClick)
{
if(loadComplete)
{
KMessageBox.ShowInfo(mImgdir,mCaption,mMsg,mOkClick);
// このイベント ウィンドウをアンロードします.detachEvent("onload" ,function(){LoadCompleted;}); //タイミングトリガーを停止します
window.clearInterval(timerID);
}
}
function LoadCompleted() {loadCompleted=true ; }
window .attachEvent("onload",LoadCompleted);
//タイミング検出メカニズムを設定します
timerID = window.setInterval(ShowMessage,1);
Ofもちろん、上記のコードは、attachEvent と detachEvent を使用するため、IE のみに対応しています。他のブラウザへの対応については、処理メソッド:
if(!document.attachEvent)//Not 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 はより美しいカスタム メッセージ ボックスを実装しました。興味のある友人は一緒に勉強することができます。