Я готовлю HTML-код в памяти для iframe, когда я использую append, он выполняет код.
html = $(parser.parseFromString($("#EHtml").val(), "text/html"));
js = '<script>' + $("#EJs").val() + '</script>';
html.find('body').append(js);
$("#EHtml").val()
содержит HTML-код, а функция append выполняет свою работу, но также выполняет код. Любые мысли здесь?
Вам нужно просто сохранить ссылку на строку кода и сделать одну из двух вещей: либо добавлять взаимодействие только тогда, когда вы хотите запустить код позже, либо запустить eval(jsString)
когда хотите его запустить.
Теги скрипта не будут выполняться, если их атрибут [type]
установлен на все, что угодно wacky.
<script type="wacky/non-executing">
console.log("This will not execute! You will not see this!");
</script>
Его очевидный запуск сценария при его вставке между ярлыками сценариев, потому что ваш DOM уже заполняет нагрузки. И он будет работать дважды, потому что вы помещаете его в body
Поэтому, когда содержимое вашего тела сжимает скрипт, он снова запускается!
Таким образом, вы должны установить свой тег Script во главе iframe
чтобы он запускался только тогда, когда вы вставляете его или перезагружаете, а не снова!
Я не предлагаю вам использовать eval()
потому что это опасно для оценки скрипта, eval()
в основном используется для другой цели!
Используйте теги <script></script>
чтобы запустить скрипт и поместить его на head
если вы не хотите запускать его дважды.
var script = document.createElement('script');
script.innerHTML = $("#EJs").val();
iframe.contentWindow.document.head.appendChild(script);
Может быть, это поможет вам..
Получил это так, как мне нужно. Я пытался добавить тег сценария, не используя пути вокруг проблемы - я имею в виду, что я просто хотел добавить тег как есть. Спасибо каждому органу за входные данные - я получил решение от ваших советов... в конце концов, я мог добавить в iframe, но он выполнялся в контексте главной страницы. Что вызвало проблему, было использование JQuery для добавления... так вот это:
frame = document.getElementById("frame");
out = (frame.contentWindow) ? frame.contentWindow : (frame.contentDocument.document) ? frame.contentDocument.document : frame.contentDocument;
out.document.open();
out.document.write(html.find('html')[0].outerHTML);//HTML added here
//JS appended here
js=out.document.createElement('script');
js.innerHTML = 'js code here';
out.document.getElementsByTagName("body")[0].appendChild(js);
out.document.close();
Надеюсь, это полезно для кого-то...
Попробуйте использовать объекты, например
var encodeHtmlEntity = function(str) {
var buf = [];
for (var i=str.length-1;i>=0;i--) {
buf.unshift(['&#', str[i].charCodeAt(), ';'].join(''));
}
return buf.join('');
};
html.find('body').append(encodeHtmlEntity(js));
добавлять и
var decodeHtmlEntity = function(str) {
return str.replace(/&#(\d+);/g, function(match, dec) {
return String.fromCharCode(dec);
});
};
decodeHtmlEntity(html.find('body').val());
читать.
$("#EJs").val()