SSL&自签名证书
- openssl
- keytool
微信小程序样式
iconfont
矢量图标的使用
- 选取图标
- 添加到项目
- 下载代码ok
- demo.html
open-data
radius
网易云音乐
1 | path: /discover |
轮播图api
pc端实现(user_agent设置,but 微信小程序无法进行user agent设置)
搭建HTTPS服务器实现
Bugs
setData
原因:组件实例刚刚被创建好时, created 生命周期被触发。此时,组件数据 this.data 就是在 Component 构造器中定义的数据 data 。 此时还不能调用 setData 。 通常情况下,这个生命周期只应该用于给组件 this 添加一些自定义属性字段。
操作从lyric.wxml redictTo music.wxml
歌词页面跳转到详细歌单界面
onShow —> (跳过onHide) —>onUnload
从首页跳转到详情页,点击左上方的返回按钮,详情页的onHide不触发微信小程序
log
1
2
3
4
5
6
7lyricPage onLoad options={"id":"571463522","name":"生如逆旅(Cover 米津玄师)","bg":"http%3A%2F%2Fp1.music.126.net%2FhzlpZj9bzwyk1b0g7Deo0A%3D%3D%2F109951163335209234.jpg"}
lyric.js? [sm]:149 lyricPage onShow
playlists.js? [sm]:83 play ..... lyricPage=[object Object]
lyric.js? [sm]:76 lyricPage lyric setDurations start
lyric.js? [sm]:169 lyricPage onUnload
playlists.js? [sm]:83 play ..... lyricPage=[object Object]
lyric.js? [sm]:76 lyricPage lyric setDurations startonShow —> (跳过onHide) —>onUnload
JS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21console.log("lyricPage lyric setDurations start");
var all;
if (this.data.temp != 0)
clearInterval(this.data.temp);
this.data.temp =
setInterval(() => {
all = app.globalData.audioPlayer.duration;
console.log("all= " + all + "\t temp_timer=" + this.data.temp);
var mintues = Math.floor(all / 60);
var seconds = Math.floor(all - mintues * 60);
this.setData({
durations: mintues > 9 ? mintues + ":" + (seconds > 9 ? seconds : "0" + seconds) : "0" + mintues + ":" + (seconds > 9 ? seconds : "0" + seconds)
}, () => {
//另外 尚未执行onLoad, onShow ....
//逻辑????
//////此处不会执行
console.log("------------------> " + this.data.durations + "\t" + all);
if (all && all != 0)
clearInterval(this.data.temp);
});
}, 50);
监听蓝牙&耳机连接
控制音乐播放…
数据处理
数组相关
splice
1
2
3splice(index, length,data...)
从index开始操作,将length个元素替换成data
并返回length个元素shift/unshift
从数组头部删除/添加pop/push
从数组尾部删除添加
添加对象
- JSON.parse()
1
that.data.lyric_time.push(JSON.parse("{\"secs\":\"" + secs + "\",\"str\":\"" + str + "\"}"));
- ok方法一
1
2
3
4that.data.lyric_time.push({
secs: secs,
str: str
});parse注意特殊字符… 字符串构造巨坑!!!
滚动
transform
布局文件1
2
3<view style="transform: translateY({{(4-curIndex)*900/9}}rpx)" wx:for="{{lyric_time}}" wx:key="item" wx:for-item="item" wx:for-index="idx">
<text class="{{lastTime==item.secs?'highlight':'common'}}" data-time="{{item.secs}}">{{item.str}}</text>
</view>order
CSS层叠样式表1
2
3
4
5
6
7.show {
order: 1;
mix-blend-mode: difference;
filter: invert(1);
-webkit-filter: invert(1);/**-webkit:表示chrome与safari特有属性 */
color: green;
}XML布局文件
1
<text hidden="{{lastTime==item.secs?false:true}}" class="show" wx:key="item" wx:for="{{lyric_time}}" wx:for-item="item" wx:for-index="idx">{{item.str}}</text>
scroll-view
可滚动视图区域。使用竖向滚动时,需要给<scroll-view>一个固定高度,通过 WXSS 设置 height。组件属性的长度单位默认为px,2.4.0起支持传入单位(rpx/px)。
|属性 |类型 |默认值 |必填 |说明 |最低版本|
|—-|
|scroll-x |boolean |false |否 |允许横向滚动| 1.0.0|
|scroll-y |boolean |false |否 |允许纵向滚动| 1.0.0|
|upper-threshold |number/string| 50 |否 |距顶部/左边多远时,触发 scrolltoupper 事件 |1.0.0|
|lower-threshold | number/string | 50 |否| 距底部/右边多远时,触发 scrolltolower 事件 | 1.0.0 |
|scroll-top | number/string || 否 | 设置竖向滚动条位置 | 1.0.0 |
|scroll-left | number/string | | 否 | 设置横向滚动条位置 | 1.0.0 |
|scroll-into-view |string | |否 | 值应为某子元素id(id不能以数字开头)。设置哪个方向可滚动,则在哪个方向滚动到该元素 | 1.0.0 |
|scroll-with-animation | bollean | false | 否 | 在设置滚动条位置时使用动画过渡 | 1.0.0 |
|enable-back-to-top | bollean | false | 否 | iOS点击顶部状态栏、安卓双击标题栏时,滚动条返回顶部,只支持竖向 | 1.0.0 |
|bindscrolltoupper | eventhandle | |否 | 滚动到顶部/左边时触发 | 1.0.0 |
|bindscrolltolower | eventhandle | |否 | 滚动到底部/右边时触发 | 1.0.0 |
|bindscroll | eventhandle | |否 | 滚动时触发,event.detail = {scrollLeft, scrollTop, scrollHeight, scrollWidth, deltaX, deltaY}
- Tips
- 请勿在 scroll-view 中使用 textarea、map、canvas、video 组件
- scroll-into-view 的优先级高于 scroll-top
- 在滚动 scroll-view 时会阻止页面回弹,所以在 scroll-view 中滚动,是无法触发 onPullDownRefresh
- 若要使用下拉刷新,请使用页面的滚动,而不是 scroll-view ,这样也能通过点击顶部状态栏回到页面顶部
urlencode
problem: get url?param=value (value has character like ‘=’,’&’etc)
Javascript
escape()
采用ISO Latin字符集对指定的字符串进行编码。所有的 空格符、标点符号、特殊字符以及其他非ASCII字符 都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20。
不会被此方法编码的字符: @ * / +encodeURI()
把URI字符串采用UTF-8编码格式转化成escape格式的字符串。
不会被此方法编码的字符:! @ # $& * ( ) = : / ; ? + ‘encodeURIComponent()
把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。
不会被此方法编码的字符:! * ( ) ‘
因此,对于中文字符串来说,如果不希望把字符串编码格式转化成UTF-8格式的(比如原页面和目标页面的charset是一致的时候),只需要使用 escape。如果你的页面是GB2312或者其他的编码,而接受参数的页面是UTF-8编码的,就要采用encodeURI或者 encodeURIComponent。
Java 正则表达式贪婪模式&非贪婪模式
1 | Pattern pattern = Pattern.compile("window.Gbanners =[\n|\r\n](\\[.*?]);", Pattern.DOTALL); //非贪婪模式匹配... 假如:数组元素也是数组?? so how can i do it |
如果数组元素中也含有数组??? how ??
1 | private static void test() { |
如何提取”[hello, what happened ? [bye];….]”??
麻烦:
1 | String str = "window.Gbanners =\n[hello, what happened ? [bye];[yue];....];hello[yue];"; |
Result: [hello, what happened ? [bye];[yue];….]
Javascript正则表达式
1 | var patt1=/picUrl\s+:\s+\"([\w|\d|\\.|\\/|:|=]+)\"/g; |
Javascript正则表达式不包含分组概念,使用regex.exec()—>类比分组概念,but 一次获取一个ok…
GitHub
api:登陆…
由于github.com未在ICP备案因此微信小程序不可直接进行数据请求(自建服务器,不校验)
登陆
1 | POST /session HTTP/1.1 |
登出
1 | Request URL: https://github.com/logout |
stats请求: ????
1 | Request URL: https://api.github.com/_private/browser/stats |
小程序请求Cookie
请求后的数据
1 | { |
Cookie相关


由图可知
cookies设置简化
不用从header中setcookie查找分析
1 | res.cookies[{ |
Cookie设置
1 | wx.setStorageSync("sessionid", res.header["Set-Cookie"]) |
163Mail
api: 登陆
later
……
Java 正则表达式介绍
贪婪模式表达式:
贪婪模式 * + {n,} 默认情况是贪婪模式匹配
| 表达式 | 含义 |
|---|---|
| X? | X,一次或一次也没有 |
| X* | X,零次或多次 |
| X+ | X,一次或多次 |
| X{n} | X,恰好 n 次 |
| X{n,} | X,至少 n 次 |
| X{n,m} | X,至少 n 次,但是不超过 m 次 |
非贪婪模式表达式:
非贪婪模式,?跟在 * + {n,} 等的后面时,表示非贪婪模式,注意和子表达式后面的?区分开,子表达式后的?表示匹配0次或1次
| 表达式 | 含义 |
|---|---|
| X?? | X,一次或一次也没有 |
| X*? | X,零次或多次 |
| X+? | X,一次或多次 |
| X{n}? | X,恰好 n 次 |
| X{n,}? | X,至少 n 次 |
| X{n,m}? | X,至少 n 次,但是不超过 m 次 |
Problem
in util/core.js
1 | var app=getApp(); |
exception: app undefined … …
App() 必须在 app.js 中注册,且不能注册多个。
- 不要在定义于 App() 内的函数中调用 getApp() ,使用 this 就可以拿到 app 实例。
- 不要在 onLaunch 的时候调用 getCurrentPages(),此时 page 还没有生成。
- 通过 getApp() 获取实例之后,不要私自调用生命周期函数。
- 直接修改 this.data 而不调用 this.setData是无法改变页面的状态的,还会造成数据不一致。
- 单次设置的数据不能超过1024kB,请尽量避免一次设置过多的数据。
- 请不要把 data 中任何一项的 value 设为 undefined,否则这一项将不被设置并可能遗留一些潜在问题。