как я могу загрузить <script>в iframe? - PullRequest
9 голосов
/ 14 октября 2010

У меня есть логика, работающая для добавления в мой iframe от родителя

, это работает:

$('#iframe').load(function() {
  $(this).contents().find('#target').append('this text has been inserted into the iframe by jquery');    
});

это не

$('#iframe').load(function() {
  $(this).contents().find('body').append('<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>');    
});

.lf

Проблема в том, что вставленные теги сценария не экранированы должным образом.Половина javascript становится видимой в html, как первый тег script был внезапно завершен.

Ответы [ 3 ]

11 голосов
/ 14 октября 2010

Возможно, ошибка связана с вашей строкой, никогда не создавайте строку в javascript с литералом .

$('#iframe').load(function() {
  $(this).contents().find('body').append('<scr' + 'ipt type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></scr' + 'ipt>');    
});
8 голосов
/ 14 октября 2010

Я немного удивлен, что не работает [Редактировать: больше не удивлен, смотрите ответ mtrovo .] ... новот что я делаю, что в основном non-jQuery для вашего комментария ниже, но все еще довольно краткое:

var rawframe = document.getElementById('theframe');
var framedoc = rawframe.contentDocument;
if (!framedoc && rawframe.contentWindow) {
    framedoc = rawframe.contentWindow.document;
}
var script = doc.createElement('script');
script.type = "text/javascript";
script.src = "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js";
framedoc.body.appendChild(script);

Не по теме: я действительно не будетдать iframe (или что-нибудь еще) идентификатор "iframe".Такое ощущение, что это вызывает проблемы (IE имеет проблемы с пространством имен, и хотя я не знаю, что это путает имена тегов и идентификаторы, я не был бы полностью шокирован).Вместо этого я использовал "theframe" выше.

4 голосов
/ 12 ноября 2012

Предупреждение: загрузка сценария таким образом приведет к выполнению сценариев в контексте главного окна Т.е. если вы используете окно из somescript.js, это будет НЕ окно iframe!

$('#iframe').load(function() {
    $(this).contents().find('body').append('<scr' + 'ipt type="text/javascript" src="somescript.js"></scr' + 'ipt>');    
});

Чтобы можно было использовать скрипт вставки контекста iframe с этим:

function insertScript(doc, target, src, callback) {
    var s = doc.createElement("script");
    s.type = "text/javascript";
    if(callback) {
        if (s.readyState){  //IE
            s.onreadystatechange = function(){
                if (s.readyState == "loaded" ||
                    s.readyState == "complete"){
                    s.onreadystatechange = null;
                    callback();
                }
            };
        } else {  //Others
            s.onload = function(){
                callback();
            };
        }
    }
    s.src = src;
    target.appendChild(s);        
}

var elFrame = document.getElementById('#iframe');
$(elFrame).load(function(){
    var context = this.contentDocument;
    var frameHead = context.getElementsByTagName('head').item(0);
    insertScript(context, frameHead, '/js/somescript.js');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...