默认情况下,如果嵌入本地Web页面,并在页面内部使用iframe来显示一个在线页面,加载的过程中会触发一个未捕获异常,虚函数CefV8ContextHandler::OnUncaughtException被调用,如果搞个控制台窗口来输出异常消息,或者将消息打印到日志中,会是这样:
虽然此时,在线页面嵌入成功并显示出来了,但是,无法happy的实现父子页面的跨域访问,父页面想要调子页面的JavaScript方法,没门,子页面调父页面,没门,限制重重。根据异常消息,子页面访问的父页面的URL必须为http协议,而非file协议。正常情况下,只要把父页面传到服务器上就可以解决协议问题。但是,我们是用CEF来做桌面程序界面,哪来的服务器,别猴急,看看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,正是此货,来看下它的注释:
确实,将其赋值为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