JSAPI

  • pushWindow

    pushWindow用来打开一个新的页面,系统自带转场动画。不允许跨appId打开其他离线应用的虚拟域名页面(可换用startApp接口)。

    scheme跳转请尽量使用location.href而不是pushWindow

    location.href的区别,类同于PC浏览器的新开标签页,每个window都是一个新的标签页,因此原页面仅仅是被压到后台,状态始终保持,JS也会继续运行。

    使用方法

    // 打开淘宝首页,自动读取title,并且去除右边菜单
    AlipayJSBridge.call('pushWindow', {
      url: 'https://m.taobao.com/',
      param: {
        readTitle: true,
        showOptionMenu: false
      }
    });
    

    代码演示

    打开淘宝首页,去除右边菜单

    <h1>打开淘宝首页</h1>
    <a class="btn J_demo">执行</a>
    <script>
    function ready(callback) {
      // 如果jsbridge已经注入则直接调用
      if (window.AlipayJSBridge) {
        callback && callback();
      } else {
        // 如果没有注入则监听注入的事件
        document.addEventListener('AlipayJSBridgeReady', callback, false);
      }
    }
    ready(function(){
      document.querySelector('a').addEventListener('click', function() {
        // 打开淘宝首页,自动读取title,并且去除右边菜单
        AlipayJSBridge.call('pushWindow', {
          url: 'https://m.taobao.com/',
          param: {
            readTitle: true,
            showOptionMenu: false
          }
        });
      });
    });
    </script>
    

    用schema的方式打开页面(禁止使用)

    警告:此方式非正常流程,仅用于向下兼容老业务,新业务请避免使用! 否则不保证所有场景均符合预期

    9.9.5开始支持,此前使用该方式会导致先打开一个空白页面。

    <h1>打开指定app</h1>
    <a class="btn J_demo">执行</a>
    <script>
    function ready(callback) {
      // 如果jsbridge已经注入则直接调用
      if (window.AlipayJSBridge) {
        callback && callback();
      } else {
        // 如果没有注入则监听注入的事件
        document.addEventListener('AlipayJSBridgeReady', callback, false);
      }
    }
    ready(function() {
      document.querySelector('a').addEventListener('click', function() {
        AlipayJSBridge.call('pushWindow', {
          url: 'alipays://platformapi/startapp?appId=60000002',
        });
      });
    });
    </script>
    

    打开时设置透明标题栏

    <h1>打开淘宝首页</h1>
    <a class="btn J_demo">执行</a>
    <script>
    function ready(callback) {
      // 如果jsbridge已经注入则直接调用
      if (window.AlipayJSBridge) {
        callback && callback();
      } else {
        // 如果没有注入则监听注入的事件
        document.addEventListener('AlipayJSBridgeReady', callback, false);
      }
    }
    ready(function() {
      document.querySelector('a').addEventListener('click', function() {
        AlipayJSBridge.call('pushWindow', {
          url: 'https://m.taobao.com',
          param: {
            transparentTitle: 'auto'
          }
        });
      });
    });
    </script>
    

    API

    AlipayJSBridge.call('pushWindow', {
      url, param
    })
    

    入参

    名称类型描述必选默认值版本
    urlstring要打开的urlY
    paramdictionary支持的key/value对下面的表格N{}

    param参数详解

    名称类型描述默认值版本
    defaultTitlestring默认标题, 在页面第一次加载之前显示在标题栏上‘’
    showLoadingbool是否在页面加载前显示全局菊花false
    readTitlebool是否读取网页标题显示在titleBar上true
    pullRefreshbool是否支持下拉刷新
    只有集团域/本地文件允许设置为true
    falsesince 8.2
    canPullDownbool页面是否支持下拉(显示出黑色背景或者域名)
    只有.alipay.com/.alipay.net/本地文件允许设置为false
    9.9.5废弃, 使用’allowsBounceVertical’替代
    trueandroid since 8.3
    ios since 8.4,
    allowsBounceVerticalbool页面是否支持纵向拽拉超出实际内容,android只支持下拉(显示出背景或者域名)
    只有.alipay.com/.alipay.net/本地文件允许设置为false
    truesince 9.9.3
    bounceTopColorint下拉超出时,顶部间缝颜色(十进制,例如:bc=16775138)不设置时与9.9.3之前显示一致since 9.9.3
    bounceBottomColorint上拉超出时,底部间缝颜色(十进制,例如:bc=16775138)不设置时与9.9.3之前显示一致since 9.9.3(only IOS)
    showTitleLoadingbool是否在TitleBar的标题左边显示小菊花falsesince 8.6
    preRpcstring在页面启动参数里配置rpc请求的参数preRpc(需要使用utf-8编码),在打开页面的同时请求rpc。详细使用参考RPC接口介绍since 9.3
    delayRenderbool是否启动延迟渲染功能
    注:本功能目前由线上开关控制,若线上开关打开,且指定启动参数为YES或TRUE则生效
    falsesince 9.3.1(only Android)
    transparentTitlebool(不能与titleBarColor同时使用)
    always/auto 如果transparentTitle为字符串always,则当前页面上下滚动时,titlebar一直全透明;
    当transparentTitle值为auto,当页面往下滚动时,透明度不断增加,直到scrollTop等于80pt时变成完全不透明,此时页面再往上滚动则反之,透明度不断减小直到回到顶部时变成完全不透明。
    如果个页面不需要透明效果,则需要用pushWindow的param参数重新指定transparentTitle为”none”
    使用注意:
    1. titlebar透明时,页面内容从屏幕最顶部开始布局,页面需要预留titlebar的高度防止title遮挡页面内容。
    2. Android 5.0以下由于不支持沉浸式状态栏,所以页面会从状态栏下开始布局。
    3. 可以通过 getTitleAndStatusbarHeight JSAPI 获取状态栏和titlebar的高度,用于页面调整预留高度。
    ‘’since 9.5.1
    titleBarColorint(9.9版本以下不能与transparentTitle同时使用)自定义titlebar的背景色,(十进制,例如:bc=16775138)
    scrollDistanceint在 transparentTitle auto的情况下,滑动到透明度为0.96的距离iOS(80)since 9.9
    titleImagestring所要使用的title图片地址,请上传一张3X PNG 图,只影响当前的VC,pushWindow不会自动传递此参数,为了更好的体验可以把图放在全局运营资源包中‘’since 9.9.5
    closeCurrentWindowbool打开窗口的同时,关闭当前window。警告:iOS上发现有缺陷:10.0.15版本以前,被打开的新页面会导致无法再通过exitApp或startApp+closeCurrentApp来关闭,这种使用场景请勿使用pushWindow+closeCurrentWindow,10.0.15已修复falsesince 9.9.2
    closeAllWindowbool打开窗口的同时,关闭当前App的所有windowfalsesince 10.0.20
    animationTypestring动画类型,默认为’push’,可用枚举’none’/‘push’。 说明:android未实现,均无动画‘’since 10.0.15

    pushWindow参数默认继承

    名称继承备注
    urlY
    defaultTitleY
    backBehaviorY优先用户指定,否则pop
    showLoadingY
    readTitleY
    pullRefreshY
    toolbarMenuY
    showProgressY
    defaultSubtitleY
    backgroundColorY
    canPullDownY
    showOptionMenuY
    showTitleLoadingY
    showDomainY

    如何正确理解pushWindow与location.href

    许多新手都会不太理解pushWindow和location.href的区别,同时也会疑惑为什么resume没有被触发之类的问题。 本篇话题只需要几分钟就能把这几个功能解释清楚。

    • 首先把Nebula容器理解为一个PC浏览器。
    • window可以理解为标签页;location.href就是正常的a标签跳转。
    • pushWindow实际上就是新开了一个标签页,并且把之前那一页压到下面,push出来的这页放在顶层展现。此时被压到下面的上一页所有状态均保留。
    • location.href就是依然停留在这个标签页,直接做页面跳转
    • 当pushWindow出来的标签页被关闭(pop)时,如果之前还有window存在,那么之前那个window就会恢复显示,并触发resume

    使用注意

    • pushWindow打开url页面的时候不会关闭已经存在的页面,注意打开个数,不要开太多影响性能。建议同一个应用pushWindow层级不要超过5层,否则会影响用户体验以及有可能导致应用crash
    • pushWindow打开schema页面的时候会关闭这个appId已经存在的所有页面,然后打开一个新的。 比如已经打开了60000002,然后再使用pushWindow打开这个appId,那么当前的60000002页面会被关闭
    • 使用schema的时候,假如参数不生效,请不要担心,因为每个app有配置会覆盖传入的参数。 比如上述的60000002,传入transparentTitle: 'auto'是没有效果的。
    • 9.9.2版本开始,可以使用closeCurrentWindow参数来替代window.location.href跳转,而且有动画效果支持,这样可以实现关闭当前window的同时打开一个新页面。但在iOS发现有缺陷,被打开的新页面会导致无法再通过exitApp或startApp+closeCurrentApp来关闭自身,这种使用场景请勿使用pushWindow+closeCurrentWindow。