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. 微信小程序页面跳转方法总结

    微信小程序页面跳转目前有以下方法(不全面的欢迎补充): 1. 利用小程序提供的 API 跳转: // 保留当前页面,跳转到应用内的某个页面,使用wx.navigateBack可以返回到原页面.// 注 ...

  2. 微信小程序数据请求方法wx.request小测试

    微信小程序数据请求方法 wx.request wxml文件: <view> <textarea value="{{textdata}}"/> </vi ...

  3. [转] 微信小程序页面间通信的5种方式

    微信小程序页面间通的5种方式 PageModel(页面模型)对小程序而言是很重要的一个概念,从app.json中也可以看到,小程序就是由一个个页面组成的. 如上图,这是一个常见结构的小程序:首页是一个 ...

  4. 在微信小程序页面间传递数据总结

    在微信小程序页面间传递数据 原文链接:https://www.jianshu.com/p/dae1bac5fc75 在开发微信小程序过程之中,遇到这么一些需要在微信小程序页面之间进行数据的传递的情况, ...

  5. 微信小程序-页面跳转与参数传递

    QQ讨论群:785071190 微信小程序页面跳转方式有很多种,可以像HTML中a标签一样添加标签进行跳转,也可以通过js中方法进行跳转. navigator标签跳转 <view class=& ...

  6. 微信小程序页面调用自定义组件内的事件

    微信小程序页面调用自定义组件内的事件 page page.json { "usingComponents": { "my-component": ". ...

  7. 微信小程序页面通信

    目录 微信小程序页面通信 方式一:通过URL 方式二:通过全局变量 方式三:通过本地存储 方式四:通过路由栈 微信小程序页面通信 方式一:通过URL // A 页面 wx.navigateTo({ u ...

  8. 微信小程序--页面与组件之间如何进行信息传递和函数调用

    微信小程序--页面与组件之间如何进行信息传递和函数调用 ​ 这篇文章我会以我自己开发经验从如下几个角度来讲解相关的内容 页面如何向组件传数据 组件如何向页面传数据 页面如何调用组件内的函数 组件如何调 ...

  9. 微信小程序开发系列教程三:微信小程序的调试方法

    微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 这个教程的前两篇文章,介绍了如何用下图所示的微信开发者工具自动生成一个Hel ...

随机推荐

  1. vscode编写python,引用本地py文件出现红色波浪线

    前言 引用本地py文件出现红色波浪线,如下图: 原因 经过查询得知,vscode中的python插件默认使用的是pylint来做代码检查,因此需要对pylint做一些配置 解决方案 在setting. ...

  2. 微信小程序实时将less编译为wxss

    1.npm或者yarn全局安装wxss-cli npm install -g wxss-cli 2.运行waxes-cli命令(mp_wx为小程序目录) wxss ./mp_wx 实时监听mp_wx目 ...

  3. 【C语言高级编程】你见过长度为0的数组吗?管你信不信,看就完了!

    一.什么是零长度数组 零长度数组就是长度为0的数组. ANSI C 标准规定:定义一个数组时,数组的长度必须是一个常数,即数组的长度在编译的时候是确定的.在ANSI C 中定义一个数组的方法如下: 类 ...

  4. 扫描仪扫描文件处理-A4分辨率

    转换公式:毫米转英寸,英寸乘以DPI(每英寸点数) 1英寸 = 2.54 厘米 = 25.4 毫米 例子(600dpi):mm: 210x297 = px: 4961(210/25.4*600)x70 ...

  5. 【UR #9】App 管理器

    UOJ小清新题表 题目内容 UOJ链接 一句话题意:给出一个强联通的混合图,有一些有向边和无向边.删除一些边使其维持强联通的状态,求删边方案. 数据范围 \(1\leq n\leq 5000,0\le ...

  6. widows安装ffmpeg

    首先下载ffmpeg的windows版本https://ffmpeg.zeranoe.com/builds/ 解压到d盘 win+r cmd 说明成功了

  7. spring boot:redis+lua实现生产环境中可用的秒杀功能(spring boot 2.2.0)

    一,秒杀需要具备的功能: 秒杀通常是电商中用到的吸引流量的促销活动方式 搭建秒杀系统,需要具备以下几点: 1,限制每个用户购买的商品数量,(秒杀价格为吸引流量一般会订的很低,不能让一个用户全部抢购到手 ...

  8. matplotlib作图 归零编码、曼切斯特编码、非归零编码、差分曼切斯特编码

    效果图 代码 import matplotlib.pyplot as plt config = { 'color': 'black', 'lw': 5, } def init(): plt.figur ...

  9. 基于gin的golang web开发:路由

    Gin是一个用Golang编写的HTTP网络框架.它的特点是类似于Martini的API,性能更好.在golang web开发领域是一个非常热门的web框架. 启动一个Gin web服务器 使用下面的 ...

  10. 封装是java面向对象编程三大特征之一。 简单的属性封装

    package com.cqvie.Hello; class Person { private int age; private String name; public void tell() {   ...