HTML и JS-код в innerHTML
Здравствуйте, гуру!
Прошу помощи в нелегкой для меня задаче. На странице 1 имеется див и инклуд JS-файла. Возможно ли из этого JS-файла в див поместить смешенный текст HTML+JS (например: Привет <script>alert('HI!');</script>), так чтобы HTML вывелся и JS отработал, как будто я бы этот код изначально в див прописал? Я знаю как вывести HTML и выполнить JS, но отдельно друг от друга, но строка может содержать беспорядочную последовательность перемешанного HTML и JS-кода. Спасибо! |
С помощью eval и регулярных выражений
<div id="test"></div>
<script>
window.onload = function () {
var txt = "Hi-<script>alert('HI!'); <" + "/script>hi \
Ha-<script>alert('HA!'); <" + "/script>ha";
test.innerHTML = txt.replace(/<script>(.*?)<\/script>/ig, function (a, b) {
eval(b);
return a;
});
}
</script>
|
Спасибо за ответ.
Я пошел немного дальше и в скрипте своем учитывал не только JS-контейнеры с кодом, но и инклуды:
divObj = document.getElementById('test');
divObj.innerHTML = "ТУТ КОД";
var scripts = divObj.getElementsByTagName("script");
var script;
for(var i = 0; script = scripts[i]; i++)
{
// Если инклуд JS-скрипта
if(script.src !== undefined && script.src != '')
{
var newScript = document.createElement('script');
newScript.type = 'text/javascript';
newScript.src = script.src;
script.parentNode.insertBefore(newScript, script);
script.parentNode.removeChild(script);
}
// Если просто контейнер с JS-кодом
else
eval(script.innerHTML);
}
Все работает отлично. НО, если в инклуде встречается document.write() то FF ругается: Вызов document.write() из асинхронно-загруженного внешнего сценария был проигнорирован. Можно ли как-то избавиться от этой ошибки и игнора вызова document.write() ? ADD: Появилась мысль, а что если, при инклуде, через AJAX получать код скрипта и его запускать функцией eval? Это поможет? |
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
var newScript = document.createElement('script');
newScript.type = 'text/javascript';
newScript.src = script.src;
script.parentNode.insertBefore(newScript, script);
script.parentNode.removeChild(script);
на:
var newScript = script.cloneNode(true);
script.parentNode.insertBefore(newScript, script);
script.parentNode.removeChild(script);
Результат - перестал инклудить. Может если делать клон, то клонирование не заставляет script тэг выполниться заново? Цитата:
В общем проблема осталась нерешенной: как избавиться от ошибки "Вызов document.write() из асинхронно-загруженного внешнего сценария был проигнорирован". |
Цитата:
Цитата:
Цитата:
На ум приходит только патч функции document.write (не уверен что кроссбраузерно) |
| Часовой пояс GMT +3, время: 21:37. |