2012-05-15 6 views
0

Я пишу сценарий, который требует, чтобы некоторые вещи выполнялись в iframe. Это usercript для сайта, который у меня нет, поэтому из-за проблем между доменами я не могу просто установить src из iframe на страницу с моим собственным кодом. Вместо этого я динамически строю iframe.Загрузить jQuery в iframe

Чтобы сделать это, у меня есть

function childScripts(){ 
    //Stuff that must be injected into the iframe. 
    //Needs jQuery 
} 


//because I'm lazy: 
var iframeWin=$('#my-iframe')[0].contentWindow; 

//Load jQuery: 
var script = iframeWin.document.createElement("script"); 
script.type = "text/javascript"; 
script.src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" 
iframeWin.document.head.appendChild(script); 

//Inject script 
var script = iframeWin.document.createElement("script"); 
script.type = "text/javascript"; 
script.textContent="("+childScripts.toString()+")()"; 
iframeWin.document.body.appendChild(script); 

Теперь нагнетаемый сценарий должен JQuery, но по какой-то причине, JQuery не загружается при запуске впрыскивается сценарий - даже если JQuery в <head> а Введенный скрипт находится в <body>.

Я пробовал другие обходные пути - делая запущенный скрипт сценария onload. Мне не нравится идея установить тайм-аут и проверить наличие jQuery, я бы предпочел более элегантное решение.

Я также попытался скопировать $ объект iframeWin.$, но, конечно, не работает, так как он просто обратные_связи родителю $ и манипулирует родительский документ.

ответ

2

Управлять iframe с помощью jQuery проще. Пожалуйста, попробуйте:

$('<iframe id="my-iframe"/>').load(function(){ 
    $('#my-iframe').contents().find('body').append('asd').end() 
          .find('body').append('<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"><\/script>').end() 
          .find('body').append('<script>$(function() {alert("hello from jquery");console.log("hello from jquery"); })<\/script>');        

}).appendTo("body"); 

Размещение:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 
    <script> 
     $('<iframe id="my-iframe"/>').load(function(){..... 
    </script> 
</body> 
</html> 
+0

Что такое 'asd' для? – Manishearth

+0

вы можете игнорировать '' asd'', забыл удалить его. Я использовал это для тестирования iframe, прежде чем я вставил теги скрипта. –

+0

По какой-то причине сценарии не добавляются в _all_. Если я удаляю 'load', то материал добавляется, но скрипты все еще удаляются. O_0 – Manishearth

Смежные вопросы