HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

个推消息推送之“标签设置”,打通应用标签实现精细化运营

推送 消息推送 个推SDK

为帮助开发者更好地使用个推消息推送产品,我们梳理了个推消息推送产品的核心功能、典型应用场景,并提供实战案例作为参考,希望能够为大家找到提升推送效率的最佳路径!

本文为大家介绍个推消息推送的【标签设置】功能,欢迎大家阅读收藏!

标签设置
即单个设备单日设置标签的次数和个数。

核心价值:实现精细化标签推送

典型应用场景

将应用自有的用户标签绑定到个推系统,方便下发消息时进行标签圈选。例如电商类APP可直接圈选2个标签“女”“爱化妆”,将美妆类消息推送给女性用户。

实战案例

某阅读类APP运营通过该应用类标签圈选具有一定兴趣偏好的用户群,并推送该用户群感兴趣的内容来提升消息点击率。例如针对“教育”“游戏”等标签的用户推送该兴趣标签类别的书单。该APP研发通过个推接口将APP内的用户兴趣标签绑定在个推系统中,方便该运营通过兴趣标签直接圈选推送目标用户进行消息下发。该APP运营通过兴趣标签精细化推送书单,整体消息推送点击率提升了43.2%。

开通和使用方式

1、添加个推企业微信,申请升级【标签设置】VIP功能。

2、设备标签设置规则

①单个CID(即单个设备,CID是个推SDK对用户设备的唯一标识号),最多可设置100个标签,单个标签长度最大为32字符,标签总长度为512个字符。

②单设备标签设置为覆盖操作,会删除该设备历史绑定的所有标签。

③服务端和客户端都可以设置。

3、应用标签查看:登录个推开发者中心,点击个推消息推送-选择应用-配置管理-应用标签,搜索标签名称。

4、应用标签使用:创建推送-通知消息-目标选择-标签用户,选择应用标签中的标签名称即可针对该应用标签人群推送消息。

如果您对标签设置功能感兴趣,欢迎添加企业微信二维码回复【标签设置】联系我们,感谢您对个推的持续关注。

继续阅读 »

为帮助开发者更好地使用个推消息推送产品,我们梳理了个推消息推送产品的核心功能、典型应用场景,并提供实战案例作为参考,希望能够为大家找到提升推送效率的最佳路径!

本文为大家介绍个推消息推送的【标签设置】功能,欢迎大家阅读收藏!

标签设置
即单个设备单日设置标签的次数和个数。

核心价值:实现精细化标签推送

典型应用场景

将应用自有的用户标签绑定到个推系统,方便下发消息时进行标签圈选。例如电商类APP可直接圈选2个标签“女”“爱化妆”,将美妆类消息推送给女性用户。

实战案例

某阅读类APP运营通过该应用类标签圈选具有一定兴趣偏好的用户群,并推送该用户群感兴趣的内容来提升消息点击率。例如针对“教育”“游戏”等标签的用户推送该兴趣标签类别的书单。该APP研发通过个推接口将APP内的用户兴趣标签绑定在个推系统中,方便该运营通过兴趣标签直接圈选推送目标用户进行消息下发。该APP运营通过兴趣标签精细化推送书单,整体消息推送点击率提升了43.2%。

开通和使用方式

1、添加个推企业微信,申请升级【标签设置】VIP功能。

2、设备标签设置规则

①单个CID(即单个设备,CID是个推SDK对用户设备的唯一标识号),最多可设置100个标签,单个标签长度最大为32字符,标签总长度为512个字符。

②单设备标签设置为覆盖操作,会删除该设备历史绑定的所有标签。

③服务端和客户端都可以设置。

3、应用标签查看:登录个推开发者中心,点击个推消息推送-选择应用-配置管理-应用标签,搜索标签名称。

4、应用标签使用:创建推送-通知消息-目标选择-标签用户,选择应用标签中的标签名称即可针对该应用标签人群推送消息。

如果您对标签设置功能感兴趣,欢迎添加企业微信二维码回复【标签设置】联系我们,感谢您对个推的持续关注。

收起阅读 »

未配置appkey或者配置错误

apk

  1. 项目src/main/assets/data/dcloud_control.xml里面的appid和开发者中心的appid一致
  2. 项目的build.gradle里面的applicationId和开发者中心的 Android 包名一致
  3. 项目的证书签名SHA1和开发者中心的Android 证书签名SHA1一致
  4. assets子目录改成appid
  5. src/main/assets/apps/xxx/www/manifest.json里面的id和开发者中心的appid一致(xxx表示appid)

最容易填错的是签名SHA1,一定要确保开发者中心配置的值和安装的apk的签名的值一致,找不到错误的情况下可以试试查看apk安装包的签名进行二次对比确认

其他参考官方指导

继续阅读 »

  1. 项目src/main/assets/data/dcloud_control.xml里面的appid和开发者中心的appid一致
  2. 项目的build.gradle里面的applicationId和开发者中心的 Android 包名一致
  3. 项目的证书签名SHA1和开发者中心的Android 证书签名SHA1一致
  4. assets子目录改成appid
  5. src/main/assets/apps/xxx/www/manifest.json里面的id和开发者中心的appid一致(xxx表示appid)

最容易填错的是签名SHA1,一定要确保开发者中心配置的值和安装的apk的签名的值一致,找不到错误的情况下可以试试查看apk安装包的签名进行二次对比确认

其他参考官方指导

收起阅读 »

VIP功能免费使用 | 个推消息推送SDK之“推送信息回调数据”,帮助快速查询设备是否收到消息

推送 消息推送

为帮助开发者更好地使用个推消息推送产品,我们梳理了个推消息推送产品的核心功能、典型应用场景,并提供实战案例作为参考,希望能够为大家找到提升推送效率的最佳路径!

本文为大家介绍个推消息推送的【推送信息回调数据】功能,欢迎大家阅读收藏!

推送信息回调数据

将客户端feedback回执回传到APP自有服务器,帮助APP自主统计消息到达的数据明细,明确终端设备是否收到了消息。

核心价值:查询设备是否收到消息

将客户端是否收到消息的结果日志回传至自有服务器,帮助客户快速统计消息到达的情况。

典型应用场景

在较多单推场景下,通过推送信息回调数据功能,将客户端的信息到达情况回执回传到自身服务器,客户可以自主快速统计单推消息到达情况。

实战案例

某银行类APP在用户动账交易的时候,比如某公司账户发工资时,需要全量通知到该公司账户下的所有账户,通过【推送信息回调数据】可以快速查到哪些设备收到信息,哪些设备没有收到信息,从而可针对没有收到信息的设备通过短信、微信等多种方式进行消息全面触达。

开通方式

1、添加个推企业微信,申请开通【推送信息回调数据】VIP功能。

2、参考“ 个推消息回执回调操作步骤与使用文档”配置厂商和个推回执。

3、通过企业微信提供个推APPID和回执URL地址,待技术支持完成配置后,推送信息回调数据会自动发送至URL地址。

如果您对推送信息回调数据功能感兴趣,欢迎添加企业微信二维码回复【开通推送信息回调数据】联系我们,感谢您对个推的持续关注。

继续阅读 »

为帮助开发者更好地使用个推消息推送产品,我们梳理了个推消息推送产品的核心功能、典型应用场景,并提供实战案例作为参考,希望能够为大家找到提升推送效率的最佳路径!

本文为大家介绍个推消息推送的【推送信息回调数据】功能,欢迎大家阅读收藏!

推送信息回调数据

将客户端feedback回执回传到APP自有服务器,帮助APP自主统计消息到达的数据明细,明确终端设备是否收到了消息。

核心价值:查询设备是否收到消息

将客户端是否收到消息的结果日志回传至自有服务器,帮助客户快速统计消息到达的情况。

典型应用场景

在较多单推场景下,通过推送信息回调数据功能,将客户端的信息到达情况回执回传到自身服务器,客户可以自主快速统计单推消息到达情况。

实战案例

某银行类APP在用户动账交易的时候,比如某公司账户发工资时,需要全量通知到该公司账户下的所有账户,通过【推送信息回调数据】可以快速查到哪些设备收到信息,哪些设备没有收到信息,从而可针对没有收到信息的设备通过短信、微信等多种方式进行消息全面触达。

开通方式

1、添加个推企业微信,申请开通【推送信息回调数据】VIP功能。

2、参考“ 个推消息回执回调操作步骤与使用文档”配置厂商和个推回执。

3、通过企业微信提供个推APPID和回执URL地址,待技术支持完成配置后,推送信息回调数据会自动发送至URL地址。

如果您对推送信息回调数据功能感兴趣,欢迎添加企业微信二维码回复【开通推送信息回调数据】联系我们,感谢您对个推的持续关注。

收起阅读 »

商城类找长期全职uniapp外包

uniapp

提供设计稿,蓝湖标注切图,api文档
要求非常熟练uniapp vue3 nvue,发布app(android/ios)+h5(手机浏览器/微信公众号)+各个端口小程序+快应用
熟悉websocket和push
熟悉官方文档,对各种老坑(白屏、抖动、瀑布流、大量图片、渲染、兼容等)有解决经验
请留言或私信您的联系方式,需提供您的案例。小白以及二把刀勿扰,不要浪费彼此时间
长期合作

继续阅读 »

提供设计稿,蓝湖标注切图,api文档
要求非常熟练uniapp vue3 nvue,发布app(android/ios)+h5(手机浏览器/微信公众号)+各个端口小程序+快应用
熟悉websocket和push
熟悉官方文档,对各种老坑(白屏、抖动、瀑布流、大量图片、渲染、兼容等)有解决经验
请留言或私信您的联系方式,需提供您的案例。小白以及二把刀勿扰,不要浪费彼此时间
长期合作

收起阅读 »

Webview调试时 Chrome调起调试窗口

WebView调试

HBuilder 版本:3.3.10.20220124
Chrome 版本: 98.0.4758.102

app运行到Android 都正常,HBuilder的Webview视图显示也正常,在HBuilder的Webview视图下点击 Inspect 确实会唤起Chrome,但是Chrome并没有调起调试窗口,看上去没什么反应

我的解决办法,如下:

查看Chrome的调试配置,在Chrome地址栏输入:chrome://inspect/#devices

继续阅读 »

HBuilder 版本:3.3.10.20220124
Chrome 版本: 98.0.4758.102

app运行到Android 都正常,HBuilder的Webview视图显示也正常,在HBuilder的Webview视图下点击 Inspect 确实会唤起Chrome,但是Chrome并没有调起调试窗口,看上去没什么反应

我的解决办法,如下:

查看Chrome的调试配置,在Chrome地址栏输入:chrome://inspect/#devices

收起阅读 »

关于Uniapp踩坑记录

uniapp

1、写音频App,需要自己写audio原生插件,官方的audio各种问题,例如,IOS下OnPrev,OnNext事件失效等,slider问题,以及getBackgroundAudioManager失效的问题,真的是恶心惨了;

2、写视频App,插件市场的视频插件都不完善,坑死我了;

3、nvue下的高德地图也是一抹多问题,脑壳贼疼;

4、感觉uniapp只能用来写简单的项目,用来构建页面啥的,跟原生打交道的一些东西,感觉问题好大啊,没有原生开发能力的,用uniapp,感觉脑壳贼疼,那么问题来了,用uniapp就是因为没有原生能力,甚至是因为小微公司,不想请多端开发人员,IOS+android提高成本,所有使用uniapp,但是这么多BUG,导致了如果单独使用uniapp,是行不通的?,所以uniapp存在的意义是什么???

继续阅读 »

1、写音频App,需要自己写audio原生插件,官方的audio各种问题,例如,IOS下OnPrev,OnNext事件失效等,slider问题,以及getBackgroundAudioManager失效的问题,真的是恶心惨了;

2、写视频App,插件市场的视频插件都不完善,坑死我了;

3、nvue下的高德地图也是一抹多问题,脑壳贼疼;

4、感觉uniapp只能用来写简单的项目,用来构建页面啥的,跟原生打交道的一些东西,感觉问题好大啊,没有原生开发能力的,用uniapp,感觉脑壳贼疼,那么问题来了,用uniapp就是因为没有原生能力,甚至是因为小微公司,不想请多端开发人员,IOS+android提高成本,所有使用uniapp,但是这么多BUG,导致了如果单独使用uniapp,是行不通的?,所以uniapp存在的意义是什么???

收起阅读 »

`tailwindcss jit` 与各大框架的融合

Image

tailwindcss jit 与各大框架的融合

tailwindcss JIT 思想带入小程序开发吧!

书接上文 让小程序开发进入 tailwind jit 时代!

到今天为止已经,距离第一版已经发布了 19天了。

19 天内,在许多人的帮助和支持下,添加了许多的 feature 和修复了许多的 bug.

现在到 1.1.5 版本的发布 weapp-tailwindcss-webpack-plugin,已经不只是一个 webpack-plugin 了。接下来让我们大概看一下有哪些改进吧。

适配了更多的框架

原先设计的时候,主要是给 uni-appwebpack 打包版本设计的。随着群友和一些使用者的需求,陆陆续续添加了:

  • uni-app-vite
  • taro (react/vue2/3)
  • remax (react)
  • rax (react)

框架支持。而且也补充了更多的 使用方式示例项目.

<h3 id="uni-app">uni-app (vue2/3)</h3>

Demo 项目

<h3 id="uni-app-vite">uni-app for vite (vue3)</h3>

Demo 项目

<h3 id="taro">taro (React/vue2/3)</h3>

React Demo 项目

vue2 Demo 项目

vue3 Demo 项目

<h3 id="remax">remax (react)</h3>

Demo 项目

<h3 id="rax">rax (react)</h3>

Demo 项目

当然,未来肯定是要支持更多的框架以及原生的写法的。

毕竟 tailwindcss 这种自动生成 css 的框架,是一种非常优秀的思想。非常的灵活多变,是非常值得推广的,能够精炼的对 css 进行提炼,自由的组合。

这让我想起了 js函数式编程,用函数来生成函数。而且 tailwindcss 配合上最新的 dart sass 开发体验非常好。

现在的 sass 也提倡编程 @use 'sass:meta' as M; 这类的,大大提升了样式的可编程性。

简单的原理

由于小程序的 class 不支持除了 _- 以外的特殊符号和诸多选择器,而 tailwindcss jit 又是特殊符号一大堆。

于是在不改变 tailwindcss 默认 jit engine 的情况下,我们自然而然就想到了,同时去 修改(mangle) 对应的 xxml,xxss,jsx这类的生成的文件。将他们进行 对照配合 修改,那么就能兼容小程序平台了,毕竟所见不为所得,用户在编写的时候,还是按照 web 的习惯去写 tailwindcss,我们编写的 webpack/vite/postcss plugin 这类的,把这些都处理掉就完事了。

比较好改一点的还是 uni-app,毕竟生成的 wxmlwxss 文件还比较可控。那种类 react 框架,wxml 都引入一个 base.wxml 然后根据那种 render function 来渲染的,就比较难了。目前个人的解法,也仅仅只能做到解析 AST,然后遇到某些关键词,比如 class/className/staticClass后,进行语句匹配,替换其中的字符串字面量,语句结束停止匹配并继续向下 walk ast

当然在编写过程中,也发现这种和各个框架是耦合的,因为自己并没有去详细了解各个框架的生命周期和源码。导致目前都是针对打包后的结果进行解析修改。这点做的不是特别好,应该各个框架内,都有一个切面,可以把处理方法注入进去的。

省的在生成产物后,还要去解析 AST 进行修改,这样也十分的损耗性能。

以上就是我对这些天的感悟了。功能吧能用,达不到完美,毕竟还有 多线程缓存 这种玩意要玩耍呢(笑)。

Bugs & Issues

如果在使用过程中遇到 Bugs 或者提出问题,欢迎提交到此处,笔者会尽快复现并修改

继续阅读 »

Image

tailwindcss jit 与各大框架的融合

tailwindcss JIT 思想带入小程序开发吧!

书接上文 让小程序开发进入 tailwind jit 时代!

到今天为止已经,距离第一版已经发布了 19天了。

19 天内,在许多人的帮助和支持下,添加了许多的 feature 和修复了许多的 bug.

现在到 1.1.5 版本的发布 weapp-tailwindcss-webpack-plugin,已经不只是一个 webpack-plugin 了。接下来让我们大概看一下有哪些改进吧。

适配了更多的框架

原先设计的时候,主要是给 uni-appwebpack 打包版本设计的。随着群友和一些使用者的需求,陆陆续续添加了:

  • uni-app-vite
  • taro (react/vue2/3)
  • remax (react)
  • rax (react)

框架支持。而且也补充了更多的 使用方式示例项目.

<h3 id="uni-app">uni-app (vue2/3)</h3>

Demo 项目

<h3 id="uni-app-vite">uni-app for vite (vue3)</h3>

Demo 项目

<h3 id="taro">taro (React/vue2/3)</h3>

React Demo 项目

vue2 Demo 项目

vue3 Demo 项目

<h3 id="remax">remax (react)</h3>

Demo 项目

<h3 id="rax">rax (react)</h3>

Demo 项目

当然,未来肯定是要支持更多的框架以及原生的写法的。

毕竟 tailwindcss 这种自动生成 css 的框架,是一种非常优秀的思想。非常的灵活多变,是非常值得推广的,能够精炼的对 css 进行提炼,自由的组合。

这让我想起了 js函数式编程,用函数来生成函数。而且 tailwindcss 配合上最新的 dart sass 开发体验非常好。

现在的 sass 也提倡编程 @use 'sass:meta' as M; 这类的,大大提升了样式的可编程性。

简单的原理

由于小程序的 class 不支持除了 _- 以外的特殊符号和诸多选择器,而 tailwindcss jit 又是特殊符号一大堆。

于是在不改变 tailwindcss 默认 jit engine 的情况下,我们自然而然就想到了,同时去 修改(mangle) 对应的 xxml,xxss,jsx这类的生成的文件。将他们进行 对照配合 修改,那么就能兼容小程序平台了,毕竟所见不为所得,用户在编写的时候,还是按照 web 的习惯去写 tailwindcss,我们编写的 webpack/vite/postcss plugin 这类的,把这些都处理掉就完事了。

比较好改一点的还是 uni-app,毕竟生成的 wxmlwxss 文件还比较可控。那种类 react 框架,wxml 都引入一个 base.wxml 然后根据那种 render function 来渲染的,就比较难了。目前个人的解法,也仅仅只能做到解析 AST,然后遇到某些关键词,比如 class/className/staticClass后,进行语句匹配,替换其中的字符串字面量,语句结束停止匹配并继续向下 walk ast

当然在编写过程中,也发现这种和各个框架是耦合的,因为自己并没有去详细了解各个框架的生命周期和源码。导致目前都是针对打包后的结果进行解析修改。这点做的不是特别好,应该各个框架内,都有一个切面,可以把处理方法注入进去的。

省的在生成产物后,还要去解析 AST 进行修改,这样也十分的损耗性能。

以上就是我对这些天的感悟了。功能吧能用,达不到完美,毕竟还有 多线程缓存 这种玩意要玩耍呢(笑)。

Bugs & Issues

如果在使用过程中遇到 Bugs 或者提出问题,欢迎提交到此处,笔者会尽快复现并修改

收起阅读 »

uniapp集成极光推送+ios离线打包+原生插件

极光推送 uniapp离线打包

本人才踩完坑,写了博客 希望对你有所帮助。
业务需求:uniapp集成极光推送+ios离线打包 使用原生插件。网上没有找到特别清楚的文章,都差点劲。对于小白来说 我写的应该能帮助到
uniapp集成极光推送+离线打包ios+官方原生插件

继续阅读 »

本人才踩完坑,写了博客 希望对你有所帮助。
业务需求:uniapp集成极光推送+ios离线打包 使用原生插件。网上没有找到特别清楚的文章,都差点劲。对于小白来说 我写的应该能帮助到
uniapp集成极光推送+离线打包ios+官方原生插件

收起阅读 »

安卓透传问题 receive事件接受不到信息

unipush

先复现一下应用场景
需要在页面当中,查询某种状态,刷新查询后,在页面等待过程中,如果有成功状态,会透传消息过来,直接显示同步内容成功。。
但是在苹果手机上面就可以在receive事件中去拿到传递来的msg内容,小米测试机却不可以,后来在unipush常见问题中找到了答案,按照里面所标注的:

点击(click)事件不触发、(receive)事件不触发/监听不到。
离线点击不触发click事件,intent中要有dcloud要求的参数格式要求S.UP-OL-SU=true;S.title=测试标题;S.content=测试内容;S.payload=test;否则dcloud识别不到,无法进入对应回调
在线透传不触发receive事件,主要是安卓透传内容给了{title:"标题",content:"内容",payload:"自定义数据"}dcloud要求格式的透传内容,dcloud会默认处理展示通知栏通知,并且不会进入receive回调。
处理方法 自然就是更改 传入的key值

继续阅读 »

先复现一下应用场景
需要在页面当中,查询某种状态,刷新查询后,在页面等待过程中,如果有成功状态,会透传消息过来,直接显示同步内容成功。。
但是在苹果手机上面就可以在receive事件中去拿到传递来的msg内容,小米测试机却不可以,后来在unipush常见问题中找到了答案,按照里面所标注的:

点击(click)事件不触发、(receive)事件不触发/监听不到。
离线点击不触发click事件,intent中要有dcloud要求的参数格式要求S.UP-OL-SU=true;S.title=测试标题;S.content=测试内容;S.payload=test;否则dcloud识别不到,无法进入对应回调
在线透传不触发receive事件,主要是安卓透传内容给了{title:"标题",content:"内容",payload:"自定义数据"}dcloud要求格式的透传内容,dcloud会默认处理展示通知栏通知,并且不会进入receive回调。
处理方法 自然就是更改 传入的key值

收起阅读 »

javaScript事件-----事件类型之触摸与手势事件

一、触摸事件
touchstart:当手指触摸屏幕时触发;即使已经有一个手指放在了屏幕上也会触发。
touchmove:当手指在屏幕上滑动时连续地触发。在这个世界发生期间,调用preventDefault()可以阻止滚动。
touchend:当手指在屏幕上移开时触发。
touchcancel:当系统停止跟踪触摸时触发。关于此事件的确切触发时间,文档中没有明确说明。
上面这几个事件都会冒泡,也都可以取消。虽然这些触摸事件没有在DOM规范中定义,但它们却是以兼容DOM的方式实现的。因此,每个触摸事件的event对象都提供了鼠标事件中常见的属性:bubbles,cancelable,view,clientX,clientY,screenX,screenY,detail,altKey,shiftKey,ctrlKey和metaKey。

除了常见的DOM属性外,触摸世界还包含下列三个用于跟踪触摸的属性。

touches:表示当前跟踪的触摸操作的Touch对象的数组。
targetTouches:特定于事件目标的Touch对象的数组。
changedTouches:表示字上次触摸以来发生了什么改变的Touch对象的数组。
每个Touch对象包含下列属性:

clientX:触摸目标在视口中的x坐标。
clientY:触摸目标在视口中的y坐标。
identifier:标识触摸的唯一ID。
pageX:触摸目标在页面中的x坐标。
pageY:触摸目标在页面中的y坐标。
screenX:触摸目标在屏幕中的x坐标。
screenY:触摸目标在屏幕中的y坐标。
target:触摸的DOM节点目标。
使用这些属性可以跟踪用户对屏幕的触摸操作。

<div id="output"></div>
function handlerTouchEvent(event){  
    //只跟踪一次触摸  
    if(event.touches.length==1 || event.touches.length==0){//书上这里有错  
        var output=document.getElementById("output");  
        switch(event.type){  
            case "touchstart":  
                output.innerHTML="Touch started ( "+event.touches[0].clientX+", "+event.touches[0].clientY+")";  
                break;  
            case "touchend":  
                output.innerHTML+="<br/>Touch ended ("+event.changedTouches[0].clientX+", "+event.changedTouches[0].clientY+")";  
                break;  
            case "touchmove":  
                event.preventDefault(); //阻止滚动  
                output.innerHTML+="<br/>Touch moved ("+event.changedTouches[0].clientX+", "+event.changedTouches[0].clientY+")";  
        }  
    }  
}  

EventUtil.addHandler(document,"touchstart",handlerTouchEvent);  
EventUtil.addHandler(document,"touchend",handlerTouchEvent);  
EventUtil.addHandler(document,"touchmove",handlerTouchEvent);

以上代码会跟踪屏幕上发生的一次触摸操作。为简单起见,只会在有一次活动触摸操作的情况下输出信息。

当touchstart事件发生时,会将触摸的位置信息输出到<div>元素中。

当touchmove事件发生时,会取消其默认行为,阻止滚动(触摸移动的默认行为是滚动页面),然后输出触摸操作的变化信息。

而touched事件则会输出有关触摸操作的最终信息。

注意:在touched事件发生时,touches集合中就没有任何Touch对象了,因为不存在活动的触摸操作;此时,就必须转而使用changedTouches集合。

/当触发touchstart和touchmove事件的时候没有问题,程序能正确的进入 if 然后根据case执行对应的语句,但是当触发touchend事件的时候,event.touches.length已经等于0了,不能再进入if 中,也就不能执行case中的语句,所以触发touchend的时候永远不会执行程序。所以判断条件要加上 event.touches.length==0./

这些事件会在文档的所有元素上面触发,因而可以分别操作页面的不同部分。在触摸屏幕上的元素时,这些事件(包括鼠标事件) 发生的顺序如下:

touchstart
mouseover
mousemove(一次)
mousedown
mouseup
click
touched
桌面版Firefox 6+和Chrome也支持触摸事件。

2、手势事件
当两个手指触摸屏幕时就会产生手势,手势通常会改变显示项的大小,或者旋转显示项。有三个手势事件,如下:

gesturestart:当一个手指已经按在屏幕上而另一个手指又触摸屏幕时触发。
gesturechange:当触摸屏幕的任何一个手指的位置发生变化时触发。
gestureend:当任何一个手指从屏幕上移开时触发。
只有两个手指都触摸到事件的接收容器时才会触发这些事件。

在一个元素上设置事件处理程序,意味着两个手指必须同时位于该元素的范围之内,才能触发手势事件(这个元素就是目标)。

由于这些事件冒泡,所以讲事件处理程序放在文档上也可以处理所有手势事件。

此时,事件的目标就算两个手指都位于其范围内的那个元素。

触摸事件和手势事件关系:

每个手势事件的event对象都包含着标准的鼠标事件属性:bubbles,cancelable,view,clientX,clientY,screenX,screenY,detail,altKey,shiftKey,ctrlKey和metaKey。此外还有两个额外的属性:rotation和scale。

rotation属性:表示手指变化引起的旋转角度,负值表示逆时针旋转,正值表示顺时针旋转(该值从0开始)。
scale属性:表示两个手指间距离的变化情况(例如向内收缩会缩短距离);这个值从1开始,并随距离拉大而增长,随距离缩短而减小。
例子:

function handleGestureEvent(event){  
   var output=document.getElementById("output");  
    switch(event.type){  
         case "gesturestart":  
                output.innerHTML="Gesture started ( "+event.ratation+", scale"+event.scale+")";  
                break;  
            case "gestureend":  
                output.innerHTML+="<br/>Gesture ended ("+event.rotation+", scale"+event.scale+")";  
                break;  
            case "gesturechange":  
                event.preventDefault(); //阻止滚动  
                output.innerHTML+="<br/>Gesture changed ("+event.rotation+",scale "+event.scale+")";  
    }  
}  
EventUtil.addHandler(document,"gesturestart",handleGestureEvent);  
EventUtil.addHandler(document,"gestureend",handleGestureEvent);  
EventUtil.addHandler(document,"gesturechange",handleGestureEvent);
继续阅读 »

一、触摸事件
touchstart:当手指触摸屏幕时触发;即使已经有一个手指放在了屏幕上也会触发。
touchmove:当手指在屏幕上滑动时连续地触发。在这个世界发生期间,调用preventDefault()可以阻止滚动。
touchend:当手指在屏幕上移开时触发。
touchcancel:当系统停止跟踪触摸时触发。关于此事件的确切触发时间,文档中没有明确说明。
上面这几个事件都会冒泡,也都可以取消。虽然这些触摸事件没有在DOM规范中定义,但它们却是以兼容DOM的方式实现的。因此,每个触摸事件的event对象都提供了鼠标事件中常见的属性:bubbles,cancelable,view,clientX,clientY,screenX,screenY,detail,altKey,shiftKey,ctrlKey和metaKey。

除了常见的DOM属性外,触摸世界还包含下列三个用于跟踪触摸的属性。

touches:表示当前跟踪的触摸操作的Touch对象的数组。
targetTouches:特定于事件目标的Touch对象的数组。
changedTouches:表示字上次触摸以来发生了什么改变的Touch对象的数组。
每个Touch对象包含下列属性:

clientX:触摸目标在视口中的x坐标。
clientY:触摸目标在视口中的y坐标。
identifier:标识触摸的唯一ID。
pageX:触摸目标在页面中的x坐标。
pageY:触摸目标在页面中的y坐标。
screenX:触摸目标在屏幕中的x坐标。
screenY:触摸目标在屏幕中的y坐标。
target:触摸的DOM节点目标。
使用这些属性可以跟踪用户对屏幕的触摸操作。

<div id="output"></div>
function handlerTouchEvent(event){  
    //只跟踪一次触摸  
    if(event.touches.length==1 || event.touches.length==0){//书上这里有错  
        var output=document.getElementById("output");  
        switch(event.type){  
            case "touchstart":  
                output.innerHTML="Touch started ( "+event.touches[0].clientX+", "+event.touches[0].clientY+")";  
                break;  
            case "touchend":  
                output.innerHTML+="<br/>Touch ended ("+event.changedTouches[0].clientX+", "+event.changedTouches[0].clientY+")";  
                break;  
            case "touchmove":  
                event.preventDefault(); //阻止滚动  
                output.innerHTML+="<br/>Touch moved ("+event.changedTouches[0].clientX+", "+event.changedTouches[0].clientY+")";  
        }  
    }  
}  

EventUtil.addHandler(document,"touchstart",handlerTouchEvent);  
EventUtil.addHandler(document,"touchend",handlerTouchEvent);  
EventUtil.addHandler(document,"touchmove",handlerTouchEvent);

以上代码会跟踪屏幕上发生的一次触摸操作。为简单起见,只会在有一次活动触摸操作的情况下输出信息。

当touchstart事件发生时,会将触摸的位置信息输出到<div>元素中。

当touchmove事件发生时,会取消其默认行为,阻止滚动(触摸移动的默认行为是滚动页面),然后输出触摸操作的变化信息。

而touched事件则会输出有关触摸操作的最终信息。

注意:在touched事件发生时,touches集合中就没有任何Touch对象了,因为不存在活动的触摸操作;此时,就必须转而使用changedTouches集合。

/当触发touchstart和touchmove事件的时候没有问题,程序能正确的进入 if 然后根据case执行对应的语句,但是当触发touchend事件的时候,event.touches.length已经等于0了,不能再进入if 中,也就不能执行case中的语句,所以触发touchend的时候永远不会执行程序。所以判断条件要加上 event.touches.length==0./

这些事件会在文档的所有元素上面触发,因而可以分别操作页面的不同部分。在触摸屏幕上的元素时,这些事件(包括鼠标事件) 发生的顺序如下:

touchstart
mouseover
mousemove(一次)
mousedown
mouseup
click
touched
桌面版Firefox 6+和Chrome也支持触摸事件。

2、手势事件
当两个手指触摸屏幕时就会产生手势,手势通常会改变显示项的大小,或者旋转显示项。有三个手势事件,如下:

gesturestart:当一个手指已经按在屏幕上而另一个手指又触摸屏幕时触发。
gesturechange:当触摸屏幕的任何一个手指的位置发生变化时触发。
gestureend:当任何一个手指从屏幕上移开时触发。
只有两个手指都触摸到事件的接收容器时才会触发这些事件。

在一个元素上设置事件处理程序,意味着两个手指必须同时位于该元素的范围之内,才能触发手势事件(这个元素就是目标)。

由于这些事件冒泡,所以讲事件处理程序放在文档上也可以处理所有手势事件。

此时,事件的目标就算两个手指都位于其范围内的那个元素。

触摸事件和手势事件关系:

每个手势事件的event对象都包含着标准的鼠标事件属性:bubbles,cancelable,view,clientX,clientY,screenX,screenY,detail,altKey,shiftKey,ctrlKey和metaKey。此外还有两个额外的属性:rotation和scale。

rotation属性:表示手指变化引起的旋转角度,负值表示逆时针旋转,正值表示顺时针旋转(该值从0开始)。
scale属性:表示两个手指间距离的变化情况(例如向内收缩会缩短距离);这个值从1开始,并随距离拉大而增长,随距离缩短而减小。
例子:

function handleGestureEvent(event){  
   var output=document.getElementById("output");  
    switch(event.type){  
         case "gesturestart":  
                output.innerHTML="Gesture started ( "+event.ratation+", scale"+event.scale+")";  
                break;  
            case "gestureend":  
                output.innerHTML+="<br/>Gesture ended ("+event.rotation+", scale"+event.scale+")";  
                break;  
            case "gesturechange":  
                event.preventDefault(); //阻止滚动  
                output.innerHTML+="<br/>Gesture changed ("+event.rotation+",scale "+event.scale+")";  
    }  
}  
EventUtil.addHandler(document,"gesturestart",handleGestureEvent);  
EventUtil.addHandler(document,"gestureend",handleGestureEvent);  
EventUtil.addHandler(document,"gesturechange",handleGestureEvent);
收起阅读 »

使用uni.$emit()和uni.$on() 进行页面间通讯

自定义事件 uniapp
自 HBuilderX 2.0.0 起支持 uni.$emit、 uni.$on 、 uni.$once 、uni.$off ,可以方便的进行页面的通讯 ,触发的事件都是 App 全局级别的,跨任意组件,页面,nvue,vue 等。事件详情

具体如何使用呢?我们假设一个场景,进入app,是未登陆状态,需要在我的页面点击登陆,进入登陆页面进行登陆。登陆成功之后,返回到我的页面,实时显示登陆后的用户信息。

监听事件
首先,在我的页面监听事件。

// 我的页面    
onLoad(){    
    // 监听事件    
    uni.$on('login',(usnerinfo)=>{    
        this.usnerinfo = usnerinfo;    
    })    
},    
onUnload() {    
    // 移除监听事件    
        uni.$off('login');    
    },

因为事件监听是全局的,所以使用 uni.$on ,需要使用 uni.$off 移除全局的事件监听,避免重复监听。

触发事件
进入登陆页面,触发事件

// 登陆页面    
uni.$emit('login', {    
                avatarUrl: 'https://img-cdn-qiniu.dcloud.net.cn/uploads/nav_menu/10.jpg',    
                token: 'user123456',    
                userName: 'unier',    
                login: true    
            });

使用 uni.$emit 触发事件后,对应的 uni.$on 就会监听到事件触发,在回调中去执行相关的逻辑。

更多使用场景
以上只是一个简单的场景应用。而我们开发中会遇到很多页面间通讯场景,如:

vue 与 nvue,nvue 与 vue 间的通讯
tabbar 页面之间的通讯
父页面与多级子页面间的通讯
基本上述场景均可以实现,本质上就是一个页面通知另一个面我发生了变化,你需要处理一下。绝大部分页面的通讯都可以使用 uni.$emit、 uni.$on 、 uni.$once 、uni.$off 四个事件完成。

Tips

如果页面没有打开,将不能 注册监听事件 uni.$on 和 uni.$once 。
一次性的事件,直接使用 uni.$once 监听,不需要移除。
附件为 demo

继续阅读 »

自定义事件 uniapp
自 HBuilderX 2.0.0 起支持 uni.$emit、 uni.$on 、 uni.$once 、uni.$off ,可以方便的进行页面的通讯 ,触发的事件都是 App 全局级别的,跨任意组件,页面,nvue,vue 等。事件详情

具体如何使用呢?我们假设一个场景,进入app,是未登陆状态,需要在我的页面点击登陆,进入登陆页面进行登陆。登陆成功之后,返回到我的页面,实时显示登陆后的用户信息。

监听事件
首先,在我的页面监听事件。

// 我的页面    
onLoad(){    
    // 监听事件    
    uni.$on('login',(usnerinfo)=>{    
        this.usnerinfo = usnerinfo;    
    })    
},    
onUnload() {    
    // 移除监听事件    
        uni.$off('login');    
    },

因为事件监听是全局的,所以使用 uni.$on ,需要使用 uni.$off 移除全局的事件监听,避免重复监听。

触发事件
进入登陆页面,触发事件

// 登陆页面    
uni.$emit('login', {    
                avatarUrl: 'https://img-cdn-qiniu.dcloud.net.cn/uploads/nav_menu/10.jpg',    
                token: 'user123456',    
                userName: 'unier',    
                login: true    
            });

使用 uni.$emit 触发事件后,对应的 uni.$on 就会监听到事件触发,在回调中去执行相关的逻辑。

更多使用场景
以上只是一个简单的场景应用。而我们开发中会遇到很多页面间通讯场景,如:

vue 与 nvue,nvue 与 vue 间的通讯
tabbar 页面之间的通讯
父页面与多级子页面间的通讯
基本上述场景均可以实现,本质上就是一个页面通知另一个面我发生了变化,你需要处理一下。绝大部分页面的通讯都可以使用 uni.$emit、 uni.$on 、 uni.$once 、uni.$off 四个事件完成。

Tips

如果页面没有打开,将不能 注册监听事件 uni.$on 和 uni.$once 。
一次性的事件,直接使用 uni.$once 监听,不需要移除。
附件为 demo

收起阅读 »