Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.01.2015, 20:03
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Скрипт не работает, если parentNode==null?
Обнаружил, что javascript не работает, если он прописан внутри тега DIV, который не находится в DOM. И это хорошо!
Вот только не могу найти информацию, это правильно/неправильно и задокументировано ли где-то? Хочу построить на этом систему, но не уверен, что это так и останется.
<html>
<body>
<div id ='content'>qwerty

<script>
alert(123); // здесь этот скрипт сработает
</script>
  
</div>
  
</body>
</html>

<html>
<body>
<div id ='content'>qwerty

<script>
var o=document.getElementById('content');    
o.parentNode.removeChild(o); // удаляем сами себя из DOM прямо в процессе загрузки страницы
</script>  
  
<script>
alert(123); // а здесь этот скрипт не сработает! это правильно?
</script>
  
</div>
  
</body>
</html>

P.S. данный фокус не проходит в IE8.
Ответить с цитированием
  #2 (permalink)  
Старый 23.01.2015, 20:12
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Маэстро, потому что на момент удаления дива второй скрипт ещё не был загружен, а после удаления и вовсе перестаёт существовать.
Ответить с цитированием
  #3 (permalink)  
Старый 23.01.2015, 20:19
Профессор
Отправить личное сообщение для SV0L0CH Посмотреть профиль Найти все сообщения от SV0L0CH
 
Регистрация: 07.11.2010
Сообщений: 301

Могу предложить заодно проверить что будет если один и тот же <script/> многократно вставлять в DOM.
Ато мне лень, но интересно
Ответить с цитированием
  #4 (permalink)  
Старый 23.01.2015, 20:25
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Сообщение от Ruslan_xDD Посмотреть сообщение
... а после удаления и вовсе перестаёт существовать.
-Неверно. Скрипт жив и существует. Попробуйте по факту загрузки документа вернуть его обратно в BODY и он даже сразу выполнится!

<html>
<body>
<div id ='content'>qwerty

<script>
window.onload = function()  
{
alert('загрузили страницу, теперь страшный скрипт сработает')
document.body.appendChild(o);
};
  
var o=document.getElementById('content');    
o.parentNode.removeChild(o); // удаляем сами себя из DOM прямо в процессе загрузки страницы
</script>  
  
<script>
alert(123); // а здесь этот страшный скрипт не сработает! это правильно?
</script>
  
</div>
  
</body>
</html>
Ответить с цитированием
  #5 (permalink)  
Старый 23.01.2015, 20:45
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Не менее удивительно то, что при наличии внутри DIV_а трех скриптов первые два сработают до удаления DIV со страницы, а после последующей вставки обратно сработает только третий скрипт, но не сработают первые два!
<html>
<body>

<script>
window.onload = function()  
{
alert('загрузили страницу и вставляем DIV со скриптами обратно в BODY; после этого сработает только скрипт №3')
document.body.appendChild(o);
};
</script>
  
 
<div id ='content'>qwerty  
 
<script>
alert('скрипт 1'); // скрипт №1 сработает до удаления DIV из BODY, но не сработает после вставки DIV обратно в BODY
</script>  
  
<script>
alert('скрипт 2'); // скрипт №2 сработает до удаления DIV из BODY, но не сработает после вставки DIV обратно в BODY  
var o=document.getElementById('content');    
o.parentNode.removeChild(o); // удаляем сами себя из DOM прямо в процессе загрузки страницы
</script>  
  
<script>
alert('скрипт 3'); // скрипт №3 не сработает после удаления DIV из BODY, но сработает после вставки DIV обратно в BODY
</script>
  
</div>
  
</body>
</html>

Последний раз редактировалось Маэстро, 23.01.2015 в 22:04.
Ответить с цитированием
  #6 (permalink)  
Старый 23.01.2015, 21:59
Профессор
Отправить личное сообщение для SV0L0CH Посмотреть профиль Найти все сообщения от SV0L0CH
 
Регистрация: 07.11.2010
Сообщений: 301

Маэстро,
Пометь свои примеры [HTML run] чтобы было удобно смотреть. Может кто отпишется о отличиях между различными браузерами.
Ответить с цитированием
  #7 (permalink)  
Старый 23.01.2015, 21:59
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Все это описано в спецификации: https://html.spec.whatwg.org/multipa...script-element

Если вкратце, то у элементов <script> есть внутренние флаги, отражающие состояние - parser-inserted, already-started и т.д.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #8 (permalink)  
Старый 23.01.2015, 22:01
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от SV0L0CH
Может кто отпишется о отличиях между различными браузерами
Все современные браузеры имеют HTML5-парсеры и следуют спецификации. Процесс парсинга там очень подробно расписан.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #9 (permalink)  
Старый 23.01.2015, 22:06
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Сообщение от SV0L0CH Посмотреть сообщение
Маэстро,
Пометь свои примеры [HTML run] чтобы было удобно смотреть. Может кто отпишется о отличиях между различными браузерами.
-пометил
-я проверяю в IE10 и последних версиях Google Chrome, FireFox, Opera - результат одинаков.
Ответить с цитированием
  #10 (permalink)  
Старый 23.01.2015, 22:08
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Сообщение от danik.js Посмотреть сообщение
Все это описано в спецификации: https://html.spec.whatwg.org/multipa...script-element
Если вкратце, то у элементов <script> есть внутренние флаги, отражающие состояние - parser-inserted, already-started и т.д.
Спасибо, а Вы можете сказать (своё мнение) так описанное мною поведение правильно или нет?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает скрипт если указать doctype soltx Элементы интерфейса 4 24.12.2014 16:52
??? Скрипт не работает в IE, FF и Opera, но работает в Chrome и Safari psiworm jQuery 1 28.01.2013 10:05
Почему скрипт не работает с данными, которые вернул другой скрипт? Rooner jQuery 3 20.09.2012 14:56
не работает jquery скрипт, если её подклучаю dadli Общие вопросы Javascript 7 15.05.2012 11:11
не работает скрипт под мозилой kent666 Events/DOM/Window 2 10.10.2011 17:54