重新调整目录结构;使用es6语法重写,Babel自动自动以UMD规范编译为es5, 以更好的支持webpack
|
@ -2,5 +2,7 @@
|
||||||
*.min.css
|
*.min.css
|
||||||
index.html
|
index.html
|
||||||
.vscode
|
.vscode
|
||||||
|
node_modules/
|
||||||
|
dist/
|
||||||
dist.sublime-project
|
dist.sublime-project
|
||||||
dist.sublime-workspace
|
dist.sublime-workspace
|
14
Readme.md
|
@ -2,3 +2,17 @@
|
||||||
|
|
||||||
## yua.js 框架
|
## yua.js 框架
|
||||||
> yua.js是一款迷你,易用、高性能的前端MVVM框架, 属于单独维护avalon的一个独立分支, 基于avalon1.5开发, 精简部分冗余的API, 同时针对组件拓展进行了优化。
|
> yua.js是一款迷你,易用、高性能的前端MVVM框架, 属于单独维护avalon的一个独立分支, 基于avalon1.5开发, 精简部分冗余的API, 同时针对组件拓展进行了优化。
|
||||||
|
|
||||||
|
|
||||||
|
## doUI 组件库
|
||||||
|
> doUI组件库是基于yua框架开发的一套高效,轻量,可定制的现代化组件库。
|
||||||
|
|
||||||
|
|
||||||
|
## 开发环境及生产环境
|
||||||
|
```bash
|
||||||
|
# 开发环境
|
||||||
|
npm start
|
||||||
|
|
||||||
|
# 生产环境
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
|
@ -0,0 +1,95 @@
|
||||||
|
#! /usr/bin/env node
|
||||||
|
|
||||||
|
const fs = require('iofs')
|
||||||
|
const path = require('path')
|
||||||
|
const babel = require('babel-core')
|
||||||
|
const scss = require('node-sass')
|
||||||
|
const chokidar = require('chokidar')
|
||||||
|
const log = console.log
|
||||||
|
|
||||||
|
const sourceDir = path.resolve(__dirname, 'src')
|
||||||
|
const buildDir = path.resolve(__dirname, 'dist')
|
||||||
|
const jsOpt = {
|
||||||
|
presets: ['es2015'],
|
||||||
|
plugins: ['transform-es2015-modules-umd']
|
||||||
|
}
|
||||||
|
const cssOpt = {
|
||||||
|
includePaths: ['src/css/'],
|
||||||
|
outputStyle: 'compressed'
|
||||||
|
}
|
||||||
|
|
||||||
|
const compileJs = (entry, output) => {
|
||||||
|
let t1 = Date.now()
|
||||||
|
const { code } = babel.transformFileSync(entry, jsOpt)
|
||||||
|
log('编译JS: %s, 耗时 %d ms', entry, Date.now() - t1)
|
||||||
|
fs.echo(code, output)
|
||||||
|
}
|
||||||
|
|
||||||
|
const compileCss = (entry, output) => {
|
||||||
|
let t1 = Date.now()
|
||||||
|
const { css } = scss.renderSync({ ...cssOpt, file: entry })
|
||||||
|
log('编译scss: %s, 耗时 %d ms', entry, Date.now() - t1)
|
||||||
|
fs.echo(css, output)
|
||||||
|
}
|
||||||
|
|
||||||
|
const compileHtm = (entry, output) => {
|
||||||
|
let t1 = Date.now()
|
||||||
|
let htm = fs.cat(entry).toString('utf8')
|
||||||
|
htm = htm.replace(/[\r\n\t]+/g, ' ').replace(/\s{2,}/g, ' ')
|
||||||
|
log('压缩HTML: %s, 耗时 %d ms', entry, Date.now() - t1)
|
||||||
|
fs.echo(htm, output)
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=======================================================*/
|
||||||
|
/*===== ===*/
|
||||||
|
/*=======================================================*/
|
||||||
|
|
||||||
|
const fontFiles = fs.ls('./src/font/', true)
|
||||||
|
const jsFiles = fs.ls('./src/js/', true)
|
||||||
|
const cssFiles = fs.ls('./src/css/', true)
|
||||||
|
|
||||||
|
// 字体文件直接复制
|
||||||
|
chokidar.watch(path.join(sourceDir, 'font/')).on('all', (act, file) => {
|
||||||
|
if (act === 'add' || act === 'change') {
|
||||||
|
let output = file.replace('src/font/', 'dist/font/')
|
||||||
|
fs.cp(file, output)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// css目录
|
||||||
|
chokidar.watch(path.resolve(sourceDir, 'css/')).on('all', (act, file) => {
|
||||||
|
if (act === 'add' || act === 'change') {
|
||||||
|
if (/\.scss$/.test(file)) {
|
||||||
|
let output = file.replace('src/css/', 'dist/css/')
|
||||||
|
|
||||||
|
compileCss(file, output)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// js目录的处理要复杂一点
|
||||||
|
chokidar
|
||||||
|
.watch(path.resolve(sourceDir, 'js/'))
|
||||||
|
.on('all', (act, file) => {
|
||||||
|
if (act === 'add' || act === 'change') {
|
||||||
|
let output = file.replace('src/js/', 'dist/js/')
|
||||||
|
let ext = file.slice(file.lastIndexOf('.') + 1)
|
||||||
|
switch (ext) {
|
||||||
|
case 'js':
|
||||||
|
compileJs(file, output)
|
||||||
|
break
|
||||||
|
case 'scss':
|
||||||
|
output = output.replace(/scss$/, 'css')
|
||||||
|
compileCss(file, output)
|
||||||
|
break
|
||||||
|
case 'htm':
|
||||||
|
compileHtm(file, output)
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
fs.cp(file, output)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.on('ready', () => {
|
||||||
|
log('预处理完成,监听文件变化中,请勿关闭本窗口...')
|
||||||
|
})
|
|
@ -0,0 +1,93 @@
|
||||||
|
#! /usr/bin/env node
|
||||||
|
|
||||||
|
const fs = require('iofs')
|
||||||
|
const path = require('path')
|
||||||
|
const babel = require('babel-core')
|
||||||
|
const scss = require('node-sass')
|
||||||
|
const log = console.log
|
||||||
|
|
||||||
|
const sourceDir = path.resolve(__dirname, 'src')
|
||||||
|
const buildDir = path.resolve(__dirname, 'dist')
|
||||||
|
const jsOpt = {
|
||||||
|
presets: ['es2015', 'minify'],
|
||||||
|
plugins: ['transform-es2015-modules-umd']
|
||||||
|
}
|
||||||
|
const cssOpt = {
|
||||||
|
includePaths: ['src/css/'],
|
||||||
|
outputStyle: 'compressed'
|
||||||
|
}
|
||||||
|
|
||||||
|
const compileJs = (entry, output) => {
|
||||||
|
let t1 = Date.now()
|
||||||
|
const { code } = babel.transformFileSync(entry, jsOpt)
|
||||||
|
log('编译JS: %s, 耗时 %d ms', entry, Date.now() - t1)
|
||||||
|
fs.echo(code, output)
|
||||||
|
}
|
||||||
|
|
||||||
|
const compileCss = (entry, output) => {
|
||||||
|
let t1 = Date.now()
|
||||||
|
const { css } = scss.renderSync({ ...cssOpt, file: entry })
|
||||||
|
log('编译scss: %s, 耗时 %d ms', entry, Date.now() - t1)
|
||||||
|
fs.echo(css, output)
|
||||||
|
}
|
||||||
|
|
||||||
|
const compileHtm = (entry, output) => {
|
||||||
|
let t1 = Date.now()
|
||||||
|
let htm = fs.cat(entry).toString('utf8')
|
||||||
|
htm = htm.replace(/[\r\n\t]+/g, ' ').replace(/\s{2,}/g, ' ')
|
||||||
|
log('压缩HTML: %s, 耗时 %d ms', entry, Date.now() - t1)
|
||||||
|
fs.echo(htm, output)
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=======================================================*/
|
||||||
|
/*===== ===*/
|
||||||
|
/*=======================================================*/
|
||||||
|
|
||||||
|
const fontFiles = fs.ls('./src/font/', true)
|
||||||
|
const jsFiles = fs.ls('./src/js/', true)
|
||||||
|
const cssFiles = fs.ls('./src/css/', true)
|
||||||
|
|
||||||
|
if (fs.isdir(buildDir)) {
|
||||||
|
fs.rm(buildDir, true)
|
||||||
|
log('清除旧目录 dist/')
|
||||||
|
}
|
||||||
|
|
||||||
|
// 字体文件直接复制
|
||||||
|
fontFiles.forEach(file => {
|
||||||
|
fs.cp('./src/font/' + file, './dist/font/' + file)
|
||||||
|
})
|
||||||
|
|
||||||
|
// css目录
|
||||||
|
cssFiles.forEach(file => {
|
||||||
|
if (/\.scss$/.test(file)) {
|
||||||
|
let entry = path.resolve(sourceDir, 'css/', file)
|
||||||
|
let output = path.resolve(buildDir, 'css/', file.replace(/scss$/, 'css'))
|
||||||
|
|
||||||
|
compileCss(entry, output)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// js目录的处理要复杂一点
|
||||||
|
jsFiles.forEach(file => {
|
||||||
|
let entry = path.resolve(sourceDir, 'js', file)
|
||||||
|
let output = path.resolve(buildDir, 'js', file)
|
||||||
|
let ext = file.slice(file.lastIndexOf('.') + 1)
|
||||||
|
|
||||||
|
switch (ext) {
|
||||||
|
case 'js':
|
||||||
|
compileJs(entry, output)
|
||||||
|
break
|
||||||
|
case 'scss':
|
||||||
|
output = output.replace(/scss$/, 'css')
|
||||||
|
compileCss(entry, output)
|
||||||
|
break
|
||||||
|
case 'htm':
|
||||||
|
compileHtm(entry, output)
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
if (!fs.isdir(entry)) {
|
||||||
|
fs.cp(entry, output)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
*{margin:0;padding:0;vertical-align:baseline;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section,content{display:block}img{border:0;display:inline-block}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote::before,blockquote::after,q::before,q::after{content:'';content:none}table{border-collapse:collapse;border-spacing:0}a:focus,input,button:focus,input:focus{outline:none}::-moz-focus-inner{border:none;outline:none}@font-face{font-family:"ui font";src:url("../font/ui-font.eot");src:url("../font/ui-font.ttf") format("truetype")}.do-ui-font{display:inline-block;font-family:"ui font" !important;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.do-fn-cl{*zoom:1}.do-fn-cl::after{content:".";display:block;height:0;clear:both;visibility:hidden;overflow:hidden}.do-fn-clear{clear:both;display:inline}.do-fn-show{display:block}.do-fn-hide{display:none}.do-fn-fl{float:left}.do-fn-fr{float:right}.do-fn-noselect{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.do-fn-noselect img,.do-fn-noselect a{-webkit-user-drag:none}.do-fn-ell{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.do-st-thin{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.do-st-hand{cursor:pointer}
|
|
|
@ -1,275 +0,0 @@
|
||||||
.CodeMirror {
|
|
||||||
height: 100%;
|
|
||||||
line-height: 1.5;
|
|
||||||
font-family: monospace;
|
|
||||||
position: relative;
|
|
||||||
overflow: hidden;
|
|
||||||
background: #272822;
|
|
||||||
color: #f8f8f2
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-scroll {
|
|
||||||
overflow: auto;
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
position: relative;
|
|
||||||
outline: none
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-scrollbar {
|
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
top: 0;
|
|
||||||
overflow-x: hidden;
|
|
||||||
overflow-y: scroll;
|
|
||||||
z-index: 5
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-scrollbar-inner {
|
|
||||||
width: 1px
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-scrollbar.cm-sb-overlap {
|
|
||||||
position: absolute;
|
|
||||||
z-index: 1;
|
|
||||||
float: none;
|
|
||||||
right: 0;
|
|
||||||
min-width: 12px
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-scrollbar.cm-sb-nonoverlap {
|
|
||||||
min-width: 12px
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-scrollbar.cm-sb-ie7 {
|
|
||||||
min-width: 18px
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-gutter {
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
top: 0;
|
|
||||||
z-index: 10;
|
|
||||||
background-color: transparent;
|
|
||||||
border-right: 1px solid #454545;
|
|
||||||
min-width: 2em;
|
|
||||||
height: 100%
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-gutter-text {
|
|
||||||
color: #aaa;
|
|
||||||
text-align: right;
|
|
||||||
padding: .4em .2em .4em .4em;
|
|
||||||
white-space: pre !important;
|
|
||||||
cursor: default
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-lines {
|
|
||||||
padding: .4em;
|
|
||||||
white-space: pre;
|
|
||||||
cursor: text
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror pre {
|
|
||||||
-moz-border-radius: 0;
|
|
||||||
-webkit-border-radius: 0;
|
|
||||||
-o-border-radius: 0;
|
|
||||||
border-radius: 0;
|
|
||||||
border-width: 0;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
background: transparent;
|
|
||||||
font-family: inherit;
|
|
||||||
font-size: inherit;
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
white-space: pre;
|
|
||||||
word-wrap: normal;
|
|
||||||
line-height: inherit;
|
|
||||||
color: inherit;
|
|
||||||
overflow: visible
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-wrap pre {
|
|
||||||
word-wrap: break-word;
|
|
||||||
white-space: pre-wrap;
|
|
||||||
word-break: normal
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-wrap .CodeMirror-scroll {
|
|
||||||
overflow-x: hidden
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror textarea {
|
|
||||||
outline: none !important
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror pre.CodeMirror-cursor {
|
|
||||||
z-index: 10;
|
|
||||||
position: absolute;
|
|
||||||
visibility: hidden;
|
|
||||||
border-left: 1px solid #9effff;
|
|
||||||
border-right: none;
|
|
||||||
width: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-keymap-fat-cursor pre.CodeMirror-cursor {
|
|
||||||
width: auto;
|
|
||||||
border: 0;
|
|
||||||
background: transparent;
|
|
||||||
background: rgba(0, 200, 0, .4);
|
|
||||||
filter: progid: DXImageTransform.Microsoft.gradient(startColorstr=#6600c800, endColorstr=#4c00c800)
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-keymap-fat-cursor pre.CodeMirror-cursor:not(#nonsense_id) {
|
|
||||||
filter: progid: DXImageTransform.Microsoft.gradient(enabled=false)
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror pre.CodeMirror-cursor.CodeMirror-overwrite {}
|
|
||||||
|
|
||||||
.CodeMirror-focused pre.CodeMirror-cursor {
|
|
||||||
visibility: visible
|
|
||||||
}
|
|
||||||
|
|
||||||
div.CodeMirror-selected {
|
|
||||||
background: #49483E
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-focused div.CodeMirror-selected {
|
|
||||||
background: #49483E
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-searching {
|
|
||||||
background: #ffa;
|
|
||||||
background: rgba(255, 255, 0, .4)
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-keyword {
|
|
||||||
color: #f92672
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-atom {
|
|
||||||
color: #ae81ff
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-number {
|
|
||||||
color: #f30
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-def {
|
|
||||||
color: #fd971f
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-variable {
|
|
||||||
color: #f8f8f2
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-variable-2 {
|
|
||||||
color: #9effff
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-variable-3 {
|
|
||||||
color: #66d9ef
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-property {
|
|
||||||
color: #66d9ef
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-operator {
|
|
||||||
color: #9effff
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-comment {
|
|
||||||
color: #75715e
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-string {
|
|
||||||
color: #e6db74
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-string-2 {
|
|
||||||
color: #f50
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-meta {
|
|
||||||
color: #555
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-error {
|
|
||||||
background: #f92672;
|
|
||||||
color: #f8f8f0
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-qualifier {
|
|
||||||
color: #75d908
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-builtin {
|
|
||||||
color: #66d9ef
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-bracket {
|
|
||||||
color: #f8f8f2
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-tag {
|
|
||||||
color: #f92672
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-attribute {
|
|
||||||
color: #a6e22e
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-header {
|
|
||||||
color: #ae81ff
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-quote {
|
|
||||||
color: #090
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-hr {
|
|
||||||
color: #999
|
|
||||||
}
|
|
||||||
|
|
||||||
.cm-s-default span.cm-link {
|
|
||||||
color: #ae81ff
|
|
||||||
}
|
|
||||||
|
|
||||||
span.cm-header,
|
|
||||||
span.cm-strong {
|
|
||||||
font-weight: bold
|
|
||||||
}
|
|
||||||
|
|
||||||
span.cm-em {
|
|
||||||
font-style: italic
|
|
||||||
}
|
|
||||||
|
|
||||||
span.cm-emstrong {
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: bold
|
|
||||||
}
|
|
||||||
|
|
||||||
span.cm-link {
|
|
||||||
text-decoration: underline
|
|
||||||
}
|
|
||||||
|
|
||||||
span.cm-invalidchar {
|
|
||||||
color: #f00
|
|
||||||
}
|
|
||||||
|
|
||||||
div.CodeMirror span.CodeMirror-matchingbracket {
|
|
||||||
text-decoration: underline;
|
|
||||||
color: #fff!important
|
|
||||||
}
|
|
||||||
|
|
||||||
div.CodeMirror span.CodeMirror-nonmatchingbracket {
|
|
||||||
color: #f22
|
|
||||||
}
|
|
||||||
|
|
||||||
@media print {
|
|
||||||
.CodeMirror pre.CodeMirror-cursor {
|
|
||||||
visibility: hidden
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
.CodeMirror{height:100%;line-height:1.5;font-family:monospace;position:relative;overflow:hidden;background:#272822;color:#f8f8f2}.CodeMirror-scroll{overflow:auto;height:100%;width:100%;position:relative;outline:0}.CodeMirror-scrollbar{position:absolute;right:0;top:0;overflow-x:hidden;overflow-y:scroll;z-index:5}.CodeMirror-scrollbar-inner{width:1px}.CodeMirror-scrollbar.cm-sb-overlap{position:absolute;z-index:1;float:none;right:0;min-width:12px}.CodeMirror-scrollbar.cm-sb-nonoverlap{min-width:12px}.CodeMirror-scrollbar.cm-sb-ie7{min-width:18px}.CodeMirror-gutter{position:absolute;left:0;top:0;z-index:10;background-color:transparent;border-right:1px solid #454545;min-width:2em;height:100%}.CodeMirror-gutter-text{color:#aaa;text-align:right;padding:.4em .2em .4em .4em;white-space:pre!important;cursor:default}.CodeMirror-lines{padding:.4em;white-space:pre;cursor:text}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;-o-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;padding:0;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;overflow:visible}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-wrap .CodeMirror-scroll{overflow-x:hidden}.CodeMirror textarea{outline:0!important}.CodeMirror pre.CodeMirror-cursor{z-index:10;position:absolute;visibility:hidden;border-left:1px solid #9effff;border-right:none;width:0}.cm-keymap-fat-cursor pre.CodeMirror-cursor{width:auto;border:0;background:0 0;background:rgba(0,200,0,.4);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#6600c800, endColorstr=#4c00c800)}.cm-keymap-fat-cursor pre.CodeMirror-cursor:not(#nonsense_id){filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.CodeMirror-focused pre.CodeMirror-cursor{visibility:visible}.CodeMirror-focused div.CodeMirror-selected,div.CodeMirror-selected{background:#49483E}.CodeMirror-searching{background:#ffa;background:rgba(255,255,0,.4)}.cm-s-default span.cm-keyword{color:#f92672}.cm-s-default span.cm-atom{color:#ae81ff}.cm-s-default span.cm-number{color:#f30}.cm-s-default span.cm-def{color:#fd971f}.cm-s-default span.cm-variable{color:#f8f8f2}.cm-s-default span.cm-variable-2{color:#9effff}.cm-s-default span.cm-property,.cm-s-default span.cm-variable-3{color:#66d9ef}.cm-s-default span.cm-operator{color:#9effff}.cm-s-default span.cm-comment{color:#75715e}.cm-s-default span.cm-string{color:#e6db74}.cm-s-default span.cm-string-2{color:#f50}.cm-s-default span.cm-meta{color:#555}.cm-s-default span.cm-error{background:#f92672;color:#f8f8f0}.cm-s-default span.cm-qualifier{color:#75d908}.cm-s-default span.cm-builtin{color:#66d9ef}.cm-s-default span.cm-bracket{color:#f8f8f2}.cm-s-default span.cm-tag{color:#f92672}.cm-s-default span.cm-attribute{color:#a6e22e}.cm-s-default span.cm-header{color:#ae81ff}.cm-s-default span.cm-quote{color:#090}.cm-s-default span.cm-hr{color:#999}.cm-s-default span.cm-link{color:#ae81ff}span.cm-header,span.cm-strong{font-weight:700}span.cm-em{font-style:italic}span.cm-emstrong{font-style:italic;font-weight:700}span.cm-link{text-decoration:underline}span.cm-invalidchar{color:red}div.CodeMirror span.CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#f22}@media print{.CodeMirror pre.CodeMirror-cursor{visibility:hidden}}
|
|
|
@ -1 +0,0 @@
|
||||||
"use strict";define(["avalon"],function(t){function e(t,e){if(t+="",t.length>=e)return t;for(;t.length<e;)t="0"+t;return t}return t.component("do:count",{$replace:!0,$template:'<ul class="do-ui-count"><li class="num-box" ms-repeat-obj="list" ms-class="split:obj.opt === 0"><span class="num" ms-repeat="obj.val">{{el}}</span></li></ul>',maxLen:8,speed:1,update:t.noop,list:[],$list:[],total:0,style:2,$construct:function(e,i,l){var n=t.mix(i,l);return document.head.insertAdjacentHTML("afterBegin","<style>.do-ui-count {width: 100%;height: 50px;text-align:center;}.do-ui-count li.num-box {overflow:hidden;display: inline-block;position: relative;width: 40px;height: 50px;margin:0 15px;line-height: 50px;background: #09f;font-size: 30px;}.do-ui-count li.num-box .num {display: block;width: 100%;height: 50px;margin-top: 0;transition: .3s ease-in-out}.do-ui-count li.num-box.split {width: auto;margin:0;background: none;}</style>"),n.total=n.total>>0,n.maxLen=n.maxLen||8,t.mix(e,n)},$ready:function(t,i){function l(l){l=e(l,t.maxLen),t.$list=[],t.$list=l.split(""),2===t.style&&(t.$list=t.$list.reverse(),l=t.$list.join("").replace(/([\d,]{3})/g,"$1,"),l=l.replace(/^,|,$/g,""),t.$list=l.split("").reverse()),t.$list.forEach(function(e,l){if(","===e)t.list[l]||t.list.push({opt:0,val:[e]});else if(t.list[l]){if(e!==t.list[l].last){t.list[l].last=e,t.list[l].val.push(e);var n=i.querySelectorAll(".num-box")[l];n.querySelector(".num").style.marginTop=50*t.speed+"px",setTimeout(function(){t.list[l].val.shift()},300)}}else t.list.push({opt:1,last:e,val:[e]})})}l(t.total),t.update=function(e){t.speed=0>e?1:-1,t.total=t.total-0+e},t.$watch("total",function(t,e){t!==e&&l(t)})}}),t});
|
|
|
@ -1 +0,0 @@
|
||||||
.do-datepicker{position:relative;z-index:65534;width:100%;height:100%}.do-datepicker a{text-decoration:none}.do-datepicker .date-input{display:block;width:100%;height:100%;padding:0 5px;line-height:18px;border:1px solid #e7e8eb;transition:all .1s ease-in-out}.do-datepicker .date-input:focus{border-color:#1abc9c}.do-datepicker .calendar-box{position:absolute;left:0;top:100%;width:267px;height:auto;min-height:60px;padding:10px;line-height:35px;border:1px solid #ddd;background:#fff;font-size:14px;color:#546e7a;text-align:center;box-shadow:0 1px 5px rgba(0,0,0,0.1)}.do-datepicker .calendar-box dt.title{width:100%;height:35px;background:#e7e8eb}.do-datepicker .calendar-box dd.contrl{position:relative;width:90%;height:35px;margin:0 5%}.do-datepicker .calendar-box dd.contrl a{position:absolute;left:0;top:0;width:35px;height:35px;color:#546e7a;font-weight:bold}.do-datepicker .calendar-box dd.contrl a:hover{color:#1abc9c}.do-datepicker .calendar-box dd.contrl a.prev-month{left:35px}.do-datepicker .calendar-box dd.contrl a.next-month{left:auto;right:35px}.do-datepicker .calendar-box dd.contrl a.next-year{left:auto;right:0}.do-datepicker .calendar-box dd.calendar{width:100%;height:auto}.do-datepicker .calendar-box dd.calendar .week{width:100%;height:35px;margin-bottom:5px;border-bottom:1px solid #eee}.do-datepicker .calendar-box dd.calendar span.td{float:left;width:35px}.do-datepicker .calendar-box dd.calendar .list span.td{height:30px;line-height:30px;cursor:pointer;transition:all .1s ease-in-out}.do-datepicker .calendar-box dd.calendar .list span.td:hover{background:#e7e8eb}.do-datepicker .calendar-box dd.calendar .list span.td.weeken{color:#ff5722}.do-datepicker .calendar-box dd.calendar .list span.td.selected{background:#48c9b0;color:#fff}.do-datepicker .calendar-box dd.calendar .list span.td.disabled{color:#bdc3c7;cursor:default}.do-datepicker .calendar-box dd.calendar .list span.td.disabled:hover{background:none}.do-datepicker .calendar-box dd.time{position:relative;width:100%;height:41px;padding:5px 0;margin-top:5px;line-height:30px;border-top:1px solid #eee}.do-datepicker .calendar-box dd.time label{float:left;width:60px;height:30px}.do-datepicker .calendar-box dd.time label input{width:30px;height:30px;border:1px solid #e7e8eb;text-align:center}.do-datepicker .calendar-box dd.time .now{float:right;width:50px;height:30px;border-radius:3px;background:#1abc9c;color:#fff;text-align:center}.do-datepicker .calendar-box dd.time .now:hover{background:#48c9b0}.do-datepicker .calendar-box dd.time .now:active{background:#16a085}.do-datepicker .calendar-box dd.tips{position:absolute;z-index:65535;left:25%;top:40%;width:50%;height:30px;line-height:30px;background:rgba(0,0,0,0.7);color:#fff;font-size:12px;text-align:center}
|
|
|
@ -1 +0,0 @@
|
||||||
.do-marked-theme{position:relative}.do-marked-theme .md-head{position:relative;margin:15px 0;padding-left:30px;font-weight:normal;font-size:17px}.do-marked-theme h1.md-head{padding-left:0}.do-marked-theme .md-head a{position:relative;display:inline-block;padding:0 8px;background:#fff;color:#454545}.do-marked-theme .md-head a:hover{text-decoration:none}.do-marked-theme h1.md-head a{padding-left:0;color:#000}.do-marked-theme h2.md-head a{color:#000}.do-marked-theme h1.md-head{margin:0 0 30px;font-size:25px}.do-marked-theme h2.md-head{margin:20px 0;font-size:23px}.do-marked-theme h3.md-head{margin:20px 0 15px;font-size:20px}.do-marked-theme h1:after{display:block;width:100%;content:" ";border-bottom:1px solid #ddd}.do-marked-theme h2:before,.do-marked-theme h3:before,.do-marked-theme h4:before,.do-marked-theme h5:before,.do-marked-theme h6:before{display:block;position:absolute;left:0;top:50%;width:100%;content:" ";border-bottom:1px solid #ddd}.do-marked-theme a{text-decoration:none}.do-marked-theme a:hover{text-decoration:underline}.do-marked-theme p{margin:15px 0}.do-marked-theme blockquote.md-quote{margin:10px 0;padding:5px 10px;border-left:5px solid #6bb294;background:#f7f7f7}.do-marked-theme blockquote.md-quote p{margin:0}.do-marked-theme .md-warn,.do-marked-theme .md-mark{display:inline-block;position:relative;min-height:40px;margin:5px 0;padding:5px 8px 5px 50px;border:1px solid #ff9800;border-radius:5px;background:#fffbed;color:#f57c00;word-break:break-all}.do-marked-theme .md-warn p,.do-marked-theme .md-mark p{margin:0 !important}.do-marked-theme .md-warn::before,.do-marked-theme .md-mark::before{position:absolute;left:15px;top:5px;font:20px/1.5 "ui font";color:#ff5722;content:"\e6f6"}.do-marked-theme .md-mark{border-color:#48c9b0;color:#16a085;background:#edfbf8}.do-marked-theme .md-mark::before{color:#16a085;content:"\e657"}.do-marked-theme table{width:100%}.do-marked-theme table thead tr{height:45px;line-height:45px;background:#f7f7f7}.do-marked-theme table thead th{padding:0 8px;border:0}.do-marked-theme table tbody tr{height:43px;line-height:42px;transition:all .3s ease-in-out}.do-marked-theme table tbody tr:hover{background:#ecf6fd}.do-marked-theme table tbody td{padding:0 8px;border-bottom:1px solid #e9e9e9}.do-marked-theme hr{margin:30px 0;border-bottom:0}.do-marked-theme ol{margin-left:2em;list-style:decimal outside none}.do-marked-theme ul{margin-left:2em;list-style:disc outside none}.do-marked-theme li ol{margin-left:2em}.do-marked-theme li ul{margin-left:2em;list-style-type:circle}.do-marked-theme li ol ul,.do-marked-theme li ul ul{list-style-type:square}
|
|
|
@ -1 +0,0 @@
|
||||||
.do-meditor-attach{width:630px;height:auto;background:#f7f7f7;cursor:default}.do-meditor-attach .tab-box{width:100%;height:50px;line-height:49px;border-bottom:1px solid #e2e2e2;text-align:center}.do-meditor-attach .tab-box .item{position:relative;float:left;width:100px;height:49px;border-right:1px solid #ddd;cursor:pointer}.do-meditor-attach .tab-box .item.active{background:#fff}.do-meditor-attach .tab-box .item.active::after{position:absolute;left:0;bottom:-1px;width:100%;height:1px;background:#fff;content:""}.do-meditor-attach .tab-box a.action-close{top:5px;width:40px;height:40px;line-height:40px;font-size:20px}.do-meditor-attach .tab-box a.action-close:hover{line-height:40px;border:0}.do-meditor-attach .cont-box{position:relative;width:100%;height:auto;min-height:200px;background:#fff}.do-meditor-attach .cont-box .remote,.do-meditor-attach .cont-box .local{position:relative;width:60%;height:auto;margin:0 auto;padding:15px 0 30px}.do-meditor-attach .cont-box .local{width:96%}.do-meditor-attach .cont-box .hide{display:none}.do-meditor-attach .cont-box .section{display:block;width:100%;height:auto;margin:15px 0;line-height:35px}.do-meditor-attach .cont-box .section.input{line-height:33px;border:1px solid #e9e9e9}.do-meditor-attach .cont-box .section .label{float:left;width:30%;text-align:center;background:#f7f7f7}.do-meditor-attach .cont-box .section .txt{float:left;width:70%;height:33px;padding:0 8px;border:0;border-left:1px solid #e9e9e9;background:#fff;color:#666}.do-meditor-attach .cont-box .section .submit{float:right;width:30%;height:35px;background:#ddd;color:#666;text-align:center}.do-meditor-attach .cont-box .select-file{width:100%;height:35px;line-height:33px}.do-meditor-attach .cont-box .select-file span.file{float:left;width:100px;height:35px;border:1px solid #ddd;background:#f7f7f7;color:#666;text-align:center;cursor:pointer}.do-meditor-attach .cont-box .select-file span.tips{display:inline-block;padding:0 10px;line-height:35px;color:#666}.do-meditor-attach .cont-box .upload-box{width:100%;height:auto;min-height:190px;margin:10px 0;border:1px solid #e2e2e2}.do-meditor-attach .cont-box .upload-box .tr{width:100%;height:35px;line-height:35px;text-align:center}.do-meditor-attach .cont-box .upload-box .tr:hover{background:#fafafa}.do-meditor-attach .cont-box .upload-box .thead{line-height:34px;border-bottom:1px solid #e2e2e2;background:#f7f7f7}.do-meditor-attach .cont-box .upload-box .td{float:left}.do-meditor-attach .cont-box .upload-box .td.name{width:45%}.do-meditor-attach .cont-box .upload-box .td.progress{width:40%}.do-meditor-attach .cont-box .upload-box .td.option{width:15%}.do-meditor-attach .cont-box .upload-box .td.option a{display:inline-block;padding:3px 5px;line-height:13px;border:1px solid #e2e2e2;background:#f7f7f7;color:#666}.do-meditor-attach .cont-box .upload-box .td .red{color:#f30}.do-meditor-attach .cont-box .manager{overflow:hidden;overflow-y:auto;width:100%;height:320px;padding:10px}.do-meditor-attach .cont-box .manager .item{float:left;width:22%;height:130px;margin:10px 1.5%;padding:5px}.do-meditor-attach .cont-box .manager .item:hover{background:#f7f7f7}.do-meditor-attach .cont-box .manager .thumb{display:block;width:100%;height:100px}.do-meditor-attach .cont-box .manager .name{overflow:hidden;height:20px;line-height:30px;text-align:center}.do-meditor-attach .cont-box .manager img{width:100%;height:100%}.do-meditor-attach .cont-box .manager .attach-icon{display:inline-block;width:100%;height:100px;text-align:center;font:50px/100px "ui font" !important;-webkit-font-smoothing:antialiased;-webkit-text-stroke-width:0.2px;-moz-osx-font-smoothing:grayscale}
|
|
|
@ -1 +0,0 @@
|
||||||
.do-pages{height:auto;text-align:center;font-size:13px}.do-pages a{display:inline-block;width:auto;min-width:40px;height:40px;line-height:40px;color:#546e7a;text-decoration:none;cursor:pointer}.do-pages a.curr,.do-pages a.disabled{cursor:default}.do-pages.skin-1{width:100%}.do-pages.skin-1 a.normal,.do-pages.skin-1 a.disabled,.do-pages.skin-1 a.curr{padding:0 10px;margin:0 3px}.do-pages.skin-1 a.curr{font-weight:bold;font-size:15px}.do-pages.skin-1 a.disabled{min-width:0;padding:0}.do-pages.skin-1 .input-box,.do-pages.skin-1 .input-box span,.do-pages.skin-1 .input-box input{display:inline-block}.do-pages.skin-1 .input-box input{width:25px;height:20px;padding:0 3px;background:#fff;border:1px solid #ddd}.do-pages.skin-1 .input-box a.normal{height:30px;line-height:30px}.do-pages.skin-2{float:right;width:auto}.do-pages.skin-2 a.normal,.do-pages.skin-2 a.disabled,.do-pages.skin-2 a.curr{float:left;margin:0;padding:0 5px;color:#fff}.do-pages.skin-2 a.disabled{display:none}.do-pages.skin-2 .input-box{display:none}.do-pages.plain a.normal{background:#e7e8eb}.do-pages.plain a.normal:hover{background:#ecf0f1}.do-pages.skin-2.plain a.curr,.do-pages.plain a.normal:active{background:#bdc3c7}.do-pages.grey a.normal{background:#546e7a;color:#fff}.do-pages.grey a.normal:hover{background:#607d8b}.do-pages.skin-2.grey a.curr,.do-pages.grey a.normal:active{background:#37474f}.do-pages.red a.normal{background:#ff5722;color:#fff}.do-pages.red a.normal:hover{background:#ff7043}.do-pages.skin-2.red a.curr,.do-pages.red a.normal:active{background:#e64a19}.do-pages.orange a.normal{background:#ff9800;color:#fff}.do-pages.orange a.normal:hover{background:#ffa726}.do-pages.skin-2.orange a.curr,.do-pages.orange a.normal:active{background:#f57c00}.do-pages.green a.normal{background:#4caf50;color:#fff}.do-pages.green a.normal:hover{background:#81c784}.do-pages.skin-2.green a.curr,.do-pages.green a.normal:active{background:#388e3c}.do-pages.teal a.normal{background:#1abc9c;color:#fff}.do-pages.teal a.normal:hover{background:#48c9b0}.do-pages.skin-2.teal a.curr,.do-pages.teal a.normal:active{background:#16a085}.do-pages.blue a.normal{background:#2196f3;color:#fff}.do-pages.blue a.normal:hover{background:#64b5f6}.do-pages.skin-2.blue a.curr,.do-pages.blue a.normal:active{background:#1976d2}.do-pages.purple a.normal{background:#651fff;color:#fff}.do-pages.purple a.normal:hover{background:#7c4dff}.do-pages.skin-2.purple a.curr,.do-pages.purple a.normal:active{background:#6200ea}
|
|
|
@ -1 +0,0 @@
|
||||||
.do-ui-blockcode{position:relative;border:1px solid #ddd;margin:15px 0;padding:8px 0;line-height:1.5;background:#fafafa}.do-ui-blockcode .lang{position:relative;display:block;padding:0 8px;color:#383a42;word-wrap:break-word;white-space:pre-wrap;font-family:Courier}.do-ui-blockcode .lang .c-comment{color:#8e908c;font-style:italic}.do-ui-blockcode .lang .c-smartyx{color:#607d8b}.do-ui-blockcode .lang .c-important{color:#f5871f;font-style:italic}.do-ui-blockcode .lang .c-punctuation{color:#986756}.do-ui-blockcode .lang .c-regex{color:#c82829}.do-ui-blockcode .lang .c-boolean,.do-ui-blockcode .lang .c-number{color:#f5871f}.do-ui-blockcode .lang .c-function{color:#009688}.do-ui-blockcode .lang .c-class-name,.do-ui-blockcode .lang .c-build-in{color:#3aa9f3}.do-ui-blockcode .lang .c-class-name,.do-ui-blockcode .lang .c-build-in{font-style:italic;font-weight:bold}.do-ui-blockcode .lang .c-attr-name,.do-ui-blockcode .lang .c-property{color:#c79f0f;font-weight:bold}.do-ui-blockcode .lang .c-property{font-style:italic}.do-ui-blockcode .lang .c-string,.do-ui-blockcode .lang .c-attr-value{color:#5ab302}.do-ui-blockcode .lang .c-tag,.do-ui-blockcode .lang .c-keyword,.do-ui-blockcode .lang .c-selector,.do-ui-blockcode .lang .c-operator{color:#d81406}.do-ui-blockcode .lang .c-keyword{font-style:italic}.do-ui-inlinecode{margin:0 2px;padding:0 5px;color:#d14;border:1px solid #ddd;border-radius:3px}
|
|
|
@ -1,656 +0,0 @@
|
||||||
/**
|
|
||||||
* Request组件, modern版, 支持IE9+,chrome,FF
|
|
||||||
* @authors yutent (yutent@doui.cc)
|
|
||||||
* @date 2016-11-27 13:08:40
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
'use strict';
|
|
||||||
define(['yua', './promise'], function(yua) {
|
|
||||||
var _request = function(url, protocol) {
|
|
||||||
this.transport = true;
|
|
||||||
protocol = (protocol + '').trim().toUpperCase();
|
|
||||||
this.xhr = Xhr();
|
|
||||||
this.defer = Promise.defer();
|
|
||||||
this.opt = {
|
|
||||||
url: (url + '').trim(),
|
|
||||||
type: protocol || 'GET',
|
|
||||||
form: '',
|
|
||||||
data: {},
|
|
||||||
headers: {},
|
|
||||||
timeoutID: 0,
|
|
||||||
uuid: Math.random()
|
|
||||||
.toString(16)
|
|
||||||
.substr(2)
|
|
||||||
};
|
|
||||||
},
|
|
||||||
_requestp = _request.prototype,
|
|
||||||
toS = Object.prototype.toString,
|
|
||||||
win = window,
|
|
||||||
doc = win.document,
|
|
||||||
encode = encodeURIComponent,
|
|
||||||
decode = decodeURIComponent,
|
|
||||||
noop = function(e, res) {
|
|
||||||
this.defer.resolve(res);
|
|
||||||
};
|
|
||||||
|
|
||||||
// -----------------------------
|
|
||||||
|
|
||||||
// 本地协议判断正则
|
|
||||||
var rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/;
|
|
||||||
var isLocal = false;
|
|
||||||
try {
|
|
||||||
isLocal = rlocalProtocol.test(location.ptyperotocol);
|
|
||||||
} catch (e) {}
|
|
||||||
|
|
||||||
var rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/gm;
|
|
||||||
|
|
||||||
// ----------------- 一些兼容性预处理 --------------------
|
|
||||||
|
|
||||||
win.Xhr = function() {
|
|
||||||
return new XMLHttpRequest();
|
|
||||||
};
|
|
||||||
var supportCors = 'withCredentials' in Xhr();
|
|
||||||
|
|
||||||
// ------------------- 几个解释方法 -----------------------
|
|
||||||
|
|
||||||
function serialize(p, obj, q) {
|
|
||||||
var k;
|
|
||||||
if (Array.isArray(obj)) {
|
|
||||||
obj.forEach(function(it, i) {
|
|
||||||
k = p ? p + '[' + (Array.isArray(it) ? i : '') + ']' : i;
|
|
||||||
if (typeof it === 'object') {
|
|
||||||
serialize(k, it, q);
|
|
||||||
} else {
|
|
||||||
q(k, it);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
for (var i in obj) {
|
|
||||||
k = p ? p + '[' + i + ']' : i;
|
|
||||||
if (typeof obj[i] === 'object') {
|
|
||||||
serialize(k, obj[i], q);
|
|
||||||
} else {
|
|
||||||
q(k, obj[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var Format = function() {};
|
|
||||||
|
|
||||||
Format.prototype = {
|
|
||||||
parseJS: function(code) {
|
|
||||||
code = (code + '').trim();
|
|
||||||
if (code) {
|
|
||||||
if (code.indexOf('use strict') === 1) {
|
|
||||||
var script = doc.createElement('script');
|
|
||||||
script.text = code;
|
|
||||||
doc.head.appendChild(script).parentNode.removeChild(script);
|
|
||||||
} else {
|
|
||||||
eval(code);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
parseXML: function(data, xml, tmp) {
|
|
||||||
try {
|
|
||||||
tmp = new DOMParser();
|
|
||||||
xml = tmp.parseFromString(data, 'text/xml');
|
|
||||||
} catch (e) {
|
|
||||||
xml = void 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
|
||||||
!xml ||
|
|
||||||
!xml.documentElement ||
|
|
||||||
xml.getElementsByTagName('parsererror').length
|
|
||||||
) {
|
|
||||||
console.error('Invalid XML: ' + data);
|
|
||||||
}
|
|
||||||
return xml;
|
|
||||||
},
|
|
||||||
parseHTML: function(html) {
|
|
||||||
return yua.parseHTML(html);
|
|
||||||
},
|
|
||||||
param: function(obj) {
|
|
||||||
if (!obj || typeof obj === 'string' || typeof obj === 'number')
|
|
||||||
return obj;
|
|
||||||
|
|
||||||
var arr = [];
|
|
||||||
var q = function(k, v) {
|
|
||||||
if (/native code/.test(v)) return;
|
|
||||||
|
|
||||||
v = typeof v === 'function' ? v() : v;
|
|
||||||
v = toS.call(v) !== '[object File]' ? encode(v) : v;
|
|
||||||
|
|
||||||
arr.push(encode(k) + '=' + v);
|
|
||||||
};
|
|
||||||
|
|
||||||
if (typeof obj === 'object') serialize('', obj, q);
|
|
||||||
|
|
||||||
return arr.join('&');
|
|
||||||
},
|
|
||||||
parseForm: function(form) {
|
|
||||||
var data = {};
|
|
||||||
for (var i = 0, field; (field = form.elements[i++]); ) {
|
|
||||||
switch (field.type) {
|
|
||||||
case 'select-one':
|
|
||||||
case 'select-multiple':
|
|
||||||
if (field.name.length && !field.disabled) {
|
|
||||||
for (var j = 0, opt; (opt = field.options[j++]); ) {
|
|
||||||
if (opt.selected) {
|
|
||||||
data[field.name] = opt.value || opt.text;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'file':
|
|
||||||
if (field.name.length && !field.disabled) {
|
|
||||||
data[field.name] = field.files[0];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case undefined:
|
|
||||||
case 'submit':
|
|
||||||
case 'reset':
|
|
||||||
case 'button':
|
|
||||||
break; //按钮啥的, 直接忽略
|
|
||||||
case 'radio':
|
|
||||||
case 'checkbox':
|
|
||||||
// 只处理选中的
|
|
||||||
if (!field.checked) break;
|
|
||||||
default:
|
|
||||||
if (field.name.length && !field.disabled) {
|
|
||||||
data[field.name] = field.value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return data;
|
|
||||||
},
|
|
||||||
merge: function(a, b) {
|
|
||||||
if (typeof a !== 'object' || typeof b !== 'object')
|
|
||||||
throw new TypeError('argument must be an object');
|
|
||||||
|
|
||||||
if (Object.assign) return Object.assign(a, b);
|
|
||||||
|
|
||||||
for (var i in b) {
|
|
||||||
a[i] = b[i];
|
|
||||||
}
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var F = new Format();
|
|
||||||
|
|
||||||
// ---------------------------------------------------------
|
|
||||||
// -------------------- request 模块开始 --------------------
|
|
||||||
// ---------------------------------------------------------
|
|
||||||
|
|
||||||
var requestConvert = {
|
|
||||||
text: function(val) {
|
|
||||||
return val;
|
|
||||||
},
|
|
||||||
xml: function(val, xml) {
|
|
||||||
return xml !== undefined ? xml : F.parseXML(val);
|
|
||||||
},
|
|
||||||
html: function(val) {
|
|
||||||
return F.parseHTML(val);
|
|
||||||
},
|
|
||||||
json: function(val) {
|
|
||||||
return JSON.parse(val);
|
|
||||||
},
|
|
||||||
script: function(val) {
|
|
||||||
return F.parseJS(val);
|
|
||||||
},
|
|
||||||
jsonp: function(name) {
|
|
||||||
var json = request.cache[name];
|
|
||||||
delete request.cache[name];
|
|
||||||
return json;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
var requestExtend = {
|
|
||||||
formData: function() {
|
|
||||||
if (this.opt.form) {
|
|
||||||
var data = F.parseForm(this.opt.form);
|
|
||||||
F.merge(this.opt.data, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
var form = new FormData();
|
|
||||||
for (var i in this.opt.data) {
|
|
||||||
var el = this.opt.data[i];
|
|
||||||
if (Array.isArray(el)) {
|
|
||||||
el.forEach(function(it) {
|
|
||||||
form.append(i + '[]', it);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
form.append(i, this.opt.data[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return form;
|
|
||||||
},
|
|
||||||
jsonp: function(jsonpcallback) {
|
|
||||||
win[jsonpcallback] = function(val) {
|
|
||||||
delete win[jsonpcallback];
|
|
||||||
request.cache[jsonpcallback] = val;
|
|
||||||
};
|
|
||||||
},
|
|
||||||
dispatch: function(self) {
|
|
||||||
if (!this.transport) return this.defer.reject('Request pending...');
|
|
||||||
|
|
||||||
var _this = this,
|
|
||||||
result = {
|
|
||||||
response: {
|
|
||||||
url: this.opt.url,
|
|
||||||
headers: { 'content-type': '' }
|
|
||||||
},
|
|
||||||
request: {
|
|
||||||
url: this.opt.url,
|
|
||||||
headers: _this.opt.headers
|
|
||||||
},
|
|
||||||
status: self === null ? 504 : 200,
|
|
||||||
statusText: self === null ? 'Connected timeout' : 'ok',
|
|
||||||
text: '',
|
|
||||||
body: '',
|
|
||||||
error: null
|
|
||||||
};
|
|
||||||
|
|
||||||
//状态为4,既已成功, 则清除超时
|
|
||||||
clearTimeout(_this.opt.timeoutID);
|
|
||||||
|
|
||||||
if (
|
|
||||||
typeof this.transport === 'object' &&
|
|
||||||
this.opt.type === 'JSONP'
|
|
||||||
) {
|
|
||||||
//移除script
|
|
||||||
// this.transport.parentNode.removeChild(this.transport);
|
|
||||||
|
|
||||||
//超时返回
|
|
||||||
if (self !== null) {
|
|
||||||
var exec =
|
|
||||||
!this.transport.readyState ||
|
|
||||||
this.transport.readyState === 'loaded' ||
|
|
||||||
this.transport.readyState === 'complete';
|
|
||||||
|
|
||||||
if (exec) {
|
|
||||||
result.body = requestConvert.jsonp(
|
|
||||||
this.opt.data.callback
|
|
||||||
);
|
|
||||||
result.text = JSON.stringify(result.body);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.callback(result.error, result);
|
|
||||||
} else {
|
|
||||||
//成功的回调
|
|
||||||
var isSucc = self
|
|
||||||
? (self.status >= 200 && self.status < 300) ||
|
|
||||||
self.status === 304
|
|
||||||
: false,
|
|
||||||
headers =
|
|
||||||
(self && self.getAllResponseHeaders().split('\n')) ||
|
|
||||||
[];
|
|
||||||
|
|
||||||
//处理返回的Header
|
|
||||||
headers.forEach(function(it, i) {
|
|
||||||
it = it.trim();
|
|
||||||
if (it) {
|
|
||||||
it = it.split(':');
|
|
||||||
result.response.headers[
|
|
||||||
it.shift().toLowerCase()
|
|
||||||
] = it.join(':').trim();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (isSucc) {
|
|
||||||
result.status = self.status;
|
|
||||||
if (result.status === 204) {
|
|
||||||
result.statusText = 'no content';
|
|
||||||
} else if (result.status === 304) {
|
|
||||||
result.statusText = 'not modified';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
result.status = self === null ? 504 : self.status || 500;
|
|
||||||
result.statusText =
|
|
||||||
self === null
|
|
||||||
? 'Connected timeout'
|
|
||||||
: self.statusText || 'Internal Server Error';
|
|
||||||
result.error = F.merge(new Error(result.statusText), {
|
|
||||||
status: result.status
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
//处理返回的数据
|
|
||||||
var dataType = result.response.headers[
|
|
||||||
'content-type'
|
|
||||||
].match(/json|xml|script|html/i) || ['text'];
|
|
||||||
|
|
||||||
dataType = dataType[0].toLowerCase();
|
|
||||||
result.text =
|
|
||||||
(self && (self.responseText || self.responseXML)) || '';
|
|
||||||
result.body = requestConvert[dataType](
|
|
||||||
result.text,
|
|
||||||
self && self.responseXML
|
|
||||||
);
|
|
||||||
} catch (err) {
|
|
||||||
result.error = err;
|
|
||||||
result.statusText = 'parse error';
|
|
||||||
}
|
|
||||||
|
|
||||||
_this.callback(result.error, result);
|
|
||||||
}
|
|
||||||
delete _this.defer;
|
|
||||||
delete _this.transport;
|
|
||||||
delete _this.opt;
|
|
||||||
delete _this.xhr;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// 设置表单类型, 支持2种, form/json
|
|
||||||
_requestp.type = function(t) {
|
|
||||||
if (this.opt.formType === 'form-data') return this;
|
|
||||||
|
|
||||||
this.opt.formType = t || 'form';
|
|
||||||
if (t === 'form' || this.opt.type === 'GET')
|
|
||||||
this.set(
|
|
||||||
'content-type',
|
|
||||||
'application/x-www-form-urlencoded; charset=UTF-8'
|
|
||||||
);
|
|
||||||
else this.set('content-type', 'application/json; charset=UTF-8');
|
|
||||||
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
//设置头信息
|
|
||||||
_requestp.set = function(k, val) {
|
|
||||||
if (!this.transport) return;
|
|
||||||
|
|
||||||
if (typeof k === 'object') {
|
|
||||||
for (var i in k) {
|
|
||||||
i = i.toLowerCase();
|
|
||||||
this.opt.headers[i] = k[i];
|
|
||||||
}
|
|
||||||
} else if (typeof k === 'string') {
|
|
||||||
if (arguments.length < 2) throw new Error('2 arguments required');
|
|
||||||
|
|
||||||
// 全转小写,避免重复写入
|
|
||||||
k = k.toLowerCase();
|
|
||||||
|
|
||||||
if (val === undefined) delete this.opt.headers[k];
|
|
||||||
else this.opt.headers[k] = val;
|
|
||||||
} else {
|
|
||||||
throw new Error(
|
|
||||||
'arguments must be string/object, but [' + typeof k + '] given'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
//设置请求参数
|
|
||||||
_requestp.send = function(k, val) {
|
|
||||||
if (!this.transport) return;
|
|
||||||
|
|
||||||
// 1. send方法可以多次调用, 但必须保证格式一致
|
|
||||||
// 2. 2次圴提交纯字符串也会抛出异常
|
|
||||||
if (typeof k === 'object') {
|
|
||||||
if (this.opt.data && typeof this.opt.data === 'string')
|
|
||||||
throw new Error(
|
|
||||||
'param can not be string and object at the same time'
|
|
||||||
);
|
|
||||||
if (!this.opt.data) this.opt.data = {};
|
|
||||||
|
|
||||||
F.merge(this.opt.data, k);
|
|
||||||
} else {
|
|
||||||
if (typeof k === 'string') {
|
|
||||||
if (arguments.length === 1) {
|
|
||||||
if (this.opt.data)
|
|
||||||
throw new Error('invalid param in function send');
|
|
||||||
|
|
||||||
this.opt.data = k;
|
|
||||||
} else {
|
|
||||||
if (this.opt.data && typeof this.opt.data === 'string')
|
|
||||||
throw new Error(
|
|
||||||
'param can not be string and object at the same time'
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!this.opt.data) this.opt.data = {};
|
|
||||||
|
|
||||||
this.opt.data[k] = val;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
throw new Error(
|
|
||||||
'argument of send must be string/object, but [' +
|
|
||||||
typeof k +
|
|
||||||
'] given'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
//该方法用于 form-data类型的post请求的参数设置
|
|
||||||
_requestp.field = function(k, val) {
|
|
||||||
if (!this.transport) return this;
|
|
||||||
|
|
||||||
// 此类型优先级最高
|
|
||||||
this.opt.formType = 'form-data';
|
|
||||||
this.opt.type = 'POST';
|
|
||||||
if (
|
|
||||||
!this.opt.data ||
|
|
||||||
(this.opt.data && typeof this.opt.data !== 'object')
|
|
||||||
)
|
|
||||||
this.opt.data = {};
|
|
||||||
|
|
||||||
if (arguments.length === 1 && typeof k === 'object') {
|
|
||||||
F.merge(this.opt.data, k);
|
|
||||||
} else if (arguments.length === 2) {
|
|
||||||
this.opt.data[k] = val;
|
|
||||||
} else {
|
|
||||||
throw new TypeError(
|
|
||||||
'argument must be an object, but ' + typeof k + ' given'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
//设置缓存
|
|
||||||
_requestp.cache = function(t) {
|
|
||||||
if (!this.transport) return;
|
|
||||||
|
|
||||||
if (this.opt.type === 'GET') this.opt.cache = !!t;
|
|
||||||
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
//取消网络请求
|
|
||||||
_requestp.abort = function() {
|
|
||||||
delete this.transport;
|
|
||||||
if (!this.opt.form) this.xhr.abort();
|
|
||||||
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
//超时设置, 单位毫秒
|
|
||||||
_requestp.timeout = function(time) {
|
|
||||||
if (typeof time !== 'number' || time < 1) return this;
|
|
||||||
|
|
||||||
this.opt.timeout = time;
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
_requestp.form = function(form) {
|
|
||||||
if (typeof form === 'object' && form.nodeName === 'FORM') {
|
|
||||||
this.opt.type = 'POST';
|
|
||||||
this.opt.form = form;
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
var originAnchor = doc.createElement('a');
|
|
||||||
originAnchor.href = location.href;
|
|
||||||
_requestp.end = function(callback) {
|
|
||||||
var _this = this;
|
|
||||||
// 回调已执行, 或已取消, 则直接返回, 防止重复执行
|
|
||||||
if (!this.transport) return this;
|
|
||||||
|
|
||||||
if (!this.opt.url) throw new Error('Invalid request url');
|
|
||||||
|
|
||||||
F.merge(this, requestExtend);
|
|
||||||
|
|
||||||
this.callback = callback || noop.bind(this);
|
|
||||||
|
|
||||||
// 1. url规范化
|
|
||||||
this.opt.url = this.opt.url
|
|
||||||
.replace(/#.*$/, '')
|
|
||||||
.replace(/^\/\//, location.protocol + '//');
|
|
||||||
|
|
||||||
// 2. 处理跨域
|
|
||||||
if (typeof this.opt.crossDomain !== 'boolean') {
|
|
||||||
var anchor = doc.createElement('a');
|
|
||||||
try {
|
|
||||||
anchor.href = this.opt.url;
|
|
||||||
// IE7及以下浏览器 '1'[0]的结果是 undefined
|
|
||||||
// IE7下需要获取绝对路径
|
|
||||||
var absUrl = !'1'[0]
|
|
||||||
? anchor.getAttribute('href', 4)
|
|
||||||
: anchor.href;
|
|
||||||
anchor.href = absUrl;
|
|
||||||
anchor.async = true;
|
|
||||||
this.opt.crossDomain =
|
|
||||||
originAnchor.protocol !== anchor.protocol ||
|
|
||||||
originAnchor.host !== anchor.host;
|
|
||||||
} catch (e) {
|
|
||||||
this.opt.crossDomain = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2.1 进一步处理跨域配置
|
|
||||||
if (this.opt.type === 'JSONP') {
|
|
||||||
//如果没有跨域,自动转回xhr GET
|
|
||||||
if (!this.opt.crossDomain) {
|
|
||||||
this.opt.type = 'GET';
|
|
||||||
} else {
|
|
||||||
this.opt.data['callback'] =
|
|
||||||
this.opt.data['callback'] || 'jsonp' + request.cid++;
|
|
||||||
this.jsonp(this.opt.data['callback']); //创建临时处理方法
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 2.2 如果不是跨域请求,则自动加上一条header信息,用以标识这是ajax请求
|
|
||||||
if (!this.opt.crossDomain) {
|
|
||||||
this.set('X-Requested-With', 'XMLHttpRequest');
|
|
||||||
} else {
|
|
||||||
supportCors && (this.xhr.withCredentials = true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. data转字符串
|
|
||||||
this.opt.param = F.param(this.opt.data);
|
|
||||||
|
|
||||||
// 4. 设置Content-Type类型, 默认x-www-form-urlencoded
|
|
||||||
if (!this.opt.formType) this.type('form');
|
|
||||||
|
|
||||||
// 5.处理GET请求
|
|
||||||
this.opt.hasContent = this.opt.type === 'POST'; //是否为post请求
|
|
||||||
if (!this.opt.hasContent) {
|
|
||||||
//GET请求直接把参数拼接到url上
|
|
||||||
if (this.opt.param) {
|
|
||||||
this.opt.url +=
|
|
||||||
(/\?/.test(this.opt.url) ? '&' : '?') + this.opt.param;
|
|
||||||
}
|
|
||||||
//加随机值,避免缓存
|
|
||||||
if (this.opt.cache === false)
|
|
||||||
this.opt.url +=
|
|
||||||
(/\?/.test(this.opt.url) ? '&' : '?') +
|
|
||||||
'_=' +
|
|
||||||
Math.random();
|
|
||||||
} else {
|
|
||||||
if (this.opt.formType === 'form-data') {
|
|
||||||
delete this.opt.headers['content-type'];
|
|
||||||
this.opt.param = this.formData();
|
|
||||||
} else if (this.opt.formType !== 'form') {
|
|
||||||
this.opt.param = JSON.stringify(this.opt.data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//jsonp
|
|
||||||
if (this.opt.type === 'JSONP') {
|
|
||||||
this.transport = doc.createElement('script');
|
|
||||||
this.transport.onerror = this.transport.onload = function() {
|
|
||||||
_this.dispatch(_this.transport);
|
|
||||||
};
|
|
||||||
this.transport.src = this.opt.url;
|
|
||||||
doc.head.insertBefore(this.transport, doc.head.firstChild);
|
|
||||||
|
|
||||||
//6. 超时处理
|
|
||||||
if (this.opt.timeout && this.opt.timeout > 0) {
|
|
||||||
this.opt.timeoutID = setTimeout(function() {
|
|
||||||
_this.transport.onerror = _this.transport.onload = null;
|
|
||||||
_this.dispatch(null);
|
|
||||||
}, this.opt.timeout);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.xhr.onreadystatechange = function(ev) {
|
|
||||||
if (_this.opt.timeout && _this.opt.timeout > 0) {
|
|
||||||
_this.opt['time' + this.readyState] = ev.timeStamp;
|
|
||||||
if (this.readyState === 4) {
|
|
||||||
_this.opt.isTimeout =
|
|
||||||
_this.opt.time4 - _this.opt.time1 >
|
|
||||||
_this.opt.timeout;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.readyState !== 4) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_this.dispatch(_this.opt.isTimeout ? null : _this.xhr);
|
|
||||||
};
|
|
||||||
|
|
||||||
// 6. 初始化xhr提交
|
|
||||||
this.xhr.open(this.opt.type, this.opt.url, true);
|
|
||||||
|
|
||||||
// 7. 设置头信息
|
|
||||||
for (var i in this.opt.headers) {
|
|
||||||
if (this.opt.headers[i])
|
|
||||||
this.xhr.setRequestHeader(i, this.opt.headers[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 8. 发起网络请求
|
|
||||||
_this.xhr.send(_this.opt.param);
|
|
||||||
|
|
||||||
//超时处理
|
|
||||||
if (this.opt.timeout && this.opt.timeout > 0) {
|
|
||||||
this.xhr.timeout = this.opt.timeout;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return this.defer.promise;
|
|
||||||
};
|
|
||||||
|
|
||||||
// ---------------------- end ------------------------
|
|
||||||
|
|
||||||
if (!win.request) {
|
|
||||||
win.request = {
|
|
||||||
get: function(url) {
|
|
||||||
if (!url) throw new Error('argument url is required');
|
|
||||||
|
|
||||||
return new _request(url, 'GET');
|
|
||||||
},
|
|
||||||
post: function(url) {
|
|
||||||
if (!url) throw new Error('argument url is required');
|
|
||||||
|
|
||||||
return new _request(url, 'POST');
|
|
||||||
},
|
|
||||||
jsonp: function(url) {
|
|
||||||
if (!url) throw new Error('argument url is required');
|
|
||||||
|
|
||||||
return new _request(url, 'JSONP');
|
|
||||||
},
|
|
||||||
cache: {},
|
|
||||||
cid: 0,
|
|
||||||
version: '1.1.0-es5'
|
|
||||||
};
|
|
||||||
yua.ui.request = request.version;
|
|
||||||
}
|
|
||||||
|
|
||||||
return request;
|
|
||||||
});
|
|
|
@ -1 +0,0 @@
|
||||||
.do-sliders{position:relative;height:100%;width:100%}.do-sliders .skin{height:100%}.do-sliders.fullscreen{position:absolute;width:100%;height:100%;left:0;top:0}.do-sliders .slider-content{position:relative}.do-sliders .slider-content .container{position:relative;height:100%;overflow:hidden}.do-sliders .slider-content .container .box{position:relative;height:100%;width:100%;transition:.4s}.do-sliders .slider-content .container .box .page{position:relative;display:inline-block;height:100%;vertical-align:middle}.do-sliders .slider-content .container .box .page img{width:100%;height:100%;object-fit:cover}.do-sliders .slider-content .container .box .page .title-class{position:absolute;width:30%;min-height:30px;line-height:30px;left:0;bottom:15%;right:0;margin:auto;text-align:center;font-size:25px}.do-sliders .slider-content .container .box .page .elm{height:100%;width:100%;background:#333}.do-sliders .slider-content .container .box .page .default-elm{width:100%;height:100%}.do-sliders .slider-content .container .box .page .default-btn{width:100%;height:100%}.do-sliders .slider-content .container .box .fadeType{position:absolute;left:0;top:0;width:100%;transition:.4s}.do-sliders .slider-content .slider-btn{position:absolute;top:50%;min-width:50px;min-height:50px;margin-top:-25px;text-decoration:none;font-size:30px;line-height:50px;text-align:center;border-radius:100%;color:rgba(255,255,255,0.6);font-weight:bold;z-index:1;transition:.4s}.do-sliders .slider-content .slider-btn:nth-of-type(1){margin-left:20px}.do-sliders .slider-content .slider-btn:nth-of-type(2){right:0;margin-right:20px}.do-sliders .slider-preview-btn{position:absolute;bottom:2%;height:12%;width:100%;margin:0 auto;text-align:center;overflow:hidden}.do-sliders .slider-preview-btn span{display:inline-block;width:10px;height:10px;margin:0 5px;border-radius:100%;background:rgba(255,255,255,0.8);cursor:pointer;transition:.5s}.do-sliders .slider-preview-btn span:hover{background:#4caf50}.do-sliders .slider-preview-btn .no-preview-act{background:#388e3c}.do-sliders .slider-preview-btn .btn-group{height:100%}.do-sliders .slider-preview-btn .btn-img{display:inline-block;position:relative;width:80px;height:100%;margin:0 5px;transition:.4s;cursor:pointer}.do-sliders .slider-preview-btn .btn-img img{position:relative;width:100%;height:100%;object-fit:cover;transition:.4s;z-index:2}.do-sliders .slider-preview-btn .btn-img .preview-act{transform:scale(0.95)}.do-sliders .slider-preview-btn .btn-img:after{content:'';position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;transition:.8s;z-index:1}.do-sliders .slider-preview-btn .btn-img.act:after{opacity:1}.do-sliders .slider-preview-btn-vertical{right:10px;bottom:50%;width:20px;height:auto;text-align:center;transform:translate(0, 50%)}.do-sliders .skin-0 .title-class{color:#e0e0e0}.do-sliders .skin-1 .title-class{color:#e64a19}.do-sliders .skin-2 .title-class{color:#388e3c}.do-sliders .skin-3 .title-class{color:#1976d2}.do-sliders .skin-0 .slider-btn{color:rgba(255,255,255,0.6)}.do-sliders .skin-1 .slider-btn{color:#e64a19}.do-sliders .skin-2 .slider-btn{color:#388e3c}.do-sliders .skin-3 .slider-btn{color:#1976d2}.do-sliders .skin-0 .slider-btn:hover{color:#e0e0e0}.do-sliders .skin-1 .slider-btn:hover{color:#ff5722}.do-sliders .skin-2 .slider-btn:hover{color:#4caf50}.do-sliders .skin-3 .slider-btn:hover{color:#2196f3}.do-sliders .skin-0 .btn-img:after{background:rgba(0,0,0,0.5)}.do-sliders .skin-1 .btn-img:after{background:#ff5722}.do-sliders .skin-2 .btn-img:after{background:#4caf50}.do-sliders .skin-3 .btn-img:after{background:#2196f3}.do-sliders .skin-0 .default-elm{background:#e0e0e0}.do-sliders .skin-1 .default-elm{background:#ff5722}.do-sliders .skin-2 .default-elm{background:#4caf50}.do-sliders .skin-3 .default-elm{background:#2196f3}.do-sliders .skin-0 .default-btn{background:#e0e0e0}.do-sliders .skin-1 .default-btn{background:#ff5722}.do-sliders .skin-2 .default-btn{background:#4caf50}.do-sliders .skin-3 .default-btn{background:#2196f3}.do-sliders .skin-0 .no-preview-act{background:rgba(0,0,0,0.6)}.do-sliders .skin-1 .no-preview-act{background:#e64a19}.do-sliders .skin-2 .no-preview-act{background:#388e3c}.do-sliders .skin-3 .no-preview-act{background:#1976d2}.do-sliders .skin-0 .slider-preview-btn span:hover{background:rgba(0,0,0,0.6)}.do-sliders .skin-1 .slider-preview-btn span:hover{background:#e64a19}.do-sliders .skin-2 .slider-preview-btn span:hover{background:#388e3c}.do-sliders .skin-3 .slider-preview-btn span:hover{background:#1976d2}.do-sliders .h-83{height:83%}.do-sliders .h-100{height:100%}@keyframes right-to-left{49%{-webkit-transform:translate(100%)}50%{-webkit-transform:translate(-100%);opacity:0}100%{opacity:1}}@keyframes left-to-right{49%{-webkit-transform:translate(-100%)}50%{-webkit-transform:translate(100%);opacity:0}100%{opacity:1}}
|
|
|
@ -1 +0,0 @@
|
||||||
.do-tree{overflow:hidden;overflow-y:auto;position:relative;width:100%;height:100%;line-height:28px}.do-tree ul{width:100%;height:auto}.do-tree li{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.do-tree li ul{display:none;margin-left:20px}.do-tree li ul.open{display:block}.do-tree li em,.do-tree li span{display:block;cursor:pointer}.do-tree li em{float:left;padding:0 5px;color:#000;font-family:"ui font" !important;font-style:normal;-webkit-font-smoothing:antialiased;-webkit-text-stroke-width:0.2px;-moz-osx-font-smoothing:grayscale}.do-tree li span:hover{color:#6bb294}.do-tree li span.active{color:#000;font-weight:bold}.do-tree.skin-def li>em::before{content:"\e612"}.do-tree.skin-def li.dir>em::before{content:"\e622"}.do-tree.skin-def li.dir.open>em::before{content:"\e8ea"}.do-tree.skin-light li>em::before{content:"\e73e"}.do-tree.skin-light li.dir>em::before{content:"\e635"}.do-tree.skin-light li.dir.open>em::before{content:"\e8ea"}.do-tree.skin-line li>em::before{content:"\e614"}.do-tree.skin-line li.dir>em::before{content:"\e8eb";font-weight:bold}.do-tree.skin-line li.dir.open>em::before{content:"\e662"}
|
|
|
@ -1,62 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
|
|
||||||
<title>Examples</title>
|
|
||||||
<meta name="description" content="">
|
|
||||||
<meta name="keywords" content="">
|
|
||||||
<link href="../css/base.min.css" rel="stylesheet">
|
|
||||||
<style type="text/css">
|
|
||||||
.preview {width:500px;height:300px;margin:auto;border:1px solid #ddd;}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body ms-controller="test">
|
|
||||||
|
|
||||||
<div class="preview">
|
|
||||||
<img ms-attr-src="preview">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<input type="file" ms-duplex="file" id="file">
|
|
||||||
|
|
||||||
<a href="javascript:;" class="submit">提交</a>
|
|
||||||
|
|
||||||
|
|
||||||
<script src="../avalon.modern.js"></script>
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
|
||||||
|
|
||||||
|
|
||||||
require(['uploader/uploader', 'ajax/ajax.min'], function(Up){
|
|
||||||
|
|
||||||
var uploader = new Up()
|
|
||||||
|
|
||||||
uploader.setUrl('http://up.qbox.me')
|
|
||||||
.onProgress(function(obj){
|
|
||||||
console.log(obj.speed, obj.progress, obj.loaded, obj.time)
|
|
||||||
})
|
|
||||||
.onEnd(function(res){
|
|
||||||
console.info(res)
|
|
||||||
})
|
|
||||||
|
|
||||||
var submit = document.querySelector('.submit')
|
|
||||||
var file = document.querySelector('#file')
|
|
||||||
|
|
||||||
submit.onclick = function(){
|
|
||||||
// console.log(file.files[0])
|
|
||||||
avalon.get('/upload.php?image=' + file.files[0].name, '', function(txt){
|
|
||||||
uploader.init()
|
|
||||||
.setField('file', file.files[0])
|
|
||||||
.setField('token', txt)
|
|
||||||
.setField('key', 'avatar/dsfghj')
|
|
||||||
.start()
|
|
||||||
}, 'text')
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1 +0,0 @@
|
||||||
"use strict";define(function(){var e=function(){this.init()};return e.prototype={init:function(){return this.xhr=new XMLHttpRequest,this.form=new FormData,this.field={},this.header={},this},setUrl:function(e){return e&&"string"==typeof e?(this.url=e,this):console.error("url不能为空且必须是字符串")},setField:function(e,r){if("object"==typeof e)for(var t in e)this.field[t]=e[t];else this.field[e]=r;return this},setHeader:function(e,r){if("object"==typeof e)for(var t in e)this.header[t]=e[t];else this.header[e]=r;return this},start:function(){var e=this;if(!this.url)return console.error("请先设置url");this.xhr.open("POST",this.url,!0);for(var r in this.field)this.form.append(r,this.field[r]);var t=Date.now();this.xhr.upload.addEventListener("progress",function(r){if(r.lengthComputable&&e.progress){var s=Date.now(),i=1e3*r.loaded/1024,n={loaded:r.loaded,time:s-t};n.speed=i/n.time,n.speed<10?n.speed=Math.floor(1024*n.speed)+" B/s":n.speed=n.speed.toFixed(2)+" KB/s",n.progress=Math.round(100*r.loaded/r.total),e.progress(n)}},!1),this.xhr.onreadystatechange=function(){if(4===e.xhr.readyState&&200===e.xhr.status&&""!==e.xhr.responseText){var r=e.xhr.responseText;try{r=JSON.parse(r)}catch(e){}e.end&&e.end(r)}else 200!==e.xhr.status&&e.xhr.responseText&&e.error&&e.error(e.xhr.responseText)},this.xhr.send(this.form)},onProgress:function(e){return this.progress=e,this},onEnd:function(e){return this.end=e,this},onError:function(e){return this.error=e,this}},window.Uploader||(window.Uploader=e),e});
|
|
544
js/touch.js
|
@ -1,544 +0,0 @@
|
||||||
var ua = navigator.userAgent.toLowerCase()
|
|
||||||
//http://stackoverflow.com/questions/9038625/detect-if-device-is-ios
|
|
||||||
function iOSversion() {
|
|
||||||
//https://developer.apple.com/library/prerelease/mac/releasenotes/General/WhatsNewInSafari/Articles/Safari_9.html
|
|
||||||
//http://mp.weixin.qq.com/s?__biz=MzA3MDQ4MzQzMg==&mid=256900619&idx=1&sn=b29f84cff0b8d7b9742e5d8b3cd8f218&scene=1&srcid=1009F9l4gh9nZ7rcQJEhmf7Q#rd
|
|
||||||
if (/iPad|iPhone|iPod/i.test(ua) && !window.MSStream) {
|
|
||||||
if ("backdropFilter" in document.documentElement.style) {
|
|
||||||
return 9
|
|
||||||
}
|
|
||||||
if (!!window.indexedDB) {
|
|
||||||
return 8
|
|
||||||
}
|
|
||||||
if (!!window.SpeechSynthesisUtterance) {
|
|
||||||
return 7
|
|
||||||
}
|
|
||||||
if (!!window.webkitAudioContext) {
|
|
||||||
return 6
|
|
||||||
}
|
|
||||||
if (!!window.matchMedia) {
|
|
||||||
return 5
|
|
||||||
}
|
|
||||||
if (!!window.history && 'pushState' in window.history) {
|
|
||||||
return 4
|
|
||||||
}
|
|
||||||
return 3
|
|
||||||
}
|
|
||||||
return NaN
|
|
||||||
}
|
|
||||||
|
|
||||||
var deviceIsAndroid = ua.indexOf('android') > 0
|
|
||||||
var deviceIsIOS = iOSversion()
|
|
||||||
|
|
||||||
var Recognizer = yua.gestureHooks = {
|
|
||||||
pointers: {},
|
|
||||||
//以AOP切入touchstart, touchmove, touchend, touchcancel回调
|
|
||||||
start: function (event, callback) {
|
|
||||||
|
|
||||||
//touches是当前屏幕上所有触摸点的列表;
|
|
||||||
//targetTouches是当前对象上所有触摸点的列表;
|
|
||||||
//changedTouches是涉及当前事件的触摸点的列表。
|
|
||||||
for (var i = 0; i < event.changedTouches.length; i++) {
|
|
||||||
var touch = event.changedTouches[i],
|
|
||||||
id = touch.identifier,
|
|
||||||
pointer = {
|
|
||||||
startTouch: mixLocations({}, touch),
|
|
||||||
startTime: Date.now(),
|
|
||||||
status: 'tapping',
|
|
||||||
element: event.target,
|
|
||||||
pressingHandler: Recognizer.pointers[id] && Recognizer.pointers[id].pressingHandler
|
|
||||||
}
|
|
||||||
Recognizer.pointers[id] = pointer;
|
|
||||||
callback(pointer, touch)
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
move: function (event, callback) {
|
|
||||||
for (var i = 0; i < event.changedTouches.length; i++) {
|
|
||||||
var touch = event.changedTouches[i]
|
|
||||||
var pointer = Recognizer.pointers[touch.identifier]
|
|
||||||
if (!pointer) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!("lastTouch" in pointer)) {
|
|
||||||
pointer.lastTouch = pointer.startTouch
|
|
||||||
pointer.lastTime = pointer.startTime
|
|
||||||
pointer.deltaX = pointer.deltaY = pointer.duration = pointer.distance = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
var time = Date.now() - pointer.lastTime
|
|
||||||
|
|
||||||
if (time > 0) {
|
|
||||||
|
|
||||||
var RECORD_DURATION = 70
|
|
||||||
if (time > RECORD_DURATION) {
|
|
||||||
time = RECORD_DURATION
|
|
||||||
}
|
|
||||||
if (pointer.duration + time > RECORD_DURATION) {
|
|
||||||
pointer.duration = RECORD_DURATION - time
|
|
||||||
}
|
|
||||||
|
|
||||||
pointer.duration += time;
|
|
||||||
pointer.lastTouch = mixLocations({}, touch)
|
|
||||||
|
|
||||||
pointer.lastTime = Date.now()
|
|
||||||
|
|
||||||
pointer.deltaX = touch.clientX - pointer.startTouch.clientX
|
|
||||||
pointer.deltaY = touch.clientY - pointer.startTouch.clientY
|
|
||||||
var x = pointer.deltaX * pointer.deltaX
|
|
||||||
var y = pointer.deltaY * pointer.deltaY
|
|
||||||
pointer.distance = Math.sqrt(x + y)
|
|
||||||
pointer.isVertical = x < y
|
|
||||||
|
|
||||||
callback(pointer, touch)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
end: function (event, callback) {
|
|
||||||
for (var i = 0; i < event.changedTouches.length; i++) {
|
|
||||||
var touch = event.changedTouches[i],
|
|
||||||
id = touch.identifier,
|
|
||||||
pointer = Recognizer.pointers[id]
|
|
||||||
|
|
||||||
if (!pointer)
|
|
||||||
continue
|
|
||||||
|
|
||||||
callback(pointer, touch)
|
|
||||||
|
|
||||||
delete Recognizer.pointers[id]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
//人工触发合成事件
|
|
||||||
fire: function (elem, type, props) {
|
|
||||||
if (elem) {
|
|
||||||
var event = document.createEvent('Events')
|
|
||||||
event.initEvent(type, true, true)
|
|
||||||
yua.mix(event, props)
|
|
||||||
elem.dispatchEvent(event)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
//添加各种识别器
|
|
||||||
add: function (name, recognizer) {
|
|
||||||
function move(event) {
|
|
||||||
recognizer.touchmove(event)
|
|
||||||
}
|
|
||||||
|
|
||||||
function end(event) {
|
|
||||||
recognizer.touchend(event)
|
|
||||||
|
|
||||||
document.removeEventListener('touchmove', move)
|
|
||||||
|
|
||||||
document.removeEventListener('touchend', end)
|
|
||||||
|
|
||||||
document.removeEventListener('touchcancel', cancel)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function cancel(event) {
|
|
||||||
recognizer.touchcancel(event)
|
|
||||||
|
|
||||||
document.removeEventListener('touchmove', move)
|
|
||||||
|
|
||||||
document.removeEventListener('touchend', end)
|
|
||||||
|
|
||||||
document.removeEventListener('touchcancel', cancel)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
recognizer.events.forEach(function (eventName) {
|
|
||||||
yua.eventHooks[eventName] = {
|
|
||||||
fix: function (el, fn) {
|
|
||||||
if (!el['touch-' + name]) {
|
|
||||||
el['touch-' + name] = '1'
|
|
||||||
el.addEventListener('touchstart', function (event) {
|
|
||||||
recognizer.touchstart(event)
|
|
||||||
|
|
||||||
document.addEventListener('touchmove', move)
|
|
||||||
|
|
||||||
document.addEventListener('touchend', end)
|
|
||||||
|
|
||||||
document.addEventListener('touchcancel', cancel)
|
|
||||||
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return fn
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var locations = ['screenX', 'screenY', 'clientX', 'clientY', 'pageX', 'pageY']
|
|
||||||
|
|
||||||
// 复制 touch 对象上的有用属性到固定对象上
|
|
||||||
function mixLocations(target, source) {
|
|
||||||
if (source) {
|
|
||||||
locations.forEach(function (key) {
|
|
||||||
target[key] = source[key]
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return target
|
|
||||||
}
|
|
||||||
|
|
||||||
var supportPointer = !!navigator.pointerEnabled || !!navigator.msPointerEnabled
|
|
||||||
|
|
||||||
if (supportPointer) { // 支持pointer的设备可用样式来取消click事件的300毫秒延迟
|
|
||||||
root.style.msTouchAction = root.style.touchAction = 'none'
|
|
||||||
}
|
|
||||||
var tapRecognizer = {
|
|
||||||
events: ['tap'],
|
|
||||||
touchBoundary: 10,
|
|
||||||
tapDelay: 200,
|
|
||||||
needClick: function(target) {
|
|
||||||
//判定是否使用原生的点击事件, 否则使用sendClick方法手动触发一个人工的点击事件
|
|
||||||
switch (target.nodeName.toLowerCase()) {
|
|
||||||
case 'button':
|
|
||||||
case 'select':
|
|
||||||
case 'textarea':
|
|
||||||
if (target.disabled) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 'input':
|
|
||||||
// IOS6 pad 上选择文件,如果不是原生的click,弹出的选择界面尺寸错误
|
|
||||||
if ((deviceIsIOS && target.type === 'file') || target.disabled) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 'label':
|
|
||||||
case 'iframe':
|
|
||||||
case 'video':
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
},
|
|
||||||
needFocus: function(target) {
|
|
||||||
switch (target.nodeName.toLowerCase()) {
|
|
||||||
case 'textarea':
|
|
||||||
case 'select': //实测android下select也需要
|
|
||||||
return true;
|
|
||||||
case 'input':
|
|
||||||
switch (target.type) {
|
|
||||||
case 'button':
|
|
||||||
case 'checkbox':
|
|
||||||
case 'file':
|
|
||||||
case 'image':
|
|
||||||
case 'radio':
|
|
||||||
case 'submit':
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
//如果是只读或disabled状态,就无须获得焦点了
|
|
||||||
return !target.disabled && !target.readOnly
|
|
||||||
default:
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
focus: function(targetElement) {
|
|
||||||
var length;
|
|
||||||
//在iOS7下, 对一些新表单元素(如date, datetime, time, month)调用focus方法会抛错,
|
|
||||||
//幸好的是,我们可以改用setSelectionRange获取焦点, 将光标挪到文字的最后
|
|
||||||
var type = targetElement.type
|
|
||||||
if (deviceIsIOS && targetElement.setSelectionRange &&
|
|
||||||
type.indexOf('date') !== 0 && type !== 'time' && type !== 'month') {
|
|
||||||
length = targetElement.value.length
|
|
||||||
targetElement.setSelectionRange(length, length)
|
|
||||||
} else {
|
|
||||||
targetElement.focus()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
findControl: function(labelElement) {
|
|
||||||
// 获取label元素所对应的表单元素
|
|
||||||
// 可以能过control属性, getElementById, 或用querySelector直接找其内部第一表单元素实现
|
|
||||||
if (labelElement.control !== undefined) {
|
|
||||||
return labelElement.control
|
|
||||||
}
|
|
||||||
|
|
||||||
if (labelElement.htmlFor) {
|
|
||||||
return document.getElementById(labelElement.htmlFor)
|
|
||||||
}
|
|
||||||
|
|
||||||
return labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea')
|
|
||||||
},
|
|
||||||
fixTarget: function(target) {
|
|
||||||
if (target.nodeType === 3) {
|
|
||||||
return target.parentNode
|
|
||||||
}
|
|
||||||
if (window.SVGElementInstance && (target instanceof SVGElementInstance)) {
|
|
||||||
return target.correspondingUseElement;
|
|
||||||
}
|
|
||||||
|
|
||||||
return target
|
|
||||||
},
|
|
||||||
updateScrollParent: function(targetElement) {
|
|
||||||
//如果事件源元素位于某一个有滚动条的祖父元素中,那么保持其scrollParent与scrollTop值
|
|
||||||
var scrollParent = targetElement.tapScrollParent
|
|
||||||
|
|
||||||
if (!scrollParent || !scrollParent.contains(targetElement)) {
|
|
||||||
var parentElement = targetElement
|
|
||||||
do {
|
|
||||||
if (parentElement.scrollHeight > parentElement.offsetHeight) {
|
|
||||||
scrollParent = parentElement
|
|
||||||
targetElement.tapScrollParent = parentElement
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
parentElement = parentElement.parentElement
|
|
||||||
} while (parentElement)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (scrollParent) {
|
|
||||||
scrollParent.lastScrollTop = scrollParent.scrollTop
|
|
||||||
}
|
|
||||||
},
|
|
||||||
touchHasMoved: function(event) {
|
|
||||||
//判定是否发生移动,其阀值是10px
|
|
||||||
var touch = event.changedTouches[0],
|
|
||||||
boundary = tapRecognizer.touchBoundary
|
|
||||||
return Math.abs(touch.pageX - tapRecognizer.pageX) > boundary ||
|
|
||||||
Math.abs(touch.pageY - tapRecognizer.pageY) > boundary
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
findType: function(targetElement) {
|
|
||||||
// 安卓chrome浏览器上,模拟的 click 事件不能让 select 打开,故使用 mousedown 事件
|
|
||||||
return deviceIsAndroid && targetElement.tagName.toLowerCase() === 'select' ?
|
|
||||||
'mousedown' : 'click'
|
|
||||||
},
|
|
||||||
sendClick: function(targetElement, event) {
|
|
||||||
// 在click之前触发tap事件
|
|
||||||
Recognizer.fire(targetElement, 'tap', {
|
|
||||||
touchEvent: event
|
|
||||||
})
|
|
||||||
var clickEvent, touch
|
|
||||||
//某些安卓设备必须先移除焦点,之后模拟的click事件才能让新元素获取焦点
|
|
||||||
if (document.activeElement && document.activeElement !== targetElement) {
|
|
||||||
document.activeElement.blur()
|
|
||||||
}
|
|
||||||
|
|
||||||
touch = event.changedTouches[0]
|
|
||||||
// 手动触发点击事件,此时必须使用document.createEvent('MouseEvents')来创建事件
|
|
||||||
// 及使用initMouseEvent来初始化它
|
|
||||||
clickEvent = document.createEvent('MouseEvents')
|
|
||||||
clickEvent.initMouseEvent(tapRecognizer.findType(targetElement), true, true, window, 1, touch.screenX,
|
|
||||||
touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null)
|
|
||||||
clickEvent.touchEvent = event
|
|
||||||
targetElement.dispatchEvent(clickEvent)
|
|
||||||
},
|
|
||||||
touchstart: function(event) {
|
|
||||||
//忽略多点触摸
|
|
||||||
if (event.targetTouches.length !== 1) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
//修正事件源对象
|
|
||||||
var targetElement = tapRecognizer.fixTarget(event.target)
|
|
||||||
var touch = event.targetTouches[0]
|
|
||||||
if (deviceIsIOS) {
|
|
||||||
// 判断是否是点击文字,进行选择等操作,如果是,不需要模拟click
|
|
||||||
var selection = window.getSelection();
|
|
||||||
if (selection.rangeCount && !selection.isCollapsed) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
var id = touch.identifier
|
|
||||||
//当 alert 或 confirm 时,点击其他地方,会触发touch事件,identifier相同,此事件应该被忽略
|
|
||||||
if (id && isFinite(tapRecognizer.lastTouchIdentifier) && tapRecognizer.lastTouchIdentifier === id) {
|
|
||||||
event.preventDefault()
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
tapRecognizer.lastTouchIdentifier = id
|
|
||||||
|
|
||||||
tapRecognizer.updateScrollParent(targetElement)
|
|
||||||
}
|
|
||||||
//收集触摸点的信息
|
|
||||||
tapRecognizer.status = "tapping"
|
|
||||||
tapRecognizer.startTime = Date.now()
|
|
||||||
tapRecognizer.element = targetElement
|
|
||||||
tapRecognizer.pageX = touch.pageX
|
|
||||||
tapRecognizer.pageY = touch.pageY
|
|
||||||
// 如果点击太快,阻止双击带来的放大收缩行为
|
|
||||||
if ((tapRecognizer.startTime - tapRecognizer.lastTime) < tapRecognizer.tapDelay) {
|
|
||||||
event.preventDefault()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
touchmove: function(event) {
|
|
||||||
if (tapRecognizer.status !== "tapping") {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
// 如果事件源元素发生改变,或者发生了移动,那么就取消触发点击事件
|
|
||||||
if (tapRecognizer.element !== tapRecognizer.fixTarget(event.target) ||
|
|
||||||
tapRecognizer.touchHasMoved(event)) {
|
|
||||||
tapRecognizer.status = tapRecognizer.element = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
touchend: function(event) {
|
|
||||||
var targetElement = tapRecognizer.element
|
|
||||||
var now = Date.now()
|
|
||||||
//如果是touchstart与touchend相隔太久,可以认为是长按,那么就直接返回
|
|
||||||
//或者是在touchstart, touchmove阶段,判定其不该触发点击事件,也直接返回
|
|
||||||
if (!targetElement || now - tapRecognizer.startTime > tapRecognizer.tapDelay) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
tapRecognizer.lastTime = now
|
|
||||||
|
|
||||||
var startTime = tapRecognizer.startTime
|
|
||||||
tapRecognizer.status = tapRecognizer.startTime = 0
|
|
||||||
|
|
||||||
targetTagName = targetElement.tagName.toLowerCase()
|
|
||||||
if (targetTagName === 'label') {
|
|
||||||
//尝试触发label上可能绑定的tap事件
|
|
||||||
Recognizer.fire(targetElement, 'tap', {
|
|
||||||
touchEvent: event
|
|
||||||
})
|
|
||||||
var forElement = tapRecognizer.findControl(targetElement)
|
|
||||||
if (forElement) {
|
|
||||||
tapRecognizer.focus(targetElement)
|
|
||||||
targetElement = forElement
|
|
||||||
}
|
|
||||||
} else if (tapRecognizer.needFocus(targetElement)) {
|
|
||||||
// 如果元素从touchstart到touchend经历时间过长,那么不应该触发点击事
|
|
||||||
// 或者此元素是iframe中的input元素,那么它也无法获点焦点
|
|
||||||
if ((now - startTime) > 100 || (deviceIsIOS && window.top !== window && targetTagName === 'input')) {
|
|
||||||
tapRecognizer.element = 0
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
tapRecognizer.focus(targetElement)
|
|
||||||
deviceIsAndroid && tapRecognizer.sendClick(targetElement, event)
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
if (deviceIsIOS) {
|
|
||||||
//如果它的父容器的滚动条发生改变,那么应该识别为划动或拖动事件,不应该触发点击事件
|
|
||||||
var scrollParent = targetElement.tapScrollParent;
|
|
||||||
if (scrollParent && scrollParent.lastScrollTop !== scrollParent.scrollTop) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//如果这不是一个需要使用原生click的元素,则屏蔽原生事件,避免触发两次click
|
|
||||||
if (!tapRecognizer.needClick(targetElement)) {
|
|
||||||
event.preventDefault()
|
|
||||||
// 触发一次模拟的click
|
|
||||||
tapRecognizer.sendClick(targetElement, event)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
touchcancel: function() {
|
|
||||||
tapRecognizer.startTime = tapRecognizer.element = 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Recognizer.add("tap", tapRecognizer)
|
|
||||||
|
|
||||||
var pressRecognizer = {
|
|
||||||
events: ['longtap', 'doubletap'],
|
|
||||||
cancelPress: function (pointer) {
|
|
||||||
clearTimeout(pointer.pressingHandler)
|
|
||||||
pointer.pressingHandler = null
|
|
||||||
},
|
|
||||||
touchstart: function (event) {
|
|
||||||
Recognizer.start(event, function (pointer, touch) {
|
|
||||||
pointer.pressingHandler = setTimeout(function () {
|
|
||||||
if (pointer.status === 'tapping') {
|
|
||||||
Recognizer.fire(event.target, 'longtap', {
|
|
||||||
touch: touch,
|
|
||||||
touchEvent: event
|
|
||||||
})
|
|
||||||
}
|
|
||||||
pressRecognizer.cancelPress(pointer)
|
|
||||||
}, 800)
|
|
||||||
if (event.changedTouches.length !== 1) {
|
|
||||||
pointer.status = 0
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
},
|
|
||||||
touchmove: function (event) {
|
|
||||||
Recognizer.move(event, function (pointer) {
|
|
||||||
if (pointer.distance > 10 && pointer.pressingHandler) {
|
|
||||||
pressRecognizer.cancelPress(pointer)
|
|
||||||
if (pointer.status === 'tapping') {
|
|
||||||
pointer.status = 'panning'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
touchend: function (event) {
|
|
||||||
Recognizer.end(event, function (pointer, touch) {
|
|
||||||
pressRecognizer.cancelPress(pointer)
|
|
||||||
if (pointer.status === 'tapping') {
|
|
||||||
pointer.lastTime = Date.now()
|
|
||||||
if (pressRecognizer.lastTap && pointer.lastTime - pressRecognizer.lastTap.lastTime < 300) {
|
|
||||||
Recognizer.fire(pointer.element, 'doubletap', {
|
|
||||||
touch: touch,
|
|
||||||
touchEvent: event
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
pressRecognizer.lastTap = pointer
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
},
|
|
||||||
touchcancel: function (event) {
|
|
||||||
Recognizer.end(event, function (pointer) {
|
|
||||||
pressRecognizer.cancelPress(pointer)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Recognizer.add('press', pressRecognizer)
|
|
||||||
|
|
||||||
var swipeRecognizer = {
|
|
||||||
events: ['swipe', 'swipeleft', 'swiperight', 'swipeup', 'swipedown'],
|
|
||||||
getAngle: function (x, y ) {
|
|
||||||
return Math.atan2(y, x) * 180 / Math.PI
|
|
||||||
},
|
|
||||||
getDirection: function (x, y) {
|
|
||||||
var angle = swipeRecognizer.getAngle(x, y)
|
|
||||||
if ((angle < -45) && (angle > -135)) {
|
|
||||||
return "up"
|
|
||||||
} else if ((angle >= 45) && (angle < 315)) {
|
|
||||||
return "down"
|
|
||||||
} else if ((angle > -45) && (angle <= 45)) {
|
|
||||||
return "right"
|
|
||||||
} else{
|
|
||||||
return "left"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
touchstart: function (event) {
|
|
||||||
Recognizer.start(event, noop)
|
|
||||||
},
|
|
||||||
touchmove: function (event) {
|
|
||||||
Recognizer.move(event, noop)
|
|
||||||
},
|
|
||||||
touchend: function (event) {
|
|
||||||
if(event.changedTouches.length !== 1){
|
|
||||||
return
|
|
||||||
}
|
|
||||||
Recognizer.end(event, function (pointer, touch) {
|
|
||||||
var isflick = (pointer.distance > 30 && pointer.distance / pointer.duration > 0.65)
|
|
||||||
if (isflick) {
|
|
||||||
var extra = {
|
|
||||||
deltaX : pointer.deltaX,
|
|
||||||
deltaY: pointer.deltaY,
|
|
||||||
touch: touch,
|
|
||||||
touchEvent: event,
|
|
||||||
direction: swipeRecognizer.getDirection(pointer.deltaX, pointer.deltaY),
|
|
||||||
isVertical: pointer.isVertical
|
|
||||||
}
|
|
||||||
var target = pointer.element
|
|
||||||
Recognizer.fire(target, 'swipe', extra)
|
|
||||||
Recognizer.fire(target, 'swipe' + extra.direction, extra)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
swipeRecognizer.touchcancel = swipeRecognizer.touchend
|
|
||||||
Recognizer.add('swipe', swipeRecognizer)
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
{
|
||||||
|
"name": "doui-yua",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"description": "基于yua框架的doUI组件库。支持IE10+,及现代浏览器。",
|
||||||
|
"main": "dist/",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node ./build.dev.js",
|
||||||
|
"build": "node ./build.prod.js"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/yutent/doui.git"
|
||||||
|
},
|
||||||
|
"keywords": ["doui", "yua"],
|
||||||
|
"author": "yutent",
|
||||||
|
"license": "MIT",
|
||||||
|
"devDependencies": {
|
||||||
|
"babel-core": "^6.26.0",
|
||||||
|
"babel-plugin-transform-es2015-modules-umd": "^6.24.1",
|
||||||
|
"babel-preset-es2015": "^6.24.1",
|
||||||
|
"babel-preset-minify": "^0.2.0",
|
||||||
|
"chokidar": "^1.7.0",
|
||||||
|
"iofs": "^1.0.2",
|
||||||
|
"node-sass": "^4.7.2"
|
||||||
|
}
|
||||||
|
}
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 7.6 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 8.3 KiB |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 8.9 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
@ -0,0 +1,633 @@
|
||||||
|
/**
|
||||||
|
* Request组件, modern版, 支持IE9+,chrome,FF
|
||||||
|
* @authors yutent (yutent@doui.cc)
|
||||||
|
* @date 2016-11-27 13:08:40
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict'
|
||||||
|
define(['yua', './lib/promise'], function(yua) {
|
||||||
|
// console.log(11243)
|
||||||
|
var _request = function(url, protocol) {
|
||||||
|
this.transport = true
|
||||||
|
protocol = (protocol + '').trim().toUpperCase()
|
||||||
|
this.xhr = Xhr()
|
||||||
|
this.defer = Promise.defer()
|
||||||
|
this.opt = {
|
||||||
|
url: (url + '').trim(),
|
||||||
|
type: protocol || 'GET',
|
||||||
|
form: '',
|
||||||
|
data: {},
|
||||||
|
headers: {},
|
||||||
|
timeoutID: 0,
|
||||||
|
uuid: Math.random()
|
||||||
|
.toString(16)
|
||||||
|
.substr(2)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_requestp = _request.prototype,
|
||||||
|
toS = Object.prototype.toString,
|
||||||
|
win = window,
|
||||||
|
doc = win.document,
|
||||||
|
encode = encodeURIComponent,
|
||||||
|
decode = decodeURIComponent,
|
||||||
|
noop = function(e, res) {
|
||||||
|
this.defer.resolve(res)
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------
|
||||||
|
|
||||||
|
// 本地协议判断正则
|
||||||
|
var rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/
|
||||||
|
var isLocal = false
|
||||||
|
try {
|
||||||
|
isLocal = rlocalProtocol.test(location.ptyperotocol)
|
||||||
|
} catch (e) {}
|
||||||
|
|
||||||
|
var rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/gm
|
||||||
|
|
||||||
|
// ----------------- 一些兼容性预处理 --------------------
|
||||||
|
|
||||||
|
win.Xhr = function() {
|
||||||
|
return new XMLHttpRequest()
|
||||||
|
}
|
||||||
|
var supportCors = 'withCredentials' in Xhr()
|
||||||
|
|
||||||
|
// ------------------- 几个解释方法 -----------------------
|
||||||
|
|
||||||
|
function serialize(p, obj, q) {
|
||||||
|
var k
|
||||||
|
if (Array.isArray(obj)) {
|
||||||
|
obj.forEach(function(it, i) {
|
||||||
|
k = p ? p + '[' + (Array.isArray(it) ? i : '') + ']' : i
|
||||||
|
if (typeof it === 'object') {
|
||||||
|
serialize(k, it, q)
|
||||||
|
} else {
|
||||||
|
q(k, it)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
for (var i in obj) {
|
||||||
|
k = p ? p + '[' + i + ']' : i
|
||||||
|
if (typeof obj[i] === 'object') {
|
||||||
|
serialize(k, obj[i], q)
|
||||||
|
} else {
|
||||||
|
q(k, obj[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var Format = function() {}
|
||||||
|
|
||||||
|
Format.prototype = {
|
||||||
|
parseJS: function(code) {
|
||||||
|
code = (code + '').trim()
|
||||||
|
if (code) {
|
||||||
|
if (code.indexOf('use strict') === 1) {
|
||||||
|
var script = doc.createElement('script')
|
||||||
|
script.text = code
|
||||||
|
doc.head.appendChild(script).parentNode.removeChild(script)
|
||||||
|
} else {
|
||||||
|
eval(code)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
parseXML: function(data, xml, tmp) {
|
||||||
|
try {
|
||||||
|
tmp = new DOMParser()
|
||||||
|
xml = tmp.parseFromString(data, 'text/xml')
|
||||||
|
} catch (e) {
|
||||||
|
xml = void 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
!xml ||
|
||||||
|
!xml.documentElement ||
|
||||||
|
xml.getElementsByTagName('parsererror').length
|
||||||
|
) {
|
||||||
|
console.error('Invalid XML: ' + data)
|
||||||
|
}
|
||||||
|
return xml
|
||||||
|
},
|
||||||
|
parseHTML: function(html) {
|
||||||
|
return yua.parseHTML(html)
|
||||||
|
},
|
||||||
|
param: function(obj) {
|
||||||
|
if (!obj || typeof obj === 'string' || typeof obj === 'number') return obj
|
||||||
|
|
||||||
|
var arr = []
|
||||||
|
var q = function(k, v) {
|
||||||
|
if (/native code/.test(v)) return
|
||||||
|
|
||||||
|
v = typeof v === 'function' ? v() : v
|
||||||
|
v = toS.call(v) !== '[object File]' ? encode(v) : v
|
||||||
|
|
||||||
|
arr.push(encode(k) + '=' + v)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof obj === 'object') serialize('', obj, q)
|
||||||
|
|
||||||
|
return arr.join('&')
|
||||||
|
},
|
||||||
|
parseForm: function(form) {
|
||||||
|
var data = {}
|
||||||
|
for (var i = 0, field; (field = form.elements[i++]); ) {
|
||||||
|
switch (field.type) {
|
||||||
|
case 'select-one':
|
||||||
|
case 'select-multiple':
|
||||||
|
if (field.name.length && !field.disabled) {
|
||||||
|
for (var j = 0, opt; (opt = field.options[j++]); ) {
|
||||||
|
if (opt.selected) {
|
||||||
|
data[field.name] = opt.value || opt.text
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break
|
||||||
|
case 'file':
|
||||||
|
if (field.name.length && !field.disabled) {
|
||||||
|
data[field.name] = field.files[0]
|
||||||
|
}
|
||||||
|
break
|
||||||
|
case undefined:
|
||||||
|
case 'submit':
|
||||||
|
case 'reset':
|
||||||
|
case 'button':
|
||||||
|
break //按钮啥的, 直接忽略
|
||||||
|
case 'radio':
|
||||||
|
case 'checkbox':
|
||||||
|
// 只处理选中的
|
||||||
|
if (!field.checked) break
|
||||||
|
default:
|
||||||
|
if (field.name.length && !field.disabled) {
|
||||||
|
data[field.name] = field.value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
},
|
||||||
|
merge: function(a, b) {
|
||||||
|
if (typeof a !== 'object' || typeof b !== 'object')
|
||||||
|
throw new TypeError('argument must be an object')
|
||||||
|
|
||||||
|
if (Object.assign) return Object.assign(a, b)
|
||||||
|
|
||||||
|
for (var i in b) {
|
||||||
|
a[i] = b[i]
|
||||||
|
}
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var F = new Format()
|
||||||
|
|
||||||
|
// ---------------------------------------------------------
|
||||||
|
// -------------------- request 模块开始 --------------------
|
||||||
|
// ---------------------------------------------------------
|
||||||
|
|
||||||
|
var requestConvert = {
|
||||||
|
text: function(val) {
|
||||||
|
return val
|
||||||
|
},
|
||||||
|
xml: function(val, xml) {
|
||||||
|
return xml !== undefined ? xml : F.parseXML(val)
|
||||||
|
},
|
||||||
|
html: function(val) {
|
||||||
|
return F.parseHTML(val)
|
||||||
|
},
|
||||||
|
json: function(val) {
|
||||||
|
return JSON.parse(val)
|
||||||
|
},
|
||||||
|
script: function(val) {
|
||||||
|
return F.parseJS(val)
|
||||||
|
},
|
||||||
|
jsonp: function(name) {
|
||||||
|
var json = request.cache[name]
|
||||||
|
delete request.cache[name]
|
||||||
|
return json
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var requestExtend = {
|
||||||
|
formData: function() {
|
||||||
|
if (this.opt.form) {
|
||||||
|
var data = F.parseForm(this.opt.form)
|
||||||
|
F.merge(this.opt.data, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
var form = new FormData()
|
||||||
|
for (var i in this.opt.data) {
|
||||||
|
var el = this.opt.data[i]
|
||||||
|
if (Array.isArray(el)) {
|
||||||
|
el.forEach(function(it) {
|
||||||
|
form.append(i + '[]', it)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
form.append(i, this.opt.data[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return form
|
||||||
|
},
|
||||||
|
jsonp: function(jsonpcallback) {
|
||||||
|
win[jsonpcallback] = function(val) {
|
||||||
|
delete win[jsonpcallback]
|
||||||
|
request.cache[jsonpcallback] = val
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dispatch: function(self) {
|
||||||
|
if (!this.transport) return this.defer.reject('Request pending...')
|
||||||
|
|
||||||
|
var _this = this,
|
||||||
|
result = {
|
||||||
|
response: {
|
||||||
|
url: this.opt.url,
|
||||||
|
headers: { 'content-type': '' }
|
||||||
|
},
|
||||||
|
request: {
|
||||||
|
url: this.opt.url,
|
||||||
|
headers: _this.opt.headers
|
||||||
|
},
|
||||||
|
status: self === null ? 504 : 200,
|
||||||
|
statusText: self === null ? 'Connected timeout' : 'ok',
|
||||||
|
text: '',
|
||||||
|
body: '',
|
||||||
|
error: null
|
||||||
|
}
|
||||||
|
|
||||||
|
//状态为4,既已成功, 则清除超时
|
||||||
|
clearTimeout(_this.opt.timeoutID)
|
||||||
|
|
||||||
|
if (typeof this.transport === 'object' && this.opt.type === 'JSONP') {
|
||||||
|
//移除script
|
||||||
|
// this.transport.parentNode.removeChild(this.transport);
|
||||||
|
|
||||||
|
//超时返回
|
||||||
|
if (self !== null) {
|
||||||
|
var exec =
|
||||||
|
!this.transport.readyState ||
|
||||||
|
this.transport.readyState === 'loaded' ||
|
||||||
|
this.transport.readyState === 'complete'
|
||||||
|
|
||||||
|
if (exec) {
|
||||||
|
result.body = requestConvert.jsonp(this.opt.data.callback)
|
||||||
|
result.text = JSON.stringify(result.body)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.callback(result.error, result)
|
||||||
|
} else {
|
||||||
|
//成功的回调
|
||||||
|
var isSucc = self
|
||||||
|
? (self.status >= 200 && self.status < 300) || self.status === 304
|
||||||
|
: false,
|
||||||
|
headers = (self && self.getAllResponseHeaders().split('\n')) || []
|
||||||
|
|
||||||
|
//处理返回的Header
|
||||||
|
headers.forEach(function(it, i) {
|
||||||
|
it = it.trim()
|
||||||
|
if (it) {
|
||||||
|
it = it.split(':')
|
||||||
|
result.response.headers[it.shift().toLowerCase()] = it
|
||||||
|
.join(':')
|
||||||
|
.trim()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (isSucc) {
|
||||||
|
result.status = self.status
|
||||||
|
if (result.status === 204) {
|
||||||
|
result.statusText = 'no content'
|
||||||
|
} else if (result.status === 304) {
|
||||||
|
result.statusText = 'not modified'
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result.status = self === null ? 504 : self.status || 500
|
||||||
|
result.statusText =
|
||||||
|
self === null
|
||||||
|
? 'Connected timeout'
|
||||||
|
: self.statusText || 'Internal Server Error'
|
||||||
|
result.error = F.merge(new Error(result.statusText), {
|
||||||
|
status: result.status
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
//处理返回的数据
|
||||||
|
var dataType = result.response.headers['content-type'].match(
|
||||||
|
/json|xml|script|html/i
|
||||||
|
) || ['text']
|
||||||
|
|
||||||
|
dataType = dataType[0].toLowerCase()
|
||||||
|
result.text = (self && (self.responseText || self.responseXML)) || ''
|
||||||
|
result.body = requestConvert[dataType](
|
||||||
|
result.text,
|
||||||
|
self && self.responseXML
|
||||||
|
)
|
||||||
|
} catch (err) {
|
||||||
|
result.error = err
|
||||||
|
result.statusText = 'parse error'
|
||||||
|
}
|
||||||
|
|
||||||
|
_this.callback(result.error, result)
|
||||||
|
}
|
||||||
|
delete _this.defer
|
||||||
|
delete _this.transport
|
||||||
|
delete _this.opt
|
||||||
|
delete _this.xhr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置表单类型, 支持2种, form/json
|
||||||
|
_requestp.type = function(t) {
|
||||||
|
if (this.opt.formType === 'form-data') return this
|
||||||
|
|
||||||
|
this.opt.formType = t || 'form'
|
||||||
|
if (t === 'form' || this.opt.type === 'GET')
|
||||||
|
this.set(
|
||||||
|
'content-type',
|
||||||
|
'application/x-www-form-urlencoded; charset=UTF-8'
|
||||||
|
)
|
||||||
|
else this.set('content-type', 'application/json; charset=UTF-8')
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
//设置头信息
|
||||||
|
_requestp.set = function(k, val) {
|
||||||
|
if (!this.transport) return
|
||||||
|
|
||||||
|
if (typeof k === 'object') {
|
||||||
|
for (var i in k) {
|
||||||
|
i = i.toLowerCase()
|
||||||
|
this.opt.headers[i] = k[i]
|
||||||
|
}
|
||||||
|
} else if (typeof k === 'string') {
|
||||||
|
if (arguments.length < 2) throw new Error('2 arguments required')
|
||||||
|
|
||||||
|
// 全转小写,避免重复写入
|
||||||
|
k = k.toLowerCase()
|
||||||
|
|
||||||
|
if (val === undefined) delete this.opt.headers[k]
|
||||||
|
else this.opt.headers[k] = val
|
||||||
|
} else {
|
||||||
|
throw new Error(
|
||||||
|
'arguments must be string/object, but [' + typeof k + '] given'
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
//设置请求参数
|
||||||
|
_requestp.send = function(k, val) {
|
||||||
|
if (!this.transport) return
|
||||||
|
|
||||||
|
// 1. send方法可以多次调用, 但必须保证格式一致
|
||||||
|
// 2. 2次圴提交纯字符串也会抛出异常
|
||||||
|
if (typeof k === 'object') {
|
||||||
|
if (this.opt.data && typeof this.opt.data === 'string')
|
||||||
|
throw new Error('param can not be string and object at the same time')
|
||||||
|
if (!this.opt.data) this.opt.data = {}
|
||||||
|
|
||||||
|
F.merge(this.opt.data, k)
|
||||||
|
} else {
|
||||||
|
if (typeof k === 'string') {
|
||||||
|
if (arguments.length === 1) {
|
||||||
|
if (this.opt.data) throw new Error('invalid param in function send')
|
||||||
|
|
||||||
|
this.opt.data = k
|
||||||
|
} else {
|
||||||
|
if (this.opt.data && typeof this.opt.data === 'string')
|
||||||
|
throw new Error(
|
||||||
|
'param can not be string and object at the same time'
|
||||||
|
)
|
||||||
|
|
||||||
|
if (!this.opt.data) this.opt.data = {}
|
||||||
|
|
||||||
|
this.opt.data[k] = val
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new Error(
|
||||||
|
'argument of send must be string/object, but [' + typeof k + '] given'
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
//该方法用于 form-data类型的post请求的参数设置
|
||||||
|
_requestp.field = function(k, val) {
|
||||||
|
if (!this.transport) return this
|
||||||
|
|
||||||
|
// 此类型优先级最高
|
||||||
|
this.opt.formType = 'form-data'
|
||||||
|
this.opt.type = 'POST'
|
||||||
|
if (!this.opt.data || (this.opt.data && typeof this.opt.data !== 'object'))
|
||||||
|
this.opt.data = {}
|
||||||
|
|
||||||
|
if (arguments.length === 1 && typeof k === 'object') {
|
||||||
|
F.merge(this.opt.data, k)
|
||||||
|
} else if (arguments.length === 2) {
|
||||||
|
this.opt.data[k] = val
|
||||||
|
} else {
|
||||||
|
throw new TypeError(
|
||||||
|
'argument must be an object, but ' + typeof k + ' given'
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
//设置缓存
|
||||||
|
_requestp.cache = function(t) {
|
||||||
|
if (!this.transport) return
|
||||||
|
|
||||||
|
if (this.opt.type === 'GET') this.opt.cache = !!t
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
//取消网络请求
|
||||||
|
_requestp.abort = function() {
|
||||||
|
delete this.transport
|
||||||
|
if (!this.opt.form) this.xhr.abort()
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
//超时设置, 单位毫秒
|
||||||
|
_requestp.timeout = function(time) {
|
||||||
|
if (typeof time !== 'number' || time < 1) return this
|
||||||
|
|
||||||
|
this.opt.timeout = time
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
_requestp.form = function(form) {
|
||||||
|
if (typeof form === 'object' && form.nodeName === 'FORM') {
|
||||||
|
this.opt.type = 'POST'
|
||||||
|
this.opt.form = form
|
||||||
|
}
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
var originAnchor = doc.createElement('a')
|
||||||
|
originAnchor.href = location.href
|
||||||
|
_requestp.end = function(callback) {
|
||||||
|
var _this = this
|
||||||
|
// 回调已执行, 或已取消, 则直接返回, 防止重复执行
|
||||||
|
if (!this.transport) return this
|
||||||
|
|
||||||
|
if (!this.opt.url) throw new Error('Invalid request url')
|
||||||
|
|
||||||
|
F.merge(this, requestExtend)
|
||||||
|
|
||||||
|
this.callback = callback || noop.bind(this)
|
||||||
|
|
||||||
|
// 1. url规范化
|
||||||
|
this.opt.url = this.opt.url
|
||||||
|
.replace(/#.*$/, '')
|
||||||
|
.replace(/^\/\//, location.protocol + '//')
|
||||||
|
|
||||||
|
// 2. 处理跨域
|
||||||
|
if (typeof this.opt.crossDomain !== 'boolean') {
|
||||||
|
var anchor = doc.createElement('a')
|
||||||
|
try {
|
||||||
|
anchor.href = this.opt.url
|
||||||
|
// IE7及以下浏览器 '1'[0]的结果是 undefined
|
||||||
|
// IE7下需要获取绝对路径
|
||||||
|
var absUrl = !'1'[0] ? anchor.getAttribute('href', 4) : anchor.href
|
||||||
|
anchor.href = absUrl
|
||||||
|
anchor.async = true
|
||||||
|
this.opt.crossDomain =
|
||||||
|
originAnchor.protocol !== anchor.protocol ||
|
||||||
|
originAnchor.host !== anchor.host
|
||||||
|
} catch (e) {
|
||||||
|
this.opt.crossDomain = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2.1 进一步处理跨域配置
|
||||||
|
if (this.opt.type === 'JSONP') {
|
||||||
|
//如果没有跨域,自动转回xhr GET
|
||||||
|
if (!this.opt.crossDomain) {
|
||||||
|
this.opt.type = 'GET'
|
||||||
|
} else {
|
||||||
|
this.opt.data['callback'] =
|
||||||
|
this.opt.data['callback'] || 'jsonp' + request.cid++
|
||||||
|
this.jsonp(this.opt.data['callback']) //创建临时处理方法
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 2.2 如果不是跨域请求,则自动加上一条header信息,用以标识这是ajax请求
|
||||||
|
if (!this.opt.crossDomain) {
|
||||||
|
this.set('X-Requested-With', 'XMLHttpRequest')
|
||||||
|
} else {
|
||||||
|
supportCors && (this.xhr.withCredentials = true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. data转字符串
|
||||||
|
this.opt.param = F.param(this.opt.data)
|
||||||
|
|
||||||
|
// 4. 设置Content-Type类型, 默认x-www-form-urlencoded
|
||||||
|
if (!this.opt.formType) this.type('form')
|
||||||
|
|
||||||
|
// 5.处理GET请求
|
||||||
|
this.opt.hasContent = this.opt.type === 'POST' //是否为post请求
|
||||||
|
if (!this.opt.hasContent) {
|
||||||
|
//GET请求直接把参数拼接到url上
|
||||||
|
if (this.opt.param) {
|
||||||
|
this.opt.url += (/\?/.test(this.opt.url) ? '&' : '?') + this.opt.param
|
||||||
|
}
|
||||||
|
//加随机值,避免缓存
|
||||||
|
if (this.opt.cache === false)
|
||||||
|
this.opt.url +=
|
||||||
|
(/\?/.test(this.opt.url) ? '&' : '?') + '_=' + Math.random()
|
||||||
|
} else {
|
||||||
|
if (this.opt.formType === 'form-data') {
|
||||||
|
delete this.opt.headers['content-type']
|
||||||
|
this.opt.param = this.formData()
|
||||||
|
} else if (this.opt.formType !== 'form') {
|
||||||
|
this.opt.param = JSON.stringify(this.opt.data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//jsonp
|
||||||
|
if (this.opt.type === 'JSONP') {
|
||||||
|
this.transport = doc.createElement('script')
|
||||||
|
this.transport.onerror = this.transport.onload = function() {
|
||||||
|
_this.dispatch(_this.transport)
|
||||||
|
}
|
||||||
|
this.transport.src = this.opt.url
|
||||||
|
doc.head.insertBefore(this.transport, doc.head.firstChild)
|
||||||
|
|
||||||
|
//6. 超时处理
|
||||||
|
if (this.opt.timeout && this.opt.timeout > 0) {
|
||||||
|
this.opt.timeoutID = setTimeout(function() {
|
||||||
|
_this.transport.onerror = _this.transport.onload = null
|
||||||
|
_this.dispatch(null)
|
||||||
|
}, this.opt.timeout)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.xhr.onreadystatechange = function(ev) {
|
||||||
|
if (_this.opt.timeout && _this.opt.timeout > 0) {
|
||||||
|
_this.opt['time' + this.readyState] = ev.timeStamp
|
||||||
|
if (this.readyState === 4) {
|
||||||
|
_this.opt.isTimeout =
|
||||||
|
_this.opt.time4 - _this.opt.time1 > _this.opt.timeout
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.readyState !== 4) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
_this.dispatch(_this.opt.isTimeout ? null : _this.xhr)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 6. 初始化xhr提交
|
||||||
|
this.xhr.open(this.opt.type, this.opt.url, true)
|
||||||
|
|
||||||
|
// 7. 设置头信息
|
||||||
|
for (var i in this.opt.headers) {
|
||||||
|
if (this.opt.headers[i])
|
||||||
|
this.xhr.setRequestHeader(i, this.opt.headers[i])
|
||||||
|
}
|
||||||
|
|
||||||
|
// 8. 发起网络请求
|
||||||
|
_this.xhr.send(_this.opt.param)
|
||||||
|
|
||||||
|
//超时处理
|
||||||
|
if (this.opt.timeout && this.opt.timeout > 0) {
|
||||||
|
this.xhr.timeout = this.opt.timeout
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this.defer.promise
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------- end ------------------------
|
||||||
|
|
||||||
|
if (!win.request) {
|
||||||
|
win.request = {
|
||||||
|
get: function(url) {
|
||||||
|
if (!url) throw new Error('argument url is required')
|
||||||
|
|
||||||
|
return new _request(url, 'GET')
|
||||||
|
},
|
||||||
|
post: function(url) {
|
||||||
|
if (!url) throw new Error('argument url is required')
|
||||||
|
|
||||||
|
return new _request(url, 'POST')
|
||||||
|
},
|
||||||
|
jsonp: function(url) {
|
||||||
|
if (!url) throw new Error('argument url is required')
|
||||||
|
|
||||||
|
return new _request(url, 'JSONP')
|
||||||
|
},
|
||||||
|
cache: {},
|
||||||
|
cid: 0,
|
||||||
|
version: '1.1.0-es5'
|
||||||
|
}
|
||||||
|
yua.ui.request = request.version
|
||||||
|
}
|
||||||
|
|
||||||
|
return request
|
||||||
|
})
|