模拟微信小程序页面Page方法
1、依赖
a、jQuery
b、angularjs
2、page.js文件
1 var Page = function (options) {
2 var myApp = angular.module('myApp', []);
3 myApp.controller('myCtrl', function ($scope) {
4 $scope.setData = function (obj) {
5 for (let key in obj) {
6 eval("$scope." + key + "=obj[key]");
7 }
8 $scope.$applyAsync();
9 }
10 });
11 const {
12 onLoad,
13 onReady,
14 onPullDownRefresh,
15 onReachBottom,
16 onPageScroll
17 } = options;
18 options.onLoad = function (obj) {
19 options.setData(this.data);
20 onLoad && onLoad.call(this, obj)
21 }
22 options.onReady = function (opts) {
23 onReady && onReady.call(this, opts)
24 }
25 options.onPullDownRefresh = function (opts) {
26 onPullDownRefresh && onPullDownRefresh.call(this, opts)
27 }
28 options.stopPullDownRefresh = function () {
29 clearTimeout(__navAnimateGoTopTimeout);
30 $("#TheStatusRefresh").stop().animate({ top: "-40px" }, "fast", function () {
31 __navAnimatelock = false;
32 $("#TheStatusRefresh img").removeClass("route");
33 });
34 }
35 options.onReachBottom = function (opts) {
36 onReachBottom && onReachBottom.call(this, opts)
37 }
38 options.onPageScroll = function (opts) {
39 onPageScroll && onPageScroll.call(this, opts)
40 }
41 options.setData = function (obj) {
42 for (let key in obj) {
43 eval("options.data." + key + "=obj[key]");
44 }
45 var appElement = document.querySelector("[ng-controller=myCtrl]");
46 var $scope = angular.element(appElement).scope();
47 var fun = $scope.$eval("setData");
48 fun(obj);
49 };
50
51 var __disY, __startY, __endY;
52 var __navAnimatelock = false;
53 var __navAnimateGoTopTimeout;
54 var GetParamsToJson = function () {
55 var obj = {};
56 var url = $(location).attr('href');
57 if (url.indexOf("?") == -1) {
58 return {};
59 }
60 var arr = decodeURI(url).split("?")[1].split("&")
61 for (var i = 0; i < arr.length; i++) {
62 obj[arr[i].split("=")[0]] = unescape(arr[i].split("=")[1]);
63 }
64 return obj;
65 }
66
67 window.onload = function () {
68 var opts = GetParamsToJson();
69 options.onReady(opts);
70 }
71 $(document).ready(function () {
72 var opts = GetParamsToJson();
73 options.onLoad(opts);
74 $("body").on("click", "[click]", function () {
75 var func = $(this).attr("click");
76 if (options.hasOwnProperty(func)) {
77 options[func](this);
78 }
79 });
80 });
81 $(window).scroll(function (e) {
82 var scrollTop = $(this).scrollTop();
83 var viewH = $(this).height();
84 var contentH = $(document).height();
85 if (contentH - viewH - scrollTop <= 1) {
86 options.onReachBottom();
87 }
88 options.onPageScroll({ scrollTop: scrollTop });
89 });
90
91 if (onPullDownRefresh) {
92 $(document).on('touchstart', function (e) {
93 if (__navAnimatelock) {
94 return;
95 }
96 var scrollTop = $(this).scrollTop();
97 __startY = e.originalEvent.changedTouches[0].pageY - scrollTop;
98 });
99 $(document).on('touchmove', function (e) {
100 if (__navAnimatelock) {
101 return;
102 }
103 var scrollTop = $(this).scrollTop();
104 __endY = e.originalEvent.changedTouches[0].pageY;
105 __disY = __endY - __startY - scrollTop;
106 if (scrollTop > 0) {
107 return;
108 }
109 $("body").addClass("StaticBody");
110 if (__disY > -40 && __disY < 140) {
111 $('#TheStatusRefresh').css({
112 top: -40 + __disY + 'px',
113 });
114 }
115 else if (__disY >= 140) {
116 $('#TheStatusRefresh').css({
117 top: 140 - 40 + 'px',
118 });
119 }
120 else {
121 $('#TheStatusRefresh').css({
122 top: -40 + 'px',
123 });
124 }
125 });
126 $(document).on('touchend', function (e) {
127 if (__navAnimatelock) {
128 return;
129 }
130 $("body").removeClass("StaticBody");
131 var scrollTop = $(this).scrollTop();
132 __endY = e.originalEvent.changedTouches[0].pageY;
133 __disY = __endY - __startY - scrollTop;
134 if (scrollTop > 0) {
135 return;
136 }
137 if (__disY >= 70) {
138 __navAnimatelock = true;
139 $("#TheStatusRefresh").stop().animate({ top: "40px" }, "fast", function () {
140 __navAnimatelock = true;
141 $("#TheStatusRefresh img").addClass("route");
142 options.onPullDownRefresh();
143 __navAnimateGoTopTimeout = setTimeout(function () {
144 options.stopPullDownRefresh();
145 }, 3000);
146 });
147 }
148 else {
149 __navAnimatelock = true;
150 options.stopPullDownRefresh();
151 }
152 });
153 }
154 }
a:onPullDownRefresh

有个下拉动画
3、页面
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5 <meta http-equiv="Cache-Control" content="no-transform">
6 <meta http-equiv="Cache-Control" content="no-siteapp">
7 <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">
8 <meta content="black" name="apple-mobile-web-app-status-bar-style">
9 <meta content="yes" name="apple-mobile-web-app-capable">
10 <link href="page.css" rel="stylesheet" />
11 </head>
12 <body ng-controller="myCtrl" ng-app="myApp">
13 <div style="width:100px;height:2000px;" >
14 <p ng-bind="name" click="test" style="height:100px;width:100px;background-color:pink"></p>
15 </div>
16 <script src="jquery.js"></script>
17 <script src="angular.js"></script>
18 <script src="page.js"></script>
19 </body>
20 </html>
4、使用
Page({
data: {
name: '张三',
age: 1
},
onLoad: function (options) {
console.log("onLoad", options)
this.myFun1();
},
onReady: function () {
this.setData({
age: 222
});
console.log("onReady")
},
onReachBottom: function () {
console.log("onReachBottom")
},
myFun1: function () {
console.log('myFun1')
},
test: function (e) {
this.stopPullDownRefresh();
},
onPullDownRefresh: function () {
console.log(123)
}
})
a:绑定事件使用 click="方法名",其他事件可自行扩展
b:设置属性也跟微信一致,使用setData,直接给this.data.list赋值无效
c:onload方法的参数为当前页面地址栏参数转成的对象
5、用到的css
1 [click] {
2 cursor: pointer;
3 }
4
5 .StaticBody {
6 position: absolute;
7 overflow: hidden;
8 }
9
10 #TheStatusRefresh {
11 height: 40px;
12 width: 40px;
13 background: white;
14 position: fixed;
15 top: -40px;
16 border-radius: 100%;
17 left: calc(50% - 20px);
18 border: 1px solid #efefef;
19 padding: 9px;
20 }
21
22 #TheStatusRefresh img {
23 width: 20px;
24 height: 20px;
25 }
26
27 #TheStatusRefresh img.route {
28 -webkit-transition-property: -webkit-transform;
29 -webkit-transition-duration: 0.8s;
30 -moz-transition-property: -moz-transform;
31 -moz-transition-duration: 0.8s;
32 -webkit-animation: refresh_rotate 0.8s linear infinite;
33 -moz-animation: refresh_rotate 0.8s linear infinite;
34 -o-animation: refresh_rotate 0.8s linear infinite;
35 animation: refresh_rotate 0.8s linear infinite;
36 }
37
38 @@-webkit-keyframes refresh_rotate {
39 from {
40 -webkit-transform: rotate(0deg)
41 }
42
43 to {
44 -webkit-transform: rotate(360deg)
45 }
46 }
47
48 @@-moz-keyframes refresh_rotate {
49 from {
50 -moz-transform: rotate(0deg)
51 }
52
53 to {
54 -moz-transform: rotate(359deg)
55 }
56 }
57
58 @@-o-keyframes refresh_rotate {
59 from {
60 -o-transform: rotate(0deg)
61 }
62
63 to {
64 -o-transform: rotate(359deg)
65 }
66 }
67
68 @@keyframes refresh_rotate {
69 from {
70 transform: rotate(0deg)
71 }
72
73 to {
74 transform: rotate(359deg)
75 }
76 }
仅此记录一下
模拟微信小程序页面Page方法的更多相关文章
- 微信小程序页面跳转方法总结
微信小程序页面跳转目前有以下方法(不全面的欢迎补充): 1. 利用小程序提供的 API 跳转: // 保留当前页面,跳转到应用内的某个页面,使用wx.navigateBack可以返回到原页面.// 注 ...
- 微信小程序数据请求方法wx.request小测试
微信小程序数据请求方法 wx.request wxml文件: <view> <textarea value="{{textdata}}"/> </vi ...
- [转] 微信小程序页面间通信的5种方式
微信小程序页面间通的5种方式 PageModel(页面模型)对小程序而言是很重要的一个概念,从app.json中也可以看到,小程序就是由一个个页面组成的. 如上图,这是一个常见结构的小程序:首页是一个 ...
- 在微信小程序页面间传递数据总结
在微信小程序页面间传递数据 原文链接:https://www.jianshu.com/p/dae1bac5fc75 在开发微信小程序过程之中,遇到这么一些需要在微信小程序页面之间进行数据的传递的情况, ...
- 微信小程序-页面跳转与参数传递
QQ讨论群:785071190 微信小程序页面跳转方式有很多种,可以像HTML中a标签一样添加标签进行跳转,也可以通过js中方法进行跳转. navigator标签跳转 <view class=& ...
- 微信小程序页面调用自定义组件内的事件
微信小程序页面调用自定义组件内的事件 page page.json { "usingComponents": { "my-component": ". ...
- 微信小程序页面通信
目录 微信小程序页面通信 方式一:通过URL 方式二:通过全局变量 方式三:通过本地存储 方式四:通过路由栈 微信小程序页面通信 方式一:通过URL // A 页面 wx.navigateTo({ u ...
- 微信小程序--页面与组件之间如何进行信息传递和函数调用
微信小程序--页面与组件之间如何进行信息传递和函数调用 这篇文章我会以我自己开发经验从如下几个角度来讲解相关的内容 页面如何向组件传数据 组件如何向页面传数据 页面如何调用组件内的函数 组件如何调 ...
- 微信小程序开发系列教程三:微信小程序的调试方法
微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 这个教程的前两篇文章,介绍了如何用下图所示的微信开发者工具自动生成一个Hel ...
随机推荐
- Windows 系统蓝屏错误小全
0 0x00000000 作业完成. 1 0x00000001 不正确的函数. 2 0x00000002 系统找不到指定的档案. 3 0x00000003 系统找不到指定的路径. 4 0x000000 ...
- shell-脚本的执行
1. shell脚本的执行 当shell脚本以非交互的方式运行时,它会先查找环境变量ENV,该变量指定了一个环境文件(通常是.bashrc),然后从该环境变量文件开始执行,当读取了ENV文件后,she ...
- Nuxt+Vue聊天室|nuxt仿微信App界面|nuxt.js聊天实例
一.项目简述 nuxt-chatroom 基于Nuxt.js+Vue.js+Vuex+Vant+VPopup等技术构建开发的仿微信|探探App界面社交聊天室项目.实现了卡片式翻牌滑动.消息发送/emo ...
- 【转载】opencvVS2019配置方法
环境: 系统:win10系统截至2020920版本 opencv版本:3.0.0版本 IDE:宇宙最强IDEA最新版本2019社区版 教程: 1.下载opencv安装包官网下载链接:https://o ...
- 会用Docker的人都别装了,这多简单呐
学术又官方的说法 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是 ...
- 工程化编程实战callback接口学习笔记
一.编译并运行 help.version命令执行正常,但quit命令出错 二.Debug 从命令输入到执行过程: 源代码: 更改后: 运行结果:能正确运行quit命令 Callback接口学习成果: ...
- <!DOCTYPE>,<address>,<applet>的用法
希望以下内容能让大家有所收获 HTML <!DOCTYPE> 标签 实例 <!DOCTYPE html> <html> <head> <title ...
- C++ 智能指针(一)
内存安全 在C++中,动态内存的管理是通过一对运算符来完成的:new,在动态内存中为对象分配空间并返回一个指向该对象的指针,我们可以选择对对象来进行初始化:delete,接收一个动态对象的指针,销毁该 ...
- Django (学习第一部 基础操作)
django 1 django 文件相关信息 2 Python创建django 3 命令行创建django 4 Django 必会三板斧 5 静态文件配置 6 request对象方法 7 pychar ...
- Vue-cli3以上安装jquery
vue-cli3以上就没有webpack.config.js这个文件了,所以在安装jquery时 终端执行 npm install jquery --save 之后查看package.json 安装 ...