Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Как добавить блок <script> после вызвавшего его создание родителя? (https://javascript.ru/forum/events/20993-kak-dobavit-blok-script-posle-vyzvavshego-ego-sozdanie-roditelya.html)

Kotakota 25.08.2011 08:17

Как добавить блок <script> после вызвавшего его создание родителя?
 
Привет!
Есть блок <script> в котором динамически создается еще один блок <script>:
<script>
(function() {
//...blahblah
s = d.getElementsByTagName('script')[0];
var g = document.createElement('script');
g.src = 'test.js';
s.parentNode.insertBefore(g, s);
})();
</script>

У меня в <HEAD> страницы, есть подключенный jQuery и скрипт "test.js" вставляется перед ним.
А мне хочется, чтобы он вставлялся после (или перед) вызвавшим его блоком <script>:
<script>
// Здесь test.js
</script>
<script>
(function() {
//...blahblah
s = d.getElementsByTagName('script')[0];
var g = document.createElement('script');
g.src = 'test.js';
s.parentNode.insertBefore(g, s);
})();
</script>
<script>
// Или здесь test.js
</script>

Как это можно сделать?
Поиграл с "this", не помогло.

devote 25.08.2011 08:31

var head = document.getElementsByTagName('head')[0];
head.appendChild( g );

Kotakota 25.08.2011 08:36

Цитата:

Сообщение от devote (Сообщение 122296)
var head = document.getElementsByTagName('head')[0];
head.appendChild( g );

Радикально! ;)

Kotakota 25.08.2011 08:38

Все же интересно, как можно получить объект <script> из которого произошел вызов?

devote 25.08.2011 08:43

никак

Kotakota 25.08.2011 08:46

Понял, спасибо!

melky 25.08.2011 09:40

Цитата:

Сообщение от Kotakota (Сообщение 122300)
Все же интересно, как можно получить объект <script> из которого произошел вызов?

пройтись по всем скриптам и сравнить src.

Kotakota 25.08.2011 12:12

Цитата:

Сообщение от melky (Сообщение 122311)
пройтись по всем скриптам и сравнить src.

Как вариант.
Спасибо!

ваый 25.08.2011 12:25

Цитата:

Сообщение от Kotakota
Все же интересно, как можно получить объект <script> из которого произошел вызов?

Элементарно.
var scripts = document.getElementsByTagName('script').
var thisScript = scripts[scripts.length - 1]; // Вот этот объект скрипта, в котором размещены эти строки

PeaceCoder 25.08.2011 12:37

кстати немного странно. а почему this в самом скрипте не указывает на этот элемент скрипта ?

ваый 25.08.2011 12:45

Цитата:

Сообщение от PeaceCoder
кстати немного странно. а почему this в самом скрипте не указывает на этот элемент скрипта ?

Потому что this должен указывать на глобальный объект. Script - всего лишь рядовой DOM элемент, не привилегированный, с какой стати на него указывать.

melky 25.08.2011 12:49

Цитата:

Сообщение от ваый (Сообщение 122335)
Элементарно.
var scripts = document.getElementsByTagName('script').
var thisScript = scripts[scripts.length - 1]; // Вот этот объект скрипта, в котором размещены эти строки

почему вы думаете. что текущий скрипт - последний ?

по мере загрузки страницы ... любой скрипт будет последним что ли?

не понимаю

B@rmaley.e><e 25.08.2011 12:51

melky, построение DOM дерева приостанавливается на время загрузки и выполнения скрипта.

Kotakota 25.08.2011 12:54

Цитата:

Сообщение от ваый (Сообщение 122335)
Элементарно.
var scripts = document.getElementsByTagName('script').
var thisScript = scripts[scripts.length - 1]; // Вот этот объект скрипта, в котором размещены эти строки

Ну я примерно и пришел к такому варианту.
Сейчас так:
s = document.getElementsByTagName('body')[0] || document.getElementsByTagName('script')[document.getElementsByTagName('script').length];
s.appendChild(...);


Главное, чтобы в случае отсутствия тега <BODY> на странице, свой тег <SCRIPT>, был записан в конце страницы.

Kotakota 25.08.2011 13:01

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 122346)
melky, построение DOM дерева приостанавливается на время загрузки и выполнения скрипта.

Интересно!
Теперь необязательно ставить свой блок <script> в конец страницы.

ваый 25.08.2011 13:07

Цитата:

Сообщение от melky
почему вы думаете. что текущий скрипт - последний ?

по мере загрузки страницы ... любой скрипт будет последним что ли?

не понимаю

Именно. Код, который внутри тэга скрипт при загрузке тотчас же выполняется. Это значит, что на момент выполнения кода внутри script, текущий тэг script гарантированно последний. На этом и основан этот прием.

melky 25.08.2011 14:07

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 122346)
melky, построение DOM дерева приостанавливается на время загрузки и выполнения скрипта.

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

думал, что есть, всё загружено, но ничего не отрисовывается

devote 25.08.2011 17:38

ваый,
ну это тока на момент загрузки... а в процессе выполнения уже не прокатит

ваый 25.08.2011 18:05

Цитата:

Сообщение от devote
ну это тока на момент загрузки... а в процессе выполнения уже не прокатит

Разумеется. Но мы может присвоить этот объект script переменной (в момент загрузки), которая будет указывать на него и после загрузки страницы.


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