Запуск нескольких функций по событию onLoad
Начнем с документации:
onLoad
Событие onLoad происходит при полной загрузке страницы документа или всех фреймов. Оно считается состоявшимся только после завершения загрузки всей страницы, включая изображения.
Это событие часто используется различными скриптами для модификации страницы сразу после загрузки, например прописываются красивые всплывающие подсказки вместо стандартных атрибутов title, подсвечивается код, выполняется инициализация других скриптов или выполняются другие полезные действия в зависимости от фантазии разработчиков. Проблема в том, что разработчиков с их фантазией много, а событие на странице только одно. И получается ситуация, когда хочется подключить на свою web-страничку несколько скриптов разных производителей, и все они для своей работы хотят монопольно использовать событие onLoad. Конечно, при наличии определенных навыков можно подправить исходный код. Но как быть, если исходный код скриптов недоступен, например файлы расположены на стороннем сервере или упакованы (зашифрованы)? Что делать с упакованными и шифрованными скриптами и их "аффтарами" я расскажу потом, это тема для отдельной статьи, а сейчас будет решаться задача с выполнением нескольких функций по событию onLoad.
Code (JavaScript) : Убрать нумерацию
- //--------------------------------------------------------------
- // Multi-onLoadEvents Script
- // Copyright (C) ManHunter / PCL
- // http://www.manhunter.ru
- //--------------------------------------------------------------
- // onLoad event list
- onLoadFuncton=new Array();
- // Add new function to onLoad event
- function safeAddLoadFunction(myFunction) {
- // Function
- if (typeof(myFunction) != 'function') {
- return false;
- }
- // Is onLoad event already exists?
- if (window.onload) {
- // Is any function in list?
- if (onLoadFuncton.length) {
- // Add new function
- onLoadFuncton[onLoadFuncton.length]=new function() {
- myFunction();
- }
- }
- else {
- // Add first function
- oldOnLoadFunction=window.onload;
- onLoadFuncton[onLoadFuncton.length]=new function() {
- oldOnLoadFunction();
- }
- // Add new function
- onLoadFuncton[onLoadFuncton.length]=new function() {
- myFunction();
- }
- }
- }
- else {
- // Add new function
- onLoadFuncton[onLoadFuncton.length]=new function() {
- myFunction();
- }
- }
- // Set global onLoad function
- window.onload=function() { safeDoLoadEvents(); }
- return true;
- }
- // Execute all onLoad functions
- function safeDoLoadEvents() {
- for (i=0; i<onLoadFuncton.length; i++) {
- onLoadFuncton[i];
- }
- }
Code (JavaScript) : Убрать нумерацию
- safeAddLoadFunction (some_function);
Code (JavaScript) : Убрать нумерацию
- safeAddLoadFunction (some_function('param_1',param_2));
Code (JavaScript) : Убрать нумерацию
- <html>
- <head>
- <title>Demo</title>
- <!-- Подключаем файл с вышеприведенным скриптом -->
- <script src="multi_onload.js" type="text/javascript"></script>
- </head>
- <!-- Установлен первый обработчик -->
- <body onLoad="first_function();">
- ....
- <script type="text/javascript">
- <!--
- // Наши обработчики onLoad
- function first_function() {
- document.write('first<br>');
- }
- function second_function() {
- document.write('second<br>');
- }
- // Пример функции с параметрами
- function third_function(id) {
- document.write('third - '+id+'<br>');
- }
- function four_function() {
- document.write('four<br>');
- }
- //-->
- </script>
- <!-- Теперь добавим их все -->
- <script type="text/javascript">
- <!--
- // Не забываем что у нас на странице уже жестко прописан
- // первый обработчик first_function. Добавляем к нему наши обработчики
- safeAddLoadFunction (second_function);
- safeAddLoadFunction (third_function('ok'));
- safeAddLoadFunction (four_function);
- safeAddLoadFunction (second_function);
- //-->
- </script>
- </body>
- </html>
first
second
third - ok
four
second
Что и требовалось доказать. Все функции отработали по событию onLoad и в нужной последовательности.
Просмотров: 21164 | Комментариев: 14
Метки: JavaScript
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Alex
(10.01.2013 в 02:45):
Подскажите, будет так любезны. Товарищи :), юзаю glossy.js и resizer.js - оба как вы поняли оспользуют onLoad. Помогите сделать их по очереди...
ecolora
(31.01.2012 в 10:30):
А я ещё столкнулся с тем, что просто "пихают" onload в своё расширение, а о других забывают... вот тут постарался изложить свою точку зрения:
http://ecolora.ru/index.php/20...cman-jdmtree
http://ecolora.ru/index.php/20...cman-jdmtree
Sad
(01.07.2010 в 15:20):
Жалко, у меня не работает, добавляю функции из onload в first и second от 2 разных скриптов и ничего.
Работает только нижний код от Юрия, но и то, срабатывает только function func2() , onload в function func() не хочет(
Работает только нижний код от Юрия, но и то, срабатывает только function func2() , onload в function func() не хочет(
Алекс
(14.05.2010 в 21:54):
Прошу прощения, для ленивых читателей можно разъяснить, где здесь решается проблема нескольких чужих скриптов перезаписывающих window.onload на себя?
Пример приведен, да и код вроде тоже указывает на один такой, а все остальные свои.
Пример приведен, да и код вроде тоже указывает на один такой, а все остальные свои.
Димарик
(06.04.2010 в 20:36):
То что надо, спасибо
Алексей
(01.02.2010 в 08:32):
То, что надо. Удивительно, что это не предусмотрено изначально, Спасибо.
паккер
(01.10.2009 в 22:51):
Спасибо! Отлично :)
Алексей
(15.09.2009 в 20:49):
Стуканись в аську [del] или скажи свой номер...
ManHunter
(15.09.2009 в 19:26):
Алексей, не совсем понял о чем ты. Я же привел сам скрипт и пример его использования, просто сделай по образу и подобию, и будет счастье :)
Алексей
(15.09.2009 в 19:22):
Да я вообще-то Юрию писал... Хм.. А в чем прикол??? Если у меня нигде не прописан window.onload = function{}, то срабатывает только одно событие...
ManHunter
(15.09.2009 в 18:43):
Ну и пиши 10 раз "safeAddLoadFunction", проблем-то
Алексей
(15.09.2009 в 18:41):
А если у меня их 10???
ManHunter
(30.07.2009 в 23:20):
Юрий, комментатор явно ленивый читатель. Если мне доступны скрипты для редактирования, то я и в них самих могу все что надо прописать, без ненужных извратов с "this.onload.prev();", достаточно сделать
window.onload = func2;
function func() {
...
}
function func2() {
...
func();
}
И дальше по цепочке сколько мне надо. А давай я заверну пару-тройку скриптов обфускатором и положу себе на сервак. И посмотрим сколько ты в них пропишешь своих "огородов".
window.onload = func2;
function func() {
...
}
function func2() {
...
func();
}
И дальше по цепочке сколько мне надо. А давай я заверну пару-тройку скриптов обфускатором и положу себе на сервак. И посмотрим сколько ты в них пропишешь своих "огородов".
Юрий
(30.07.2009 в 22:42):
Автор явно не ленивый программист :). Решается эта проблема так:
window.onload = func;
/* Функция тоже объект. Поэтому добавим к объекту func2 свойство prev,
в котором сохраним ссылку на предыдущий обработчик onload. Эту
ссылку в теле самой функции (func2) потом вытащим на "свет". :) */
func2.prev = window.onload;
window.onload = func2;
function func() {
alert('Я пришел первым, а уйду последним');
}
function func2() {
alert('Я пришел последним, а уйду первым');
this.onload.prev();
}
и не нужно городить "огород"...
window.onload = func;
/* Функция тоже объект. Поэтому добавим к объекту func2 свойство prev,
в котором сохраним ссылку на предыдущий обработчик onload. Эту
ссылку в теле самой функции (func2) потом вытащим на "свет". :) */
func2.prev = window.onload;
window.onload = func2;
function func() {
alert('Я пришел первым, а уйду последним');
}
function func2() {
alert('Я пришел последним, а уйду первым');
this.onload.prev();
}
и не нужно городить "огород"...
Добавить комментарий
Заполните форму для добавления комментария