默認狀況下,若是嵌入本地Web頁面,並在頁面內部使用iframe來顯示一個在線頁面,加載的過程當中會觸發一個未捕獲異常,虛函數CefV8ContextHandler::OnUncaughtException被調用,若是搞個控制檯窗口來輸出異常消息,或者將消息打印到日誌中,會是這樣:html
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.jquery
雖然此時,在線頁面嵌入成功並顯示出來了,可是,沒法happy的實現父子頁面的跨域訪問,父頁面想要調子頁面的JavaScript方法,沒門,子頁面調父頁面,沒門,限制重重。根據異常消息,子頁面訪問的父頁面的URL必須爲http協議,而非file協議。正常狀況下,只要把父頁面傳到服務器上就能夠解決協議問題。可是,咱們是用CEF來作桌面程序界面,哪來的服務器,別猴急,看看Chrome瀏覽器上是怎麼玩的:web
給chrome啓動加個參數 --disable-web-securitychrome
方法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/13411app
既然咱們用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.
///ui
確實,將其賦值爲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