Редактировать: Решено, см. Ответ ниже.
Проблема, которую я пытаюсь решить, это скрипт загрузки рекламы, который загружает рекламный код с помощью jsonp и вставляет его в dom.
Теперь иногда рекламный код будет включать теги javascript, и из некоторых постов здесь, посвященных stackoverflow, мне пришла в голову мысль, что для их запуска нужно переместить их в начало документа, что после некоторых экспериментов побудило меня задать этот вопрос:
Добавление сценариев к заголовку с использованием javascript - странное поведение
Мой вопрос там был решен, но проблема остается, сценарии, которые я вставляю в мой тестовый блок, не запускаются и не запускаются, когдаПереместился в голову.
У меня есть пример кода здесь:
http://m.iijax.com/p1.html
И простой пример jsonp здесь:
http://m.iijax.com/p2.php
Код в p2 попытается записать сообщение на консоль, предупредить сообщение и установить переменную, которую я затем попытаюсь распечатать, и все эти вещи не срабатывают.
Является лиЕдинственный способ запустить код, какэто с помощью функции eval или я делаю какую-то основную ошибку?
Вот код для первой части:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
if (typeof JSONP === 'undefined') {
/*Lightweight JSONP fetcher - www.nonobtrusive.com*/
var JSONP = (function(){
var counter = 0, head, query, key, window = this;
function load(url) {
var script = document.createElement('script'),
done = false;
script.src = url;
script.async = true;
script.onload = script.onreadystatechange = function() {
if ( !done && (!this.readyState || this.readyState === "loaded" || this.readyState === "complete") ) {
done = true;
script.onload = script.onreadystatechange = null;
if ( script && script.parentNode ) {
script.parentNode.removeChild( script );
}
}
};
if ( !head ) {
head = document.getElementsByTagName('head')[0];
}
head.appendChild( script );
}
function jsonp(url, params, callback) {
query = "?";
params = params || {};
for ( key in params ) {
if ( params.hasOwnProperty(key) ) {
query += encodeURIComponent(key) + "=" + encodeURIComponent(params[key]) + "&";
}
}
var jsonp = "json" + (++counter);
window[ jsonp ] = function(data){
callback(data);
window[ jsonp ] = null;
try {
delete window[ jsonp ];
} catch (e) {}
};
load(url + query + "callback=" + jsonp);
return jsonp;
}
return {
get:jsonp
};
}());
}
JSONP.get( 'http://m.iijax.com/p2.php', { requestType:'demoRequest'}, function(data){
var adC = document.getElementById("testId");
adC.innerHTML = data.code;
// Move script tags to head
var scripts = adC.getElementsByTagName("script");
for(i=scripts.length - 1;i>-1;i--) {
document.head.appendChild(scripts[i]);
}
// Now check value of var letsSeeIfThisIsDefined, set in the fetched code
console.log(letsSeeIfThisIsDefined);
});
</script>
</head>
<body>
<div id="testId"></div>
</body>
</html>