Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.12.2019, 14:26
Новичок на форуме
Отправить личное сообщение для Domik941 Посмотреть профиль Найти все сообщения от Domik941
 
Регистрация: 27.12.2019
Сообщений: 2

innerHTML и обработка js внутри него
Доброго времени суток.

Я столкнулся с необходимостью замены части HTML кода внутри div'a, но если в заменяемом коде есть <script>...</script>, то эти скрипты не выполняются. Вы не могли бы объяснить как мне быть в этой ситуации, чтобы вставленный HTML+JS код работал корректно.

Либо же мне вставляемый код разбирать по тегам, и создавать каждый из них через createElement ?

Спасибо за ответ.
Ответить с цитированием
  #2 (permalink)  
Старый 27.12.2019, 14:29
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Domik941, пример тестовый нужно делать для иллюстрации проблемы...
Ответить с цитированием
  #3 (permalink)  
Старый 27.12.2019, 14:44
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Сообщение от Domik941
и создавать каждый из них через createElement ?
Ответить с цитированием
  #4 (permalink)  
Старый 27.12.2019, 14:46
Новичок на форуме
Отправить личное сообщение для Domik941 Посмотреть профиль Найти все сообщения от Domik941
 
Регистрация: 27.12.2019
Сообщений: 2

Сообщение от ksa Посмотреть сообщение
Domik941, пример тестовый нужно делать для иллюстрации проблемы...


<html>
<head>
    <title>test js page</title>
</head>
<body>
<script>alert("hello 111");</script>
<div>the 1 tag</div>
<div>the 2 tag</div>
<div>the 3 tag</div>

<script type="text/javascript" charset="UTF-8" src="script.js"></script>

<div>the 4 tag</div>
<div>the 5 tag</div>
<div>the 6 tag</div>
</body>
</html>


script.js:
var temp = document.getElementsByTagName('div');
var testHtml = '<script>alert("hello 222");</script>';
temp[2].innerHTML = (testHtml);
Ответить с цитированием
  #5 (permalink)  
Старый 27.12.2019, 15:00
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Domik941, из примера не совсем понятно зачем исполняемый код вставлять через innerHTML в какой-то ДИВ... Если хочется простого его исполнения...

Если нужен запуск некоего скрипта, так это делается так
https://habr.com/ru/post/182310/
Ответить с цитированием
  #6 (permalink)  
Старый 27.12.2019, 15:30
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

вставка html script
Domik941,
возможный вариант ...
<html>
<head>
    <title>test js page</title>
</head>
<body>
<script>alert("hello 111");</script>
<div>the 1 tag</div>
<div>the 2 tag</div>
<div>the 3 tag</div>

<script>
var testHtml = '<p>test script<\/p><script>alert("hello 222");<\/script>';
var parser = new DOMParser();
var doc = parser.parseFromString(testHtml, "text/html");
var div = document.querySelectorAll('div')[2];
div.innerHTML = "";
[...doc.body.children].forEach(el => {
if(el.tagName == "SCRIPT") {
 var s = document.createElement('script');
 s.type = "text/javascript";
 s.text = el.text;
 el = s;
}
div.append(el);
} )

</script>

<div>the 4 tag</div>
<div>the 5 tag</div>
<div>the 6 tag</div>
</body>
</html>

Последний раз редактировалось рони, 27.12.2019 в 15:36.
Ответить с цитированием
  #7 (permalink)  
Старый 28.12.2019, 19:57
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

рони,
[...doc.body.children].forEach(el => {
if(el.tagName == "SCRIPT") {
лишний код, подход при этом часто встречается
ничего не мешает вставить скрипт в body без этого
скрипты вставленные динамически выполняются асинхронно, разницы нет
type также незачем, насколько я помню он по умолчанию "text/javascript";
<body>
<script>
var s = document.createElement('script');
s.text = "alert('Work')";
document.body.appendChild(s);
</script>
</body>
Ответить с цитированием
  #8 (permalink)  
Старый 28.12.2019, 20:35
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Сообщение от Poznakomlus
лишний код,
а как остальные элементы вставить?
Ответить с цитированием
  #9 (permalink)  
Старый 28.12.2019, 21:05
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

рони,

doc в js на вебе это document
здесь ты нелогично назвал переменную, чем и ввел меня в заблуждение
а остальные элементы вставлять по ходу и не надо
у человека проблема простая, он получает текст к примеру аяксом, вставляет его в документ, в нем есть скрипт и он хочет, чтобы он так-же отработал
само наличие такой проблемы говорит о неправильном подходе(структуре,логике)
по сути может быть тег script как с внешним файлом так и и скодом
и тут уже стоило бы написать парсер для синхронной загрузки скрипта и после load выполнение кода
описал как понял сам
Ответить с цитированием
  #10 (permalink)  
Старый 30.12.2019, 00:11
Интересующийся
Отправить личное сообщение для Domik942 Посмотреть профиль Найти все сообщения от Domik942
 
Регистрация: 29.12.2019
Сообщений: 19

Сообщение от рони Посмотреть сообщение
Domik941,
возможный вариант ...
Спасибо за решение, работает отлично.

Подскажите пожалуйста, а как мне сделать тоже самое на уровне тега <html> ?

Я попробовал поиграться с содержимым страницы целиком, начиная от тега <html>, но пытаясь добавить теги в html следующим кодом.


var testHtml = '<head><title>second page</title><script>alert("hello 111");</script></head><body><p>test script</p><script>alert("hello 222");</script><div>the 7 tag</div><div>the 8 tag</div><div>the 9 tag</div></body>';
var parser = new DOMParser();
var doc = parser.parseFromString(testHtml, "text/html");
var html = document.querySelectorAll('html')[0];
html.innerHTML = "";
[...doc.body.children].forEach(el => {
    if(el.tagName == "SCRIPT") {
        var s = document.createElement('script');
        s.type = "text/javascript";
        s.text = el.text;
        el = s;
    }
    html.append(el);
} )


Испектор показывает следующий HTML

<html>
<head></head>
<body></body>
<p>test script</p>
<script type="text/javascript">alert("hello 222");</script>
<div>the 7 tag</div>
<div>the 8 tag</div>
<div>the 9 tag</div>
</html>



Подскажите пожалуйста что я упустил.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Анализ и обработка js m4gz Общие вопросы Javascript 4 27.10.2011 12:10
JS внутри AJAX pagal AJAX и COMET 8 11.10.2011 11:19
Как получит ссылку на элемент внутри которого запустили JS код? aRpi Events/DOM/Window 20 02.10.2011 13:36
JS to innerHTML helgi AJAX и COMET 4 07.12.2008 20:50
Обработка JS в FireFox Andrey_Ugnich Firefox/Mozilla 7 21.06.2008 17:15