WebView 组件参考

    点击 属性检查器 下面的按钮,然后从添加 UI 组件中选择WebView,即可添加 WebView 组件到节点上。

    WebView 的脚本接口请参考 WebView API

    目前此组件只支持Web(PC 和手机)、iOS 和 Android 平台,Mac 和 Windows 平台暂时还不支持,如果在场景中使用此组件,那么在 PC 的模拟器里面预览的时候可能看不到效果。

    方法一

    这种方法添加的事件回调和使用编辑器添加的事件回调是一样的,通过代码添加,你需要首先构造一个 cc.Component.EventHandler 对象,然后设置好对应的 target, component, handler 和 customEventData 参数。

    方法二

    通过 webview.node.on('loaded', …) 的方式来添加

    1. //假设我们在一个组件的 onLoad 方法里面添加事件处理回调,在 callback 函数中进行事件处理:
    2. cc.Class({
    3. extends: cc.Component,
    4. properties: {
    5. webview: cc.WebView
    6. onLoad: function () {
    7. this.webview.node.on('loaded', this.callback, this);
    8. },
    9. callback: function (event) {
    10. //这里的 event 是一个 EventCustom 对象,你可以通过 event.detail 获取 WebView 组件
    11. //do whatever you want with webview
    12. //另外,注意这种方式注册的事件,也无法传递 customEventData
    13. }
    14. });

    同样的,你也可以注册 'loading', 'error' 事件,这些事件的回调函数的参数与 'loaded' 的参数一致。

    调用 WebView 内部页面
    1. cc.Class({
    2. extends: cc.Component,
    3. properties: {
    4. webview: cc.WebView
    5. },
    6. onLoad: function () {
    7. this.webview.evaluateJS('Test()');
    8. }
    9. });
    注意: HTML5 上的跨域问题需要自行解决
    WebView 内部页面调用外部的代码

    目前 Android 与 IOS 用的机制是,通过截获 url 的跳转,判断 url 前缀的关键字是否与之相同,如果相同则进行回调。

    • 通过 setJavascriptInterfaceScheme 设置 url 前缀关键字
      1. cc.Class({
        extends: cc.Component,
        properties: {

      2.   webview: cc.WebView
      3. },

      4.   <span class="hljs-keyword">function</span> <span class="hljs-title">jsCallback</span> (<span class="hljs-params">url</span>) {
      5.       // 这里的返回值是内部页面的 url 数值,
      6.       // 需要自行解析自己需要的数据
      7.       var str = url.replace(scheme + &#39;://&#39;, &#39;&#39;);
      8.   }
      9.   this.webview.setJavascriptInterfaceScheme(scheme);
      10.   this.webview.setOnJSCallback(jsCallback);

    // 因此当你需要通过内部页面交互 WebView 时,
    // 应当设置内部页面 url 为:TestKey://(后面你想要回调到 WebView 的数据)
    // WebView 内部页面代码
    <html>
    <body>
    <dev>
    <input type="button" value="触发" onclick="onClick()"/>
    </dev>
    </body>
    <script>
    function onClick () {
    // 其中一个设置URL方案
    document.location = 'TestKey://{a: 0, b: 1}';
    }
    </script>
    </html>

    再强调一遍: HTML5 上的跨域问题需要自行解决