允許CEF跨域訪問iframe


默認情況下,如果嵌入本地Web頁面,並在頁面內部使用iframe來顯示一個在線頁面,加載的過程中會觸發一個未捕獲異常,虛函數CefV8ContextHandler::OnUncaughtException被調用,如果搞個控制台窗口來輸出異常消息,或者將消息打印到日志中,會是這樣:

Unsafe JavaScript attempt to access frame with URL file:///F:/Workspace/Project/WebUI_V1.0.0/WebUI/main.html from frame with URL http://112.4.xx.xx/js_app_choice/index/fac/1/uid/307839. The frame requesting access has a protocol of 'http', the frame being accessed has a protocol of 'file'. Protocols must match.

雖然此時,在線頁面嵌入成功並顯示出來了,但是,無法happy的實現父子頁面的跨域訪問,父頁面想要調子頁面的JavaScript方法,沒門,子頁面調父頁面,沒門,限制重重。根據異常消息,子頁面訪問的父頁面的URL必須為http協議,而非file協議。正常情況下,只要把父頁面傳到服務器上就可以解決協議問題。但是,我們是用CEF來做桌面程序界面,哪來的服務器,別猴急,看看Chrome瀏覽器上是怎么玩的:

給chrome啟動加個參數 --disable-web-security

方法1

  • 在命令行運行 "C:\Program Files\Google\Chrome\Application\chrome.exe" --disable-web-security

方法2

  • 在桌面復制一個chrome的快捷方式,重命名為“Chrome跨域”,右鍵“屬性”,在“目標”后面加上 --disable-web-security,即目標改為上面的"C:\Program Files\Google\Chrome\Application\chrome.exe" --disable-web-security,以后點擊上面的“Chrome跨域”啟動瀏覽器,就可以跨域訪問了

注意:啟動chrome的時候一定要關閉開着的所有chrome程序,然后再啟動才能生效

上文來源:http://blog.bccn.net/%E9%9D%99%E5%A4%9C%E6%80%9D/13411

 

既然我們用CEF,那么跟Chrome也是一般無二了,只要找到類似的設置就可以。找呀找,在CefBrowserSettings也就是_cef_browser_settings_t結構體中,有個成員變量web_security_disabled,正是此貨,來看下它的注釋:

///
// Set to true (1) to allow risky security behavior such as cross-site
// scripting (XSS). Use with extreme care.
///

確實,將其賦值為true,即可運行跨域訪問。

重新啟動程序,顯示iframe中的在線頁面,為輸出原來的異常消息。

再在代碼里跨域訪問看看:

var $iframe = $("#iframe-apps");
$iframe.get(0).contentWindow.showAppList(param);

嘿嘿,果然可用。

下面是一些帖子,供各位參考下載JavaScript中實現iframe跨域訪問的方法:

《獲取iframe窗口的 contentWindow 不兼容Chrome ?》

http://bbs.csdn.net/topics/360064743

《iframe子父頁面調用》

http://blog.csdn.net/w_basketboy24/article/details/8889085

《jquery 父窗口 子窗口 相關操作》

http://www.cnblogs.com/zhouchaoyi/archive/2010/09/16/1827973.html

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM