@ajaxjs/ui 1.1.8 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/index.d.ts +0 -1
  2. package/dist/index.js +1 -2
  3. package/dist/index.js.map +1 -1
  4. package/dist/util/utils.d.ts +7 -0
  5. package/dist/util/utils.js +35 -1
  6. package/dist/util/utils.js.map +1 -1
  7. package/package.json +3 -3
  8. package/src/App.vue +14 -0
  9. package/src/index.ts +50 -0
  10. package/src/main.ts +12 -0
  11. package/src/pages/calendar.vue +33 -0
  12. package/src/pages/form.vue +68 -0
  13. package/src/pages/html-editor.vue +44 -0
  14. package/src/pages/index.vue +150 -0
  15. package/src/pages/play-ground.vue +14 -0
  16. package/src/pages/widgets.vue +183 -0
  17. package/src/router/index.ts +19 -0
  18. package/src/shims-vue.d.ts +4 -0
  19. package/src/style/common-functions.less +294 -0
  20. package/src/style/reset.less +19 -0
  21. package/src/util/cookies.ts +43 -0
  22. package/src/util/dom.ts +47 -0
  23. package/src/util/utils.ts +184 -0
  24. package/src/util/xhr-config.ts +25 -0
  25. package/src/util/xhr.ts +296 -0
  26. package/src/widget/AccordionMenu.vue +140 -0
  27. package/src/widget/AdjustFontSize.vue +65 -0
  28. package/src/widget/Article.vue +59 -0
  29. package/src/widget/EmptyContent.js +4 -0
  30. package/src/widget/Expander.vue +65 -0
  31. package/src/widget/FileUploader/FileUploader.less +68 -0
  32. package/src/widget/FileUploader/FileUploader.ts +156 -0
  33. package/src/widget/FileUploader/FileUploader.vue +43 -0
  34. package/src/widget/HtmlEditor/HtmlEditor.less +345 -0
  35. package/src/widget/HtmlEditor/HtmlEditor.ts +339 -0
  36. package/src/widget/HtmlEditor/HtmlEditor.vue +70 -0
  37. package/src/widget/HtmlEditor/html-editor-HtmlSanitizer.js +103 -0
  38. package/src/widget/ImageEnlarger.vue +105 -0
  39. package/src/widget/OpacityBanner.vue +125 -0
  40. package/src/widget/ProcessLine.vue +133 -0
  41. package/src/widget/Resize.ts +152 -0
  42. package/src/widget/Resize.vue +104 -0
  43. package/src/widget/TreeSelector.vue +4 -0
  44. package/src/widget/calendar/BetweenDate.vue +63 -0
  45. package/src/widget/calendar/Calendar.less +210 -0
  46. package/src/widget/calendar/Calendar.ts +167 -0
  47. package/src/widget/calendar/Calendar.vue +52 -0
  48. package/src/widget/calendar/CalendarInput.vue +71 -0
  49. package/src/widget/form/validator.ts +289 -0
  50. package/src/widget/play-ground/sku.vue +93 -0
@@ -0,0 +1,183 @@
1
+
2
+ <template>
3
+ <div class="home">
4
+ <!-- <h2>图片放大器</h2>
5
+ <div style="margin:0 auto;width:600px;text-align: center;">
6
+ <ImageEnlarger img-url="https://thebulletin.org/wp-content/uploads/2021/11/rosner-photo-1-150x150.jpg.webp" />
7
+ &nbsp;&nbsp;
8
+ <ImageEnlarger img-url="https://thebulletin.org/wp-content/uploads/2021/11/1280px-Construction_at_Vogtle_Nuclear_Plant-150x150.jpeg.webp" />
9
+ </div> -->
10
+
11
+ <h2>展开闭合器 expander</h2>
12
+ <p>常用于展开正文详情。提供过渡效果的图层,如果不需要把 div class="mask" 去掉即可。注意加入容器的 padding 会导致关闭时高度异常。</p>
13
+ <table class="aj-table" align="center">
14
+ <thead>
15
+ <tr>
16
+ <th>属性</th>
17
+ <th>含义</th>
18
+ <th>类型</th>
19
+ <th>是否必填,默认值</th>
20
+ </tr>
21
+ </thead>
22
+ <tbody>
23
+ <tr>
24
+ <td>openHeight</td>
25
+ <td>展开状态的高度</td>
26
+ <td>Number</td>
27
+ <td>n, 200</td>
28
+ </tr>
29
+ <tr>
30
+ <td>closeHeight</td>
31
+ <td>闭合状态的高度</td>
32
+ <td>Number</td>
33
+ <td>n, 50</td>
34
+ </tr>
35
+ <tr>
36
+ <td><code>&lt;slot</code>&gt;</td>
37
+ <td>正文内容扩展</td>
38
+ <td>String</td>
39
+ <td>n</td>
40
+ </tr>
41
+ </tbody>
42
+ </table>
43
+
44
+ <Expander :close-height="50" style="width: 300px;margin:5% auto;">
45
+ Lorem Ipsum,也称乱数假文或者哑元文本, 是印刷及排版领域所常用的虚拟文字。
46
+ 由于曾经一台匿名的打印机刻意打乱了一盒印刷字体从而造出一本字体样品书, Lorem Ipsum从西元15世纪起就被作为此领域的标准文本使用。
47
+ <div class="mask-layer"></div>
48
+ </Expander>
49
+
50
+ <h2>渐现 Banner</h2>
51
+ <p>原理上讲,就是为每张图片准备好定时器 timer,使其控制图片的透明度。当图片从透明度 0 到 100,就是渐现的过程; 与此同时,另外一张图片由透明度 100 下降到 0。这两个过程是同时发生的,一个渐现一个渐隐,便会造成如此的目标效果。</p>
52
+ <p><a href="https://zhangxin.blog.csdn.net/article/details/112055111" target="_blank">查看教程</a>
53
+ </p>
54
+
55
+ <OpacityBanner style="width:300px;margin:0 auto">
56
+ <li><img src="https://img1.mydrivers.com/img/topimg/20220315/192429144.jpg" /></li>
57
+ <li><img src="https://img1.mydrivers.com/img/topimg/20220315/192403940.jpg" /></li>
58
+ <li><img src="https://img1.mydrivers.com/img/topimg/20220315/192314256.jpg" /></li>
59
+ <li><a target="iframepage" href="../job/job.jsp">招聘管理</a></li>
60
+ </OpacityBanner>
61
+
62
+ <br />
63
+ <br />
64
+ <br />
65
+ <br />
66
+ <br />
67
+ <br />
68
+ <h2>进度条 Process Line</h2>
69
+ <ProcessLine />
70
+
71
+ <h2>折叠菜单 Accordion Menu</h2>
72
+ <p>折叠菜单的特点是同一时间只展开一个区域,其他区域则处于闭合状态。</p>
73
+
74
+ <p>属性说明:</p>
75
+ <table class="aj-table" align="center" width="500">
76
+ <thead>
77
+ <tr>
78
+ <th>属性</th>
79
+ <th>含义</th>
80
+ <th>类型</th>
81
+ <th>是否必填,默认值</th>
82
+ </tr>
83
+ </thead>
84
+ <tbody>
85
+ <tr>
86
+ <td><code>&lt;slot&gt;</code></td>
87
+ <td>菜单内容</td>
88
+ <td>String</td>
89
+ <td>y</td>
90
+ </tr>
91
+ </tbody>
92
+ </table>
93
+ <br />
94
+ <br />
95
+ <br />
96
+ <AccordionMenu style="width:300px;margin:0 auto">
97
+ <li class="siteMgr">
98
+ <h3>网站管理</h3>
99
+ <ul>
100
+ <li><a target="iframepage" href="website/profile/changePassword.jsp">帐号信息</a></li>
101
+ <li><a target="iframepage" href="website/profile/companyInfo.jsp">公司信息</a></li>
102
+ <li><a target="iframepage" href="website/gallery/companyAlbum.jsp">相 册</a></li>
103
+ <li><a target="iframepage" href="website/pageEditor/index.jsp">页面维护</a></li>
104
+ <li><a target="iframepage" href="website/profile/global.jsp">全局信息</a></li>
105
+ </ul>
106
+ </li>
107
+
108
+ <li class="news">
109
+ <h3>新闻中心管理</h3>
110
+ <ul>
111
+ <li><a target="iframepage" href="entry/list/news">新闻管理</a></li>
112
+ </ul>
113
+ </li>
114
+ <li class="levelPoints">
115
+ <h3>积分系统</h3>
116
+ <ul>
117
+ <li><a target="iframepage" href="levelPoints/memberTree.jsp">会员下线一览</a>
118
+ </li>
119
+ <li><a target="iframepage" href="levelPoints/showUserPoints.jsp">显示会员积分</a></li>
120
+ </ul>
121
+ </li>
122
+ <li>
123
+ <h3>其他信息</h3>
124
+ <ul>
125
+ <li><a target="iframepage" href="../job/job.jsp">留言管理</a></li>
126
+ <li><a target="iframepage" href="../job/job.jsp">招聘管理</a></li>
127
+ </ul>
128
+ </li>
129
+ </AccordionMenu>
130
+
131
+ <br />
132
+ <br />
133
+
134
+ <h2>文章 Article</h2>
135
+ <Article title="新股上市首日破发并非坏事 警示投资者打新风险" author="张三" source="http://qq.com" style="max-width:700px;margin:0 auto">
136
+
137
+ <p class="one-p">10月22日是科创板新股<span class="linkNormal">中自科技</span>新股上市的日子。按照惯例,新股上市大都会给打新中签的投资者带来一笔无风险的“打新收益”。但对于中自科技的中签者来说,他们期待中的“打新收益”落空了,迎接他们的是新股上市首日破发的命运。打新中签者不仅没有得到“打新收益”,相反还要承担一定的“打新损失”,中自科技上市首日的收盘价较发行价下跌了6.87%。</p>
138
+ <p class="one-p">新股上市首日破发,这对于打新中签者来说是非常揪心的一件事情。尤其是中自科技开盘即破发,没有给中签者丝毫的逃命机会。当天的最高价是70.50元,低于70.90元的发行价,这意味着打新中签者悉数被套,全部都要为自己“中签”的好运而付出代价。</p>
139
+ <p class="one-p">那么,中自科技为何会出现上市首日破发现象呢?究其原因主要有两点。一是发行价偏高,高达每股70.90元,其动态市盈率达到百倍。二是今年该公司业绩大幅滑坡。该公司预计,2021年1~9月营业收入为8.6亿元~9.5亿元,同比下滑57.48%至53.03%;预计归母净利润为4500万元~5400万元,同比下滑75.33%至70.40%;预计扣非后归母净利润为3000万元~3900万元,同比下滑84.63%至80.02%。也正因如此,中自科技上市首日破发并不令人意外,这也进一步证实投资者打新之盲目了。</p>
140
+ <p class="one-p"><img class="content-picture" src="https://img1.mydrivers.com/img/20210706/S91792917-e725-484b-b8c9-b2d0eda32981.png">
141
+ </p>
142
+ <p class="one-p">当然,新股上市首日破发在A股市场还是比较少见的。中自科技是今年以来科创板第一家上市首日破发新股,也是科创板成立以来第二只上市首日破发新股。科创板第一只上市首日破发新股是<span class="linkNormal">建龙微纳</span>,其上市之日是2019年12月4日,距今已有一年零10个月,这也足见新股上市首日破发的现象在A股市场并不常见。</p>
143
+ <p class="one-p">实际上,对于A股市场来说,新股上市首日破发是一件好事。虽然对于A股市场来说,新股破发现象并不少见,但这种新股破发大多都是新股上市之后经过了一轮甚至是几番的市场炒作之后,然后股价回落破发。这样的新股破发除了提醒投资者注意市场炒作的风险之外,其意义并不大。相反,新股上市首日破发意义更加重大。</p>
144
+ <p class="one-p">首先,新股上市首日破发它有利于提醒询价机构理性询价,而不能为了得到新股份额一味报高价。因为参与新股询价的机构投资者在询价有效的情况下,也是要参与新股配售的。如果新股定价太高,上市就破发了,这对于询价机构来说当然也是不利的。因为他们参与的新股配售份额也会因为破发而出现浮亏。</p>
145
+ <p class="one-p">其次,新股上市首日破发也有利于向投资者提醒打新的风险。因为A股市场长期以来的新股不败现象,结果导致投资者在打新时逢新必打,根本就不关心新股的基本面,同时也不关心新股的发行价格,甚至将高价发行的新股视为“肉签”股。虽然在过去也经常出现新股破发现象,但新股经过一番炒作之后的破发,并没有危及到打新者的利益,并不会让打新者增加风险意识。而只有新股上市首日破发,才会直接损害到打新者的利益,只有在这种情况下,打新者才会真正意识到打新的风险,从而让打新者关心到新股的基本面,学会理性打新。当然,要达到这个目的,还需要新股上市首日破发现象进一步增加,呈现出一种常态化,这样更有利于投资者理性打新。</p>
146
+ <p class="one-p">此外,新股上市首日破发也有利于向市场警示炒新的风险。在新股不败的市场环境下,投资者除了盲目打新之外,还会盲目炒新,以至一只新股上市后,通常都会炒出几个、十几个甚至几十个涨停板出来。因此,一只新股上市,往往都会受到市场的投机炒作。而新股上市首日破发,对于炒新者是一个打击。因为炒新者盲目追进新股之后发现,股价不仅没有炒上去,相反股价在进一步下跌,炒新变成了套牢。因此,新股上市首日破发对于炒新者来说也是一种风险警示。</p>
147
+
148
+ </Article>
149
+ </div>
150
+ </template>
151
+
152
+ <script>
153
+ import OpacityBanner from "@/widget/OpacityBanner.vue";
154
+ import ProcessLine from "@/widget/ProcessLine.vue";
155
+ import AccordionMenu from "@/widget/AccordionMenu.vue";
156
+ import Expander from "@/widget/Expander";
157
+ import ImageEnlarger from "@/widget/ImageEnlarger";
158
+ import Article from '@/widget/Article.vue';
159
+
160
+ export default {
161
+ components: {
162
+ OpacityBanner,
163
+ ProcessLine,
164
+ AccordionMenu,
165
+ Expander,
166
+ ImageEnlarger,
167
+ Article
168
+ },
169
+ };
170
+ </script>
171
+
172
+ <style lang="less" scoped >
173
+ p {
174
+ width: 500px;
175
+ // .aj-text-function();
176
+ margin: 20px auto;
177
+ text-indent: 2em;
178
+ }
179
+ h2 {
180
+ // text-align: left;
181
+ margin: 20px auto;
182
+ }
183
+ </style>
@@ -0,0 +1,19 @@
1
+ import Vue from 'vue'
2
+ import VueRouter, { RouteConfig } from 'vue-router'
3
+ // import Home from '../views/Home.vue'
4
+
5
+ Vue.use(VueRouter);
6
+
7
+ const routes: Array<RouteConfig> = [
8
+ {
9
+ path: '/',
10
+ name: 'Home',
11
+ component: () => import(/* webpackChunkName: "about" */ '../pages/index.vue')
12
+ }
13
+ ];
14
+
15
+ const router = new VueRouter({
16
+ routes
17
+ });
18
+
19
+ export default router;
@@ -0,0 +1,4 @@
1
+ declare module '*.vue' {
2
+ import Vue from 'vue'
3
+ export default Vue
4
+ }
@@ -0,0 +1,294 @@
1
+ :root {
2
+ --admin-main-color: #1e6bb8;
3
+ }
4
+
5
+ .aj-center-title () {
6
+ text-align : center;
7
+ font-size : 1.3rem;
8
+ font-weight : bold;
9
+ letter-spacing: 5px;
10
+ padding : 20px 0;
11
+ }
12
+
13
+ .aj-text-function() {
14
+ color : #333;
15
+ line-height : 160%;
16
+ margin : 15px 0;
17
+ font-size : .95rem;
18
+ letter-spacing: 1px;
19
+ text-align : justify;
20
+ }
21
+
22
+ .centerBody (@defaultWidth: 1300px) {
23
+ max-width: @defaultWidth;
24
+ margin : 0 auto;
25
+ width : 100%;
26
+ height : 100%;
27
+ }
28
+
29
+ .transition (@t) {
30
+ -webkit-transition: @t;
31
+ -moz-transition : @t;
32
+ -ms-transition : @t;
33
+ -o-transition : @t;
34
+ transition : @t;
35
+ }
36
+
37
+ .transition_withTransform (@t) {
38
+ -webkit-transition: -webkit-transform @t;
39
+ -moz-transition : -moz-transform @t;
40
+ -ms-transition : -moz-transform @t;
41
+ -o-transition : -o-transform @t;
42
+ transition : transform @t;
43
+ }
44
+
45
+ .transform (@t) {
46
+ -webkit-transform: @t;
47
+ -moz-transform : @t;
48
+ -ms-transform : @t;
49
+ -o-transform : @t;
50
+ -transform : @t;
51
+ }
52
+
53
+ .heightFx () {
54
+ .transition (300ms height ease-out);
55
+ }
56
+
57
+ .widthFx () {
58
+ .transition (200ms width ease-out);
59
+ }
60
+
61
+ .leftFx () {
62
+ .transition (200ms left linear);
63
+ }
64
+
65
+ // 解决使用CSS动画时闪烁的问题
66
+ // http://ued.taobao.com/blog/2012/01/chrome%E6%B8%B2%E6%9F%93transition%E6%97%B6%E9%A1%B5%E9%9D%A2%E9%97%AA%E5%8A%A8bug/
67
+ .fixTransitionFlash () {
68
+ backface-visibility : hidden;
69
+ -webkit-backface-visibility: hidden;
70
+ -moz-backface-visibility : hidden;
71
+ }
72
+
73
+ // 解决高度塌陷的问题 – 清除浮动 或叫 闭合浮动
74
+ // http://www.iyunlu.com/view/css-xhtml/55.html
75
+ // http://www.zhangxinxu.com/wordpress/2010/01/css-float%E6%B5%AE%E5%8A%A8%E7%9A%84%E6%B7%B1%E5%85%A5%E7%A0%94%E7%A9%B6%E3%80%81%E8%AF%A6%E8%A7%A3%E5%8F%8A%E6%8B%93%E5%B1%95%E4%BA%8C/
76
+ // 强制换行
77
+ .forceBreak () {
78
+ word-wrap : break-word;
79
+ word-break: break-all;
80
+ }
81
+
82
+ .giveHeight () {
83
+ overflow: hidden;
84
+ zoom : 1;
85
+ }
86
+
87
+ // 透明度
88
+ .imgOpacityShow (@time: 300ms) {
89
+ .transition (opacity @time ease-in);
90
+ }
91
+
92
+ // 旋转角度
93
+ .rotate (@ro: 30deg) {
94
+ .transform (rotate(@ro));
95
+ }
96
+
97
+ // 渐变
98
+ .gradient (@direction , @startColor , @endColor) {
99
+ background-image: -webkit-linear-gradient(@direction, @startColor, @endColor);
100
+ background-image: -moz-linear-gradient(@direction, @startColor, @endColor);
101
+ background-image: -ms-linear-gradient(@direction, @startColor, @endColor);
102
+ background-image: -o-linear-gradient(@direction, @startColor, @endColor);
103
+ background-image: linear-gradient(@direction, @startColor, @endColor);
104
+ }
105
+
106
+ // 渐变
107
+ .gradient (@direction , @startColor , @midColor , @endColor) {
108
+ background-image: -webkit-linear-gradient(@direction, @startColor, @midColor, @endColor);
109
+ background-image: -moz-linear-gradient(@direction, @startColor, @midColor, @endColor);
110
+ background-image: -ms-linear-gradient(@direction, @startColor, @midColor, @endColor);
111
+ background-image: -o-linear-gradient(@direction, @startColor, @midColor, @endColor);
112
+ background-image: linear-gradient(@direction, @startColor, @midColor, @endColor);
113
+ }
114
+
115
+ .fadeIn (@duration) {
116
+ animation : fade-in;
117
+ animation-duration: @duration;
118
+ -webkit-animation : fade-in @duration;
119
+ }
120
+
121
+ .fadeOut (@duration) {
122
+ animation : fade-out-hide;
123
+ animation-duration: @duration;
124
+ -webkit-animation : fade-out-hide @duration;
125
+ }
126
+ .aj-text-title {
127
+ letter-spacing: 2px;
128
+ margin: 10px;
129
+ }
130
+ .aj-text-function() {
131
+ color : #333;
132
+ line-height : 160%;
133
+ margin : 15px 0;
134
+ font-size : .95rem;
135
+ letter-spacing: 1px;
136
+ text-align : justify;
137
+ }
138
+
139
+ // 快速制作1px 表格边框,为需要设置的 table 元素加上 border 的class即可
140
+ .aj-table {
141
+ border : 1px lightgray solid;
142
+ border-collapse: collapse;
143
+ border-spacing : 0;
144
+
145
+ th {
146
+ background-color: #efefef;
147
+ letter-spacing : 3px;
148
+ }
149
+
150
+ td,
151
+ th {
152
+ border : 1px lightgray solid;
153
+ line-height: 160%;
154
+ height : 120%;
155
+ padding : 6px;
156
+ }
157
+
158
+ tr {
159
+ .transition (background-color 400ms ease-out);
160
+
161
+ &:nth-child(odd) {
162
+ background: #f5f5f5;
163
+ box-shadow: 0 1px 0 rgba(255, 255, 255, .8) inset;
164
+ }
165
+
166
+ &:hover {
167
+ background-color: #fbf8e9;
168
+ }
169
+ }
170
+
171
+ }
172
+
173
+ .aj-form-table {
174
+ border-collapse: collapse;
175
+ border-spacing : 0;
176
+
177
+ th {
178
+ background-color: #efefef;
179
+ letter-spacing : 3px;
180
+ }
181
+
182
+ td,
183
+ th {
184
+ line-height: 160%;
185
+ height : 120%;
186
+ padding : 10px 15px;
187
+ }
188
+
189
+ tr {
190
+ .transition (background-color 400ms ease-out);
191
+
192
+ &:nth-child(odd) {
193
+ background: #f5f5f5;
194
+ box-shadow: 0 1px 0 rgba(255, 255, 255, .8) inset;
195
+ }
196
+
197
+ &:hover {
198
+ background-color: #fbf8e9;
199
+ }
200
+ }
201
+ }
202
+
203
+ .aj-btn-base() {
204
+ min-height : 26px;
205
+ font-size : .8rem;
206
+ //line-height: 100%;
207
+ padding : .3em 2.3em;
208
+ margin : 10px auto;
209
+ color : #333;
210
+ letter-spacing : .3em;
211
+ border-radius : 4px;
212
+ border : 1px solid #ccc;
213
+ border-bottom-color: #B4B4B4;
214
+ box-shadow : 0 1px 3px rgba(0, 0, 0, 0.12);
215
+ text-shadow : 0 1px 0 rgba(255, 255, 255, 0.8);
216
+ background-color : lightgray;
217
+ background-repeat : repeat-x;
218
+ transition : background-image 0.5s linear 1s;
219
+ cursor : pointer;
220
+ outline : 0;
221
+ .gradient (to bottom, rgba(255, 255, 255, 1) 0%, rgba(239, 239, 239, 1) 60%, rgba(225, 223, 226, 1) 100%);
222
+
223
+ img {
224
+ vertical-align: middle;
225
+ }
226
+
227
+ &:hover {
228
+ color : black;
229
+ border-color: lighten(black, 65%);
230
+ }
231
+
232
+ &:active {
233
+ box-shadow : inset 0 3px 5px rgba(0, 0, 0, .2);
234
+ border-color: lighten(black, 55%);
235
+ }
236
+
237
+ &:focus {
238
+ border-color: lighten(black, 60%);
239
+ }
240
+
241
+ &:hover {
242
+ background-position: 0px -10px;
243
+ }
244
+ }
245
+
246
+ .aj-btnsHolder {
247
+ text-align: center;
248
+ padding : 2% 0;
249
+
250
+ button {
251
+ margin-right: 3% !important;
252
+ }
253
+ }
254
+
255
+ .aj-input-base() {
256
+ min-height : 25px;
257
+ font-size : .9rem;
258
+ border : 1px solid #abadb3;
259
+ // border-radius : 3px;
260
+ box-sizing : border-box;
261
+ background-color: white;
262
+ transition : border-color ease-in-out 200ms;
263
+ outline : 0;
264
+ padding : 2px;
265
+ vertical-align : middle;
266
+ color : #333;
267
+ // letter-spacing : 1px;
268
+
269
+ &:hover,
270
+ &:focus {
271
+ // box-shadow : 1px 2px 3px #e5e5e5 inset;
272
+ border-color: lighten(black, 45);
273
+ }
274
+ }
275
+
276
+ form.aj-form {
277
+ input[type=text], .form input[type=password], .form textarea{
278
+ .aj-input-base();
279
+ }
280
+ button {
281
+ .aj-btn-base();
282
+ }
283
+
284
+ select {
285
+ color: gray;
286
+ height: 25px;
287
+ border: 1px solid gray;
288
+ }
289
+
290
+ select:hover {
291
+ border-color: black;
292
+ }
293
+
294
+ }
@@ -0,0 +1,19 @@
1
+ /* AJAXJS Base CSS */
2
+ body,dl,dt,dd,ul,li,pre,form,fieldset,input,p,blockquote,th,td,h1,h2,h3,h4,h5{margin:0;padding:0;}
3
+ h1,h2,h3,h4,h5{font-weight: normal;}img{border:0;}ul li{list-style-type:none}.hide{display:none}
4
+ body {-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing: grayscale;
5
+ font-family: "Lantinghei SC", "Open Sans", Arial, "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", "STHeiti", "WenQuanYi Micro Hei", SimSun, sans-serif;}
6
+
7
+ /* a{text-decoration:none;color:#666;transition:color .4s ease-in-out;}
8
+ a:hover{color:#000;}
9
+ button{border:none;outline:0;cursor:pointer;letter-spacing:2px;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none}
10
+ input[type=password],input[type=text],select,textarea{outline:0;-moz-appearance:none;} */
11
+
12
+ /* 手机端浏览器所显示的网页 CSS */
13
+ @media screen and (max-width:480px) {
14
+ * {
15
+ -webkit-tap-highlight-color: transparent; /* 很多 Android 浏览器的 a 链接有边框,这里取消它 */
16
+ -webkit-touch-callout: none; /* 在 iOS 浏览器里面,假如用户长按 a 标签,都会出现默认的弹出菜单事件 */
17
+ /* -webkit-user-select:none; */
18
+ }
19
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * 获取某个 Cookie
3
+ *
4
+ * @param name 键名称
5
+ * @returns 值
6
+ */
7
+ export function getCookie(name: string): string | null {
8
+ let arr: RegExpMatchArray, reg: RegExp = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
9
+
10
+ if (arr = document.cookie.match(reg))
11
+ return unescape(arr[2]);
12
+ else
13
+ return null;
14
+ }
15
+
16
+ /**
17
+ * 设置某个 Cookie
18
+ *
19
+ * @param name 键名称
20
+ * @param value 值
21
+ */
22
+ export function setCookie(name: string, value: string): void {
23
+ let days: number = 2, exp: Date = new Date();
24
+ exp.setTime(exp.getTime() + days * 24 * 60 * 60 * 1000);
25
+ // @ts-ignore
26
+ document.cookie = name + "=" + escape(value) + ";path=/;expires=" + exp.toGMTString();
27
+ }
28
+
29
+ /**
30
+ * 清空 Cookie
31
+ */
32
+ export function delCookie(): void {
33
+ let keys = document.cookie.match(/[^ =;]+(?==)/g);
34
+
35
+ if (keys) {
36
+ let date: string = new Date(0).toUTCString();
37
+ for (let i = keys.length; i--;) {
38
+ document.cookie = keys[i] + '=0;path=/;expires=' + date; // 清除当前域名下的,例如:m.ratingdog.cn
39
+ document.cookie = keys[i] + '=0;path=/;domain=' + document.domain + ';expires=' + date; // 清除当前域名下的,例如 .m.ratingdog.cn
40
+ document.cookie = keys[i] + '=0;path=/;domain=' + location.host + ';expires=' + date; // 清除一级域名下的或指定的,例如 .ratingdog.cn
41
+ }
42
+ }
43
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * 向父级元素递归搜索
3
+ *
4
+ * @param _el 当前所在元素
5
+ * @param tagName 目标标签名称
6
+ * @param className 目标元素样式类
7
+ * @returns 目标元素,找不到为 null
8
+ */
9
+ export function up(_el: Element, tagName: string, className: string): Element | null {
10
+ if (tagName && className)
11
+ throw '只能任选一种参数,不能同时传';
12
+
13
+ let el: Element = _el.parentNode as Element;
14
+ tagName = tagName && tagName.toUpperCase();
15
+
16
+ while (el) {
17
+ if (tagName && el.tagName == tagName)
18
+ return el;
19
+
20
+ if (className && el.className && ~el.className.indexOf(className))
21
+ return el;
22
+
23
+ el = <Element>el.parentNode;
24
+ }
25
+
26
+ return null;
27
+ }
28
+
29
+ /**
30
+ * 加载脚本
31
+ *
32
+ * @param url 脚本地址
33
+ * @param id 脚本元素 id,可选的
34
+ * @param cb 回调函数,可选的
35
+ */
36
+ export function loadScript(url: string, id?: string, cb?: (ev: Event) => any): void {
37
+ let script: HTMLScriptElement = document.createElement("script");
38
+ script.src = url;
39
+
40
+ if (cb)
41
+ script.onload = cb;
42
+
43
+ if (id)
44
+ script.id = id;
45
+
46
+ document.getElementsByTagName("head")[0].appendChild(script);
47
+ }