2017-07-06 120 views
0

爲什麼第二次嘗試將腳本加載到空的iframe時失敗?我瞭解第一個失敗,因爲我試圖加載頁面後加載腳本,但我會期望第二次和第三次嘗試工作。我認爲這可能是瀏覽器的安全限制,但通常情況下,您會在控制檯中看到一個錯誤,並用類似<script>alert(1);</script>的東西代替腳本正常工作。爲什麼將base64內容加載到iframe src屬性有時會失敗

jsfiddle link

HTML

<iframe id="blah1"> 
</iframe> 

<iframe id="blah2"> 
</iframe> 

<iframe id="blah2-2"> 
</iframe> 

<iframe id="blah3"> 
</iframe> 

的JavaScript

(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處理窗口,雖然你沒有在鉻控制檯中看到任何關於ssl錯誤,所以它可能是無關的。

+0

也許不相關的你問,但你爲什麼這樣做:''+'<'+'scr'+'ipt'? – abimelex

+0

@abimelex jsfiddle抱怨腳本內的腳本標記,我也發現一些瀏覽器不會允許你寫出腳本,無論是出於安全原因(雖然在這種情況下,我不能檢查,因爲js小提琴不會運行) – Snipzwolf

回答

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>' + ` 
 
    \t 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); 
 
})();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<iframe id="blah1"> 
 
</iframe>