Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Порядок выполнения скриптов на странице (https://javascript.ru/forum/misc/3052-poryadok-vypolneniya-skriptov-na-stranice.html)

kefi 13.03.2009 14:38

Порядок выполнения скриптов на странице
 
Может кто-нибудь объяснить, или дать хорошую ссылку на объяснение :

Интересует порядок подгрузки и выполнения скриптов на странице с учетом возможного перекрытия во время подгрузки имен переменных и функций , а также желательно с учетом возможных динамически подгружаемых скриптов , если такое вообще возможно ...
- общая такая ,понятная такая ,всеохватная такая схема без лишнего словоблудия ?

Kolyaj 13.03.2009 14:45

Сверху вниз.

kefi 13.03.2009 14:48

2 Kolyaj > Очень понятно, особенно в контексте динамической подгрузки скриптов ... Прочтите, плз, еще раз поправленный мной первый пост

Kolyaj 13.03.2009 14:52

По порядку. Вы чего вообще услышать хотите? Как браузер встретит скрипт, так его и выполнит. Если у вас какой-то специфический случай, так протестируйте. Создайте 10 файлов с alert(1, 2, ..., 10).

kefi 13.03.2009 15:21

2 Kolyaj> Что хочу услышать , я указал в первом посте. Как браузер "встретит скрипт" - непонятно, я и хотел понять - как он "встретит", хотя слово "встретит" здесь не очень подходит.
Каждый случай можно объявить специфическим, я же хочу понять общую схему обработки динамически подгружающихся скриптов с перекрывающимися именами. Ваши слова пока никак не коснулись поставленных мной вопросов, но если Вы еще их не поняли, то лучше не отвечайте вовсе.

Gvozd 13.03.2009 15:33

Цитата:

Сообщение от kefi
подгружающихся скриптов с перекрывающимися именами

начнем с того что вы понимаете под именем скрипта?
имя файла?чем ответ Kolyaj меняется от этого факта?
имя глобыльных переменных?
они будут использоватся как глобальные переменные.
что вы хотите услышать?

Zibba 13.03.2009 15:34

Очерёдность событий и синхронизация в JavaScript

kefi 13.03.2009 15:52

[quote=Gvozd;14196]начнем с того что вы понимаете под именем скрипта? /QUOTE]
Во-первых, я нигде не говорил об имени скрипта, чтобы конкретизировать я говорил об именах переменных и функций. Но раз уж Вы упомянули, то - и имя скрипта тоже.

Например, в HEAD определены :
<SCRIPT type="text/javascript" src="global/hello.js"></SCRIPT>
<SCRIPT type="text/javascript" src="global/hello.js"></SCRIPT> - Загрузится повторно или нет ?
<SCRIPT type="text/javascript" src="/My1.js"></SCRIPT> - Если он содержит функции с теми же именами , что и в выше загруженных скриптах , то какие будут выполняться в действительности или вообще будет ошибка ? То же насчет глобальных переменных - ?

Дальше в BODY определены :
<SCRIPT type="text/javascript" src="/My2.js"></SCRIPT>

Дальше в eval выполняется еще скрипты с теми же именами переменных, что уже загружены на странице - как будет производится разрешение имен ?

Может ли быть ситуация когда скритпы уже загружены(например в HEAD) , но элементы страницы , которые они обрабатывают(например элементы в BODY), еще нет ? Как в этой ситуации разобраться ?

И еще можно поставить кучу вопросов, только все они умещаются в стартовом посте этой темы и ни к чему приводить конкретные примеры, когда нужна ОБЩАЯ схема решения .

Gvozd 13.03.2009 16:03

Цитата:

Сообщение от kefi
Загрузится повторно или нет ?

а вы-то как думаете?
конечно загрузится.вопрос только откуда он будет грузится:с сервера по новой, или из кеша браузера.на этот вопрос уже нету тоднозначного ответа.зависит от того, как вы настроили кеширование на сервере и от браузера
Цитата:

Сообщение от kefi
Если он содержит функции с теми же именами , что и в выше загруженных скриптах , то какие будут выполняться в действительности или вообще будет ошибка ? То же насчет глобальных переменных - ?

по моему и тут ответ более чем очевиден
что по вашему сделает код:
a=100;
a=200;

переопределит пременную
глобальные функции и глобальные пременные переопределятся, независимо от того, где это было сделано.
советую вам проситать статью о областях видимости

Цитата:

Сообщение от kefi
Дальше в eval выполняется еще скрипты с теми же именами переменных, что уже загружены на странице - как будет производится разрешение имен ?

насколько я помню это зависит от браузера.
если не ошибаюсь осел ведет себя не как все остальные.
напишите небольшой тест, и проверьте

Цитата:

Сообщение от kefi
Может ли быть ситуация когда скритпы уже загружены(например в HEAD) , но элементы страницы , которые они обрабатывают(например элементы в BODY), еще нет ? Как в этой ситуации разобраться ?

может.
более того это одна из самых распрастраненых ошибок новичков.
сделать можно несколько вещей:
1)расположить скрипт не в теге head, а после элементов с которыми он работает
2)обернуть код в функцию, и выполнить его либо по событию window.onload, либо по таймауту

как видите ответы на почти все ваши вопросы вполне очевидны, если подумать немного.а если не уверены, то всегда можно проверить скриптом

AzriMan 13.03.2009 16:21

Цитата:

Сообщение от Gvozd (Сообщение 14202)
может.
более того это одна из самых распрастраненых ошибок новичков.
сделать можно несколько вещей:
1)расположить скрипт не в теге head, а после элементов с которыми он работает
2)обернуть код в функцию, и выполнить его либо по событию window.onload, либо по таймауту

а если воспользоваться этим советом? http://javascript.ru/optimize/perfor...ules#js_bottom

p.s. добавлю от себя. у меня страница загружается как есть. после этого выполняется ф-я, повешенная на событие onLoad, которая уже изменяет страницу как надо (это при условии если эти изменения нельзя совершить в процессе загрузки). на крайний случай (что бы пользователю не был виден процесс "изменений") я нужней элемент оборачиваю скрытым дивом, изменяю, и делаю его видимым. или, еще на крайний случай, вставляю слово "Загрузка", изменяю нужный элемент, "Загрузку" удаляю и делаю тот блок видимым :)

kefi 13.03.2009 16:55

Цитата:

Сообщение от Gvozd (Сообщение 14202)
как видите ответы на почти все ваши вопросы вполне очевидны, если подумать немного.а если не уверены, то всегда можно проверить скриптом

Я думаю, что новичку это не очевидно. Как видите, УЖЕ вместо ЯСНОЙ СХЕМЫ сборки JavaScript программы на странице имеем разодранные рекомендации, требующие напряжения мозгов и тестирования для их использования . Например, решение проблемы бездубликатной подгрузки скриптов (т.е. бездубликатной загрузки внешних функций и/или самих скриптов в т.ч. предотвращения зацикливания подгрузки скриптов ) вообще пока не предлагается.
Поэтому-то я и искал подход, где бы это было максимально ясно и полно изложено.

Gvozd 13.03.2009 17:32

AzriMan,
ссылка, которую вы дали дублирует первый пункт указанный мною, и процитированный вами

kefi,
сейчас попытаюсь сформулировать все одной фразой.скорее всего это только запутает вас.
скрипты загружаются и выполняются последовательно, по очереди.
можете представить себе очередь,в которую попадают скрипты, и выходят после своего выполнения.
при добавлении новых элементов script они также попадают в конец этой очереди на равных правах.
у всех скриптов одна глобальная область видимости переменных и функций.вообще, грубо говоря функции по сути ничем не отличаюстя от прочих пременных-объектов.все глобальные функции и объекты являются свойствами объекта window.и их можно преопределять(кроме встроенных.с ними чуть сложнеее) абсолютно спокойно.то есть если вы переопределили функцию, то дальше будет выполнятся именно новый код.и переменные также будут в дальнейшем иметь новое значение
по поводу же локальных контекстов я уже давал ссылку выше.
по поводу асинхронного кода, вам также давалась ссылка выше.но в общем-тол тут также сохраняется очередь.JS-однопоточный язык с псевдомногопоточностью

kefi 09.04.2009 23:46

Цитата:

Сообщение от Gvozd
JS-однопоточный язык с псевдомногопоточностью

Вот такой возник вопрос :
Может ли быть прерван внешними событиями код выполняемой функции и в каких случаях ?

Gvozd 10.04.2009 00:02

думаю, при закрытии окна/вкладки и переходе на другую страницу.
естественно, что все эти события в таком контексте могут юыть вызваны только пользователем
собственно другим скриптом, по определению нельзя прервать

x-yuri 10.04.2009 11:49

Цитата:

Ваши слова пока никак не коснулись поставленных мной вопросов, но если Вы еще их не поняли, то лучше не отвечайте вовсе
если вы не поняли ответ, то спросите, что непонятно
самое смешное, что вам сообщили общую схему, вы говорите - не то, вам начинают рассказывать подробности, вы говорите - нужна общая схема

kefi 10.04.2009 12:57

2 x-yuri > Самое смешное то, что непонятно - Вы вообще о чем ? там человек ответил "сверху вниз", это по Вашему "общая схема" ? Да и вообще проехали уже сто лет назад, что Вы решили личностные разборки устроить ?

kefi 10.04.2009 13:01

Цитата:

Сообщение от Gvozd
думаю, при закрытии окна/вкладки и переходе на другую страницу.

Т.е.
1) выполняется код моей функции,
2) пользователь переходит на другую вкладку
3) код моей функции прерывается и, возможно, запускается код функции, повешенной на открытие той другой вкладки, он выполняется до конца, возможно изменяя объекты, над которыми трудилась моя функция
4) после чего продолжает исполняться код моей функции ?

Т.е. я хотел уточнить : javscript (или не знаю,как правильно, исполняющая среда) НЕ ГАРАНТИРУЕТ, что во время выполнения код моей функции не будет прерван и не начнет выполняться код не из моей функции( т.е. чужой код ), который может изменить объекты, с которыми работала моя функция ?

Gvozd 10.04.2009 13:30

kefi,
вы надумали много лишнего, о чем я не писал.
я писал о закрытии окна, о закрытии вкладки, о переходе на другую страницу(а не вкладку)
то есть что происходит при переходе на другую вкладку, я не знаю на самом деле.и поэтому не писал об этом
вполне возможно, что потоки в разных вкладках и самостоятельны.
точно сказать не могу


Часовой пояс GMT +3, время: 13:13.