为什么第二次尝试将脚本加载到空iframe失败?我理解第一个失败,因为我试图在页面加载后加载脚本,但我本来期望第二次和第三次尝试工作。我认为它可能是浏览器的安全限制,但通常你会在控制台中看到错误并用<script>alert(1);</script>
替换脚本工作正常。
<iframe id="blah1">
</iframe>
<iframe id="blah2">
</iframe>
<iframe id="blah2-2">
</iframe>
<iframe id="blah3">
</iframe>
(function(){
var content = '<html><head></head><body>' + '<' + 'scr' + 'ipt src="//content.jwplatform.com/players/81b03hN1-8gn7GBWz.js"><\/'+'scr' + 'ipt'+'>' + '</body></html>';
//attempt 1
var $body = $('body', $('#blah1').get(0).contentWindow.document);
$body.html(content);
//attempt 2
$('#blah2').attr('src', "data:text/html;charset=utf-8," + escape(content));
//simple alerts work
$('#blah2-2').attr('src', "data:text/html;charset=utf-8," + escape('<sc' + 'ript>alert(1);</scr' + 'ipt>'));
//attempt 3
var doc = $('#blah3').get(0).contentWindow.document;
doc.open();
doc.write(content);
doc.close();
})();
在firefox中运行后,我看到了一些与ssl相关的错误,所以它可能无法工作,因为base64 iframe被视为一个http窗口,尽管你在Chrome控制台中没有看到任何关于ssl错误的内容,所以它可能是无关的。 / p>
答案 0 :(得分:0)
原来你没有看到chrome中的任何ssl错误,因为你在使用base64数据URI时无法使用协议相对脚本URL,奇怪的是如果我使用srcdoc来设置iframe内容(在示例中注释掉)协议相对脚本URL工作。一旦我解决了这个问题,看起来ssl错误会导致玩家无法加载足够的问题。
播放器脚本实际上处理HTTP和HTTPS之间的切换,但是当检查正在进行window.location.href.indexOf("https")
时,它始终认为您在HTTP上并加载了错误的脚本
(function(){
var content = '<html><head></head><body>' +
'<' + 'scr' + 'ipt>' + `
console.log(window.location.protocol, window.location.href, window.location.href.indexOf("https"));
` + '<\/'+'scr' + 'ipt'+'>' +
'<' + 'scr' + 'ipt src="https://content.jwplatform.com/players/81b03hN1-8gn7GBWz.js"><\/'+'scr' + 'ipt'+'>' + '</body></html>';
$('#blah1').attr('src', "data:text/html;charset=utf-8," + escape(content));
//$('#blah1').attr('srcdoc', content);
})();
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<iframe id="blah1">
</iframe>
&#13;