Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / (JavaScript) Почему в FF не исполняется клонированный тэг script? / 5 сообщений из 5, страница 1 из 1
21.11.2009, 18:11
    #36323915
NT Man
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) Почему в FF не исполняется клонированный тэг script?
Ниже наглядный пример, который через метод replaceChild инициирует запуск вставленных в DOM скриптов. Только в первом случае подготовка делается через createElement, во втором через cloneNode. Мне лично больше нравиться второй вариант, который и компактнее и правильнее т.к. позволяет копировать всевозможные атрибуты. Но почему второй вариант не нравиться мозилле я не понимаю.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Внедренный JavaScript</title>
<script type="text/javascript">
function ggg(k) {
    var to = document.getElementById("bbb");
    to.innerHTML = 'Some text<br/><script id="fedora-banner" type="text/javascript" \
	src="http://fedoraproject.org/static/js/release-counter-ext.js?lang=ru"><\/script>';
 
    //Исполнение внедренных JavaScript скриптов
    var scripts = to.getElementsByTagName("script");
    var script;
    for (var i =  0 ; script = scripts[i]; i++)
    switch (k) {
    case  1 :
        //Везде работает
        var newScript = document.createElement('script');
        newScript.type="text/javascript";
        if (script.id) newScript.id = script.id;
        if (script.src) newScript.src = script.src;
        if (script.text) newScript.text = script.text;
        script.parentNode.replaceChild(newScript, script);
        break;
    case  2 :
        //В Mozilla FF не работает (в IE, Opera, Chrome - работает)
        var newScript = script.cloneNode(true);
        script.parentNode.replaceChild(newScript, script);
        break;
    }
}
</script>
</head>
<body>  
<input type="button" value="exec v1" onclick="ggg(1)" />
<input type="button" value="exec v2" onclick="ggg(2)" />
<div id="bbb" />
</body>
</html>
...
Рейтинг: 0 / 0
21.11.2009, 22:13
    #36324073
------------209384
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) Почему в FF не исполняется клонированный тэг script?
Твое решение использует тн "побочный эффект". Мозилка работает правильно. Но кто сказал что скрипт должен выполняться. У разных браузеров это происходит по-разному. Скрипт выполняется при изменении свойства src или при добавлении скрипта к дереву документа.

А почему ты считаешь что действуешь "правильно"?
...
Рейтинг: 0 / 0
22.11.2009, 02:12
    #36324200
NT Man
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) Почему в FF не исполняется клонированный тэг script?
------------209384Скрипт выполняется при изменении свойства src или при добавлении скрипта к дереву документа.
А чем replaceChild не добавление скрипта к дереву? Тем более в варианте №1 тот-же replaceChild прокатывает везде.

------------209384А почему ты считаешь что действуешь "правильно"?
Вообще изначально было так
Код: plaintext
1.
2.
3.
4.
5.
var newScript = document.createElement('script');
newScript.type="text/javascript";
if (script.src) newScript.src = script.src;
if (script.text) newScript.text = script.text;
script.parentNode.replaceChild(newScript, script);
Потом я обнаружил что вставка кода
Код: plaintext
1.
<script id="fedora-banner" type="text/javascript" \
src="http://fedoraproject.org/static/js/release-counter-ext.js?lang=ru"><\/script>'
не отрабатывает, полез разбираться оказалось что код завязан на на id, быстренько добавил заполнение атрибута id и все заработало. Потом подумал, а ведь могут когда нибудь завязаться на какой нибудь другой атрибут (возможно вообще отсутствующим в текущей спецификации) и поэтому лучше не создавать новый тэг и копировать известные атрибуты, а лучше его клонировать и не задумываться о нужных атрибутах вообще. Попробовал и оказалось, что в лисе не все так-то просто.
...
Рейтинг: 0 / 0
22.11.2009, 03:31
    #36324214
(JavaScript) Почему в FF не исполняется клонированный тэг script?
Логика понятна. Решения такие
1) или клонируя присваивай заново src - некоторые запускают скрипт именно в этот момент.
2) или создавай новый элемент скрипт, перебирая атрибуты for in.
3) возможно придется вместо replace делать append

Что-то я сам пытался экономить память на элементах скрипт и даже повторно их использовать, но увы некоторые браузеры стреляют скрипт один раз (видимо защита от повторного выполнения скриптов при различных комбинациях действий программиста)
...
Рейтинг: 0 / 0
22.11.2009, 03:33
    #36324215
(JavaScript) Почему в FF не исполняется клонированный тэг script?
By the way.
Возможно требуется изменение адреса, например путем добавления рандомного параметра запроса
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / (JavaScript) Почему в FF не исполняется клонированный тэг script? / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]