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, время: 19:33. |