После публикации статьи [JavaScript] Настройка MessageBox многие пользователи сети писали с вопросом, как вызвать метод ShowInfo на стороне сервера. На выходных я подумал о компромиссном методе достижения этой цели.
Прежде всего, мы должны выяснить, почему мы используем Page.Write для вывода пользовательского метода JS на страницу и почему IE не может его распознать и появляется ошибка «XXX не определен». Причина проста: скрипт, который мы выводим с помощью Page.Write, появляется вверху страницы. Когда IE считывает, что это функция javascript, он начинает ее выполнять. Однако файл js, на который мы ссылаемся, в настоящее время не читается IE, поэтому IE не может распознать метод, который мы определили в файле js. Тогда почему возможно предупреждение о записи? Поскольку предупреждение — это функция сценария, встроенная в IE, IE распознает его независимо от того, существует страница или нет.
Как только вы обнаружите проблему, она, естественно, будет решена:
1. Встройте наш индивидуальный метод в IE. ---> Это кажется немного причудливым, хаха
2. Подождите, пока страница загрузится, прежде чем запускать событие. --->Триггерное событие, да.
Как узнать, завершилась ли загрузка страницы?
1. Через статус документа
2. По событию (windows.onload)
Первый кажется менее безопасным. Иногда он все же показывает, что передает данные, даже если он полностью загружен (наиболее очевидная ситуация — FF), поэтому безопаснее использовать события.
Определите простой метод, смонтируйте его в windows.onload и сделайте пометку при выполнении
вар loadComplete = ложь;
функция LoadCompleted()
{
loadComplete = правда;
}
window.attachEvent("onload",LoadCompleted);
Таким образом, нам нужно только оценить, загружена ли страница, по loadComplete.
вар mImgdir = "";
вар mCaption = "подпись";
var mMsg = "Сообщение";
вар mOkClick = ноль;
функция ShowMessage(imgdir,caption,msg,OkClick)
{
если (загрузка завершена)
{
KMessageBox.ShowInfo(mImgdir,mCaption,mMsg,mOkClick);
}
}
Таким образом, если значение loadComplete не равно false, мы не будем выполнять метод KMessageBox.ShowInfo(), но не будет выдаваться сообщение об ошибке JS.
Одного этого недостаточно, поскольку выходной скрипт выполняется IE только один раз при выводе страницы, но в это время loadComplete=false, поэтому нам нужно регулярно определять, загружена ли страница. Когда дело доходит до синхронизации, мы просто используем setTimeout и setInterval. Нам нужно постоянное обнаружение, поэтому мы используем метод setInterval. Окончательный код выглядит следующим образом:
вар loadComplete = ложь;
вар mImgdir = "";
вар mCaption = "подпись";
var mMsg = "Сообщение";
вар mOkClick = ноль;
вар timerID;
функция ShowMessage(imgdir,caption,msg,OkClick)
{
если (загрузка завершена)
{
KMessageBox.ShowInfo(mImgdir,mCaption,mMsg,mOkClick);
//Выгружаем это событие window.detachEvent("onload",function(){LoadCompleted;} //Остановим запуск по времени
window.clearInterval(timerID);
}
}
функция LoadCompleted() { loadComplete=true };
window.attachEvent("onload",LoadCompleted);
//Устанавливаем механизм определения времени
timerID = window.setInterval(ShowMessage,1);
Конечно, приведенный выше код совместим только с IE, поскольку он использует AttachEvent и detachEvent. Что касается совместимости с другими браузерами, см. [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 создает приведенный выше сценарий, а затем записывает его, этого достаточно. Вышеупомянутое просто дает представление. Конечно, есть и другие способы. Например, я не использую обнаружение по расписанию, я напрямую монтирую его в windows.onload и позволяю странице автоматически отслеживать и выполняться. Это тоже неплохая идея. :), как говорится, все дороги ведут в Рим~~~~~.
Вышеупомянутые идеи исходят от yui, и yui реализует более красивый пользовательский MessageBox. Друзья, которые заинтересованы, могут изучить его вместе.
http://www.cnblogs.com/walkingboy/archive/2006/08/28/autorun_customerfunction.html