pushWindow 打开新页面
优质
小牛编辑
129浏览
2023-12-01
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
})
入参
名称 | 类型 | 描述 | 必选 | 默认值 | 版本 |
---|---|---|---|---|---|
url | string | 要打开的url | Y | ||
param | dictionary | 支持的key/value对下面的表格 | N | {} |
param参数详解
名称 | 类型 | 描述 | 默认值 | 版本 |
---|---|---|---|---|
defaultTitle | string | 默认标题, 在页面第一次加载之前显示在标题栏上 | ‘’ | |
showLoading | bool | 是否在页面加载前显示全局菊花 | false | |
readTitle | bool | 是否读取网页标题显示在titleBar上 | true | |
pullRefresh | bool | 是否支持下拉刷新 只有集团域/本地文件允许设置为true | false | since 8.2 |
canPullDown | bool | 页面是否支持下拉(显示出黑色背景或者域名) 只有.alipay.com/.alipay.net/本地文件允许设置为false 9.9.5废弃, 使用’allowsBounceVertical’替代 | true | android since 8.3 ios since 8.4, |
allowsBounceVertical | bool | 页面是否支持纵向拽拉超出实际内容,android只支持下拉(显示出背景或者域名) 只有.alipay.com/.alipay.net/本地文件允许设置为false | true | since 9.9.3 |
bounceTopColor | int | 下拉超出时,顶部间缝颜色(十进制,例如:bc=16775138) | 不设置时与9.9.3之前显示一致 | since 9.9.3 |
bounceBottomColor | int | 上拉超出时,底部间缝颜色(十进制,例如:bc=16775138) | 不设置时与9.9.3之前显示一致 | since 9.9.3(only IOS) |
showTitleLoading | bool | 是否在TitleBar的标题左边显示小菊花 | false | since 8.6 |
preRpc | string | 在页面启动参数里配置rpc请求的参数preRpc(需要使用utf-8编码),在打开页面的同时请求rpc。详细使用参考RPC接口介绍 | since 9.3 | |
delayRender | bool | 是否启动延迟渲染功能 注:本功能目前由线上开关控制,若线上开关打开,且指定启动参数为YES或TRUE则生效 | false | since 9.3.1(only Android) |
transparentTitle | bool | (不能与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 |
titleBarColor | int | (9.9版本以下不能与transparentTitle同时使用)自定义titlebar的背景色,(十进制,例如:bc=16775138) | ||
scrollDistance | int | 在 transparentTitle auto的情况下,滑动到透明度为0.96的距离 | iOS(80) | since 9.9 |
titleImage | string | 所要使用的title图片地址,请上传一张3X PNG 图,只影响当前的VC,pushWindow不会自动传递此参数,为了更好的体验可以把图放在全局运营资源包中 | ‘’ | since 9.9.5 |
closeCurrentWindow | bool | 打开窗口的同时,关闭当前window。警告:iOS上发现有缺陷:10.0.15版本以前,被打开的新页面会导致无法再通过exitApp或startApp+closeCurrentApp来关闭,这种使用场景请勿使用pushWindow+closeCurrentWindow,10.0.15已修复 | false | since 9.9.2 |
closeAllWindow | bool | 打开窗口的同时,关闭当前App的所有window | false | since 10.0.20 |
animationType | string | 动画类型,默认为’push’,可用枚举’none’/‘push’。 说明:android未实现,均无动画 | ‘’ | since 10.0.15 |
pushWindow参数默认继承
名称 | 继承 | 备注 |
---|---|---|
url | Y | |
defaultTitle | Y | |
backBehavior | Y | 优先用户指定,否则pop |
showLoading | Y | |
readTitle | Y | |
pullRefresh | Y | |
toolbarMenu | Y | |
showProgress | Y | |
defaultSubtitle | Y | |
backgroundColor | Y | |
canPullDown | Y | |
showOptionMenu | Y | |
showTitleLoading | Y | |
showDomain | Y |
如何正确理解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。