提交 3b44e515 编写于 作者: Q qiang

Merge branch 'dev' into alpha

......@@ -64,14 +64,14 @@ describe('mp:compiler-extra', () => {
)
assertCodegen(
'<view class="static" :class="[{ active: isActive }, errorClass]"></view>',
'<view class="{{[\'static data-v-4\',[(isActive)?\'active\':\'\'],errorClass]}}"></view>',
'<view class="{{[\'static\',\'data-v-4\',[(isActive)?\'active\':\'\'],errorClass]}}"></view>',
undefined, {
scopeId: 'data-v-4'
}
)
assertCodegen(
'<view ref="ref" :class="[{ active: isActive }, errorClass]"></view>',
'<view data-ref="ref" class="{{[\'data-v-5 vue-ref\',[(isActive)?\'active\':\'\'],errorClass]}}"></view>',
'<view data-ref="ref" class="{{[\'data-v-5\',\'vue-ref\',[(isActive)?\'active\':\'\'],errorClass]}}"></view>',
undefined, {
scopeId: 'data-v-5'
}
......@@ -92,7 +92,7 @@ describe('mp:compiler-extra', () => {
// )
assertCodegen(
'<view :class="view" class="view"></view>',
'<view class="{{[\'view data-v-7\',view]}}"></view>',
'<view class="{{[\'view\',\'data-v-7\',view]}}"></view>',
undefined, {
scopeId: 'data-v-7'
}
......@@ -378,23 +378,23 @@ describe('mp:compiler-extra', () => {
)
assertCodegen(
'<p class="static" :class="{ active: isActive, \'text-danger\': hasError }">2</p>',
'<view class="{{[\'static _p\',(isActive)?\'active\':\'\',(hasError)?\'text-danger\':\'\']}}">2</view>'
'<view class="{{[\'static\',\'_p\',(isActive)?\'active\':\'\',(hasError)?\'text-danger\':\'\']}}">2</view>'
)
assertCodegen(
'<p class="static" :class="[activeClass, errorClass]">3</p>',
'<view class="{{[\'static _p\',activeClass,errorClass]}}">3</view>'
'<view class="{{[\'static\',\'_p\',activeClass,errorClass]}}">3</view>'
)
assertCodegen(
'<p class="static" :class="[isActive ? activeClass : \'\', errorClass]">4</p>',
'<view class="{{[\'static _p\',isActive?activeClass:\'\',errorClass]}}">4</view>'
'<view class="{{[\'static\',\'_p\',isActive?activeClass:\'\',errorClass]}}">4</view>'
)
assertCodegen(
'<p class="static" :class="[{ active: isActive }, errorClass]">5</p>',
'<view class="{{[\'static _p\',[(isActive)?\'active\':\'\'],errorClass]}}">5</view>'
'<view class="{{[\'static\',\'_p\',[(isActive)?\'active\':\'\'],errorClass]}}">5</view>'
)
assertCodegen(
'<div class="container" :class="computedClassObject">6</div>',
'<view class="{{[\'container _div\',computedClassObject]}}">6</view>'
'<view class="{{[\'container\',\'_div\',computedClassObject]}}">6</view>'
)
// assertCodegen(
// `<div class="container" :class="computedClassObject">6</div>`,
......@@ -411,7 +411,7 @@ describe('mp:compiler-extra', () => {
)
assertCodegen(
'<p :class="classStr1 || classStr2" class="bg">9</p>',
'<view class="{{[\'bg _p\',classStr1||classStr2]}}">9</view>'
'<view class="{{[\'bg\',\'_p\',classStr1||classStr2]}}">9</view>'
)
})
......
......@@ -137,27 +137,27 @@ describe('mp:compiler-mp-alipay', () => {
)
assertCodegen(
'<p class="static" :class="{ active: isActive, \'text-danger\': hasError }">2</p>',
'<view class="{{(((\'static _p\')+\' \'+((isActive)?\'active\':\'\'))+\' \'+((hasError)?\'text-danger\':\'\'))}}">2</view>'
'<view class="{{((((\'static\')+\' \'+\'_p\')+\' \'+((isActive)?\'active\':\'\'))+\' \'+((hasError)?\'text-danger\':\'\'))}}">2</view>'
)
assertCodegen(
'<p class="static" :class="[activeClass, errorClass]">3</p>',
'<view class="{{(((\'static _p\')+\' \'+activeClass)+\' \'+errorClass)}}">3</view>'
'<view class="{{((((\'static\')+\' \'+\'_p\')+\' \'+activeClass)+\' \'+errorClass)}}">3</view>'
)
assertCodegen(
'<p class="static" :class="[isActive ? activeClass : \'\', errorClass]">4</p>',
'<view class="{{(((\'static _p\')+\' \'+(isActive?activeClass:\'\'))+\' \'+errorClass)}}">4</view>'
'<view class="{{((((\'static\')+\' \'+\'_p\')+\' \'+(isActive?activeClass:\'\'))+\' \'+errorClass)}}">4</view>'
)
assertCodegen(
'<p class="static" :class="[{ active: isActive }, errorClass]">5</p>',
'<view class="{{(((\'static _p\')+\' \'+((isActive)?\'active\':\'\'))+\' \'+errorClass)}}">5</view>'
'<view class="{{((((\'static\')+\' \'+\'_p\')+\' \'+((isActive)?\'active\':\'\'))+\' \'+errorClass)}}">5</view>'
)
assertCodegen(
'<p class="static" :class="[{ active: isActive, disabled: isDisabled }, errorClass]">52</p>',
'<view class="{{(((\'static _p\')+\' \'+(((isActive)?\'active\':\'\')+\' \'+((isDisabled)?\'disabled\':\'\')))+\' \'+errorClass)}}">52</view>'
'<view class="{{((((\'static\')+\' \'+\'_p\')+\' \'+(((isActive)?\'active\':\'\')+\' \'+((isDisabled)?\'disabled\':\'\')))+\' \'+errorClass)}}">52</view>'
)
assertCodegen(
'<div class="container" :class="computedClassObject">6</div>',
'<view class="{{((\'container _div\')+\' \'+computedClassObject)}}">6</view>'
'<view class="{{(((\'container\')+\' \'+\'_div\')+\' \'+computedClassObject)}}">6</view>'
)
// assertCodegen(
// `<div class="container" :class="computedClassObject">6</div>`,
......@@ -174,11 +174,15 @@ describe('mp:compiler-mp-alipay', () => {
)
assertCodegen(
'<p :class="classStr1 || classStr2" class="bg">9</p>',
'<view class="{{((\'bg _p\')+\' \'+(classStr1||classStr2))}}">9</view>'
'<view class="{{(((\'bg\')+\' \'+\'_p\')+\' \'+(classStr1||classStr2))}}">9</view>'
)
assertCodegen(
'<p class="static" :class="[{ active: isActive }, errorClass, [flex, \'flex-row\']]">10</p>',
'<view class="{{((((\'static _p\')+\' \'+((isActive)?\'active\':\'\'))+\' \'+errorClass)+\' \'+((flex)+\' \'+\'flex-row\'))}}">10</view>'
'<view class="{{(((((\'static\')+\' \'+\'_p\')+\' \'+((isActive)?\'active\':\'\'))+\' \'+errorClass)+\' \'+((flex)+\' \'+\'flex-row\'))}}">10</view>'
)
assertCodegen(
'<p class="a external-class c" :class="class1">hello world</p>',
'<view class="{{(((((\'a\')+\' \'+\'external-class\')+\' \'+\'c\')+\' \'+\'_p\')+\' \'+class1)}}">hello world</view>'
)
})
......
......@@ -15,6 +15,12 @@ function assertCodegen (template, templateCode, renderCode = 'with(this){}', opt
}
describe('mp:compiler-mp-baidu', () => {
it('generate class', () => {
assertCodegen(
'<view class="a external-class c" :class="class1">hello world</view>',
'<view class="{{[\'a\',\'external-class\',\'c\',class1]}}">hello world</view>'
)
})
it('generate v-for directive', () => {
assertCodegen(
'<view><view v-for="(item,index) in items" :key="index"></view></view>',
......
......@@ -20,6 +20,12 @@ function assertCodegen (template, templateCode, renderCode = 'with(this){}', opt
}
describe('mp:compiler-mp-kuaishou', () => {
it('generate class', () => {
assertCodegen(
'<view class="a external-class c" :class="class1">hello world</view>',
'<view class="{{[\'a\',\'external-class\',\'c\',class1]}}">hello world</view>'
)
})
it('generate scoped slot', () => {
assertCodegen(
'<foo><template slot-scope="{bar}">{{ bar.foo }}</template></foo>',
......
const compiler = require('../lib')
function assertCodegen (template, templateCode, renderCode = 'with(this){}', options = {}) {
const compiler = require('../lib')
function assertCodegen (template, templateCode, renderCode = 'with(this){}', options = {}) {
const res = compiler.compile(template, {
resourcePath: 'test.wxml',
mp: Object.assign({
minified: true,
isTest: true,
platform: 'mp-qq'
}, options)
})
expect(res.template).toBe(templateCode)
expect(res.render).toBe(renderCode)
}
resourcePath: 'test.wxml',
mp: Object.assign({
minified: true,
isTest: true,
platform: 'mp-qq'
}, options)
})
expect(res.template).toBe(templateCode)
expect(res.render).toBe(renderCode)
}
describe('mp:compiler-mp-qq', () => {
it('generate class', () => {
assertCodegen(
'<view class="a external-class c" :class="class1">hello world</view>',
'<view class="{{[\'a\',\'external-class\',\'c\',class1]}}">hello world</view>'
)
})
it('generate text trim', () => {
assertCodegen(
'<text>\nN: {{title}}\n′</text>',
......@@ -33,5 +39,5 @@ describe('mp:compiler-mp-qq', () => {
我的第二行2{{title}}</text>`,
'<text>{{"我是第一行3\\\\n 我的第二行2"+title}}</text>'
)
})
})
})
......@@ -36,27 +36,27 @@ describe('mp:compiler-mp-toutiao', () => {
)
assertCodegen(
'<p class="static" :class="{ active: isActive, \'text-danger\': hasError }">2</p>',
'<view class="{{(((\'static _p\')+\' \'+((isActive)?\'active\':\'\'))+\' \'+((hasError)?\'text-danger\':\'\'))}}">2</view>'
'<view class="{{((((\'static\')+\' \'+\'_p\')+\' \'+((isActive)?\'active\':\'\'))+\' \'+((hasError)?\'text-danger\':\'\'))}}">2</view>'
)
assertCodegen(
'<p class="static" :class="[activeClass, errorClass]">3</p>',
'<view class="{{(((\'static _p\')+\' \'+activeClass)+\' \'+errorClass)}}">3</view>'
'<view class="{{((((\'static\')+\' \'+\'_p\')+\' \'+activeClass)+\' \'+errorClass)}}">3</view>'
)
assertCodegen(
'<p class="static" :class="[isActive ? activeClass : \'\', errorClass]">4</p>',
'<view class="{{(((\'static _p\')+\' \'+(isActive?activeClass:\'\'))+\' \'+errorClass)}}">4</view>'
'<view class="{{((((\'static\')+\' \'+\'_p\')+\' \'+(isActive?activeClass:\'\'))+\' \'+errorClass)}}">4</view>'
)
assertCodegen(
'<p class="static" :class="[{ active: isActive }, errorClass]">5</p>',
'<view class="{{(((\'static _p\')+\' \'+((isActive)?\'active\':\'\'))+\' \'+errorClass)}}">5</view>'
'<view class="{{((((\'static\')+\' \'+\'_p\')+\' \'+((isActive)?\'active\':\'\'))+\' \'+errorClass)}}">5</view>'
)
assertCodegen(
'<p class="static" :class="[{ active: isActive, disabled: isDisabled }, errorClass]">52</p>',
'<view class="{{(((\'static _p\')+\' \'+(((isActive)?\'active\':\'\')+\' \'+((isDisabled)?\'disabled\':\'\')))+\' \'+errorClass)}}">52</view>'
'<view class="{{((((\'static\')+\' \'+\'_p\')+\' \'+(((isActive)?\'active\':\'\')+\' \'+((isDisabled)?\'disabled\':\'\')))+\' \'+errorClass)}}">52</view>'
)
assertCodegen(
'<div class="container" :class="computedClassObject">6</div>',
'<view class="{{((\'container _div\')+\' \'+computedClassObject)}}">6</view>'
'<view class="{{(((\'container\')+\' \'+\'_div\')+\' \'+computedClassObject)}}">6</view>'
)
// assertCodegen(
// `<div class="container" :class="computedClassObject">6</div>`,
......@@ -73,11 +73,15 @@ describe('mp:compiler-mp-toutiao', () => {
)
assertCodegen(
'<p :class="classStr1 || classStr2" class="bg">9</p>',
'<view class="{{((\'bg _p\')+\' \'+(classStr1||classStr2))}}">9</view>'
'<view class="{{(((\'bg\')+\' \'+\'_p\')+\' \'+(classStr1||classStr2))}}">9</view>'
)
assertCodegen(
'<p class="static" :class="[{ active: isActive }, errorClass, [flex, \'flex-row\']]">10</p>',
'<view class="{{((((\'static _p\')+\' \'+((isActive)?\'active\':\'\'))+\' \'+errorClass)+\' \'+((flex)+\' \'+\'flex-row\'))}}">10</view>'
'<view class="{{(((((\'static\')+\' \'+\'_p\')+\' \'+((isActive)?\'active\':\'\'))+\' \'+errorClass)+\' \'+((flex)+\' \'+\'flex-row\'))}}">10</view>'
)
assertCodegen(
'<p class="a external-class c" :class="class1">hello world</p>',
'<view class="{{(((((\'a\')+\' \'+\'external-class\')+\' \'+\'c\')+\' \'+\'_p\')+\' \'+class1)}}">hello world</view>'
)
})
......
......@@ -20,6 +20,12 @@ function assertCodegen (template, templateCode, renderCode = 'with(this){}', opt
}
describe('mp:compiler-mp-weixin', () => {
it('generate class', () => {
assertCodegen(
'<view class="a external-class c" :class="class1">hello world</view>',
'<view class="{{[\'a\',\'external-class\',\'c\',class1]}}">hello world</view>'
)
})
it('generate scoped slot', () => {
assertCodegen(
'<foo><template slot-scope="{bar}">{{ bar.foo }}</template></foo>',
......@@ -142,6 +148,14 @@ describe('mp:compiler-mp-weixin', () => {
scopedSlotsCompiler: 'augmented'
}
)
assertCodegen(
'<my-component><template v-slot="{item}">{{item}}<template></my-component>',
'<my-component vue-id="551070e6-1" bind:__l="__l" vue-slots="{{[\'default\']}}"><block><block wx:if="{{$root.m0}}">{{$root.m1}}</block></block></my-component>',
'with(this){var m0=$hasScopedSlotsParams("551070e6-1");var m1=m0?$getScopedSlotsParams("551070e6-1","default","item"):null;$mp.data=Object.assign({},{$root:{m0:m0,m1:m1}})}',
{
scopedSlotsCompiler: 'augmented'
}
)
assertCodegen(
'<my-component><template v-slot="item">{{getValue(item.text)}}<template></my-component>',
'<my-component vue-id="551070e6-1" bind:__l="__l" vue-slots="{{[\'default\']}}"><block><block wx:if="{{$root.m0}}">{{$root.m1}}</block></block></my-component>',
......
......@@ -8,9 +8,9 @@ function processClassArrayExpressionElements (classArrayExpression) {
let binaryExpression
classArrayExpression.elements.forEach(expr => {
if (t.isArrayExpression(expr)) {
expr = processClassArrayExpressionElements(expr)
}
if (t.isArrayExpression(expr)) {
expr = processClassArrayExpressionElements(expr)
}
if (!binaryExpression) {
binaryExpression = t.parenthesizedExpression(expr)
} else {
......@@ -31,9 +31,10 @@ function processClassArrayExpressionElements (classArrayExpression) {
function processStaticClass (classArrayExpression, staticClassPath, state) {
if (staticClassPath) {
classArrayExpression.elements.unshift(
t.stringLiteral(staticClassPath.node.value.value)
)
const staticClassPathArr = staticClassPath.node.value.value.split(' ')
for (let len = staticClassPathArr.length, index = len - 1; index >= 0; index--) {
classArrayExpression.elements.unshift(t.stringLiteral(staticClassPathArr[index]))
}
staticClassPath.remove()
}
if (
......@@ -135,4 +136,4 @@ module.exports = function processClass (paths, path, state) {
}
}
return []
}
}
......@@ -64,7 +64,7 @@ module.exports = function getResolveScopedSlots (parent, state) {
updateIds(vueId, slot, params.node.name)
}
const fnBody = fn.get('value.body')
if (needSlotMode(fnBody, ids)) {
if (state.options.scopedSlotsCompiler === 'augmented' || needSlotMode(fnBody, ids)) {
if (replaceId(fnBody, ids)) {
const orgin = fnBody.get('body.0.argument')
const elements = orgin.get('elements')
......
......@@ -549,6 +549,7 @@ function FLEW_WRAP_VALIDATOR (v) {
var PROP_NAME_GROUPS = {
boxModel: {
display: genEnumValidator(['flex']),
width: LENGTH_VALIDATOR,
height: LENGTH_VALIDATOR,
overflow: genEnumValidator(['hidden']),
......
......@@ -8,7 +8,8 @@
"es6": false,
"postcss": false,
"minified": false,
"newFeature": true
"newFeature": true,
"nodeModules": false
},
"compileType": "miniprogram",
"libVersion": "1.6.3",
......@@ -32,4 +33,4 @@
"list": []
}
}
}
}
......@@ -51,7 +51,7 @@ export const showToast = {
icon: {
default: 'success',
validator (icon, params) {
if (['success', 'loading', 'none'].indexOf(icon) === -1) {
if (['success', 'loading', 'error', 'none'].indexOf(icon) === -1) {
params.icon = 'success'
}
}
......@@ -122,4 +122,4 @@ export const showActionSheet = {
popover: {
type: Object
}
}
}
......@@ -178,10 +178,28 @@ export default {
})
},
_onInput ($event, force) {
let outOfMaxlength = false
if (this.composing) {
return
}
// type="number" 不支持 maxlength 属性,因此需要主动限制长度。
if (this.inputType === 'number') {
const maxlength = parseInt(this.maxlength, 10)
if (maxlength > 0 && $event.target.value.length > maxlength) {
// 输入前字符长度超出范围,则不触发input,且将值还原
// 否则截取一定长度且触发input
if (this.cachedValue.length === maxlength) {
this.valueSync = this.cachedValue
outOfMaxlength = true
} else {
$event.target.value = $event.target.value.slice(0, maxlength)
this.valueSync = $event.target.value
}
}
}
if (~NUMBER_TYPES.indexOf(this.type)) {
// 在输入 - 负号 的情况下,event.target.value没有值,但是会触发校验 false
this.valid = this.$refs.input.validity && this.$refs.input.validity.valid
......@@ -200,16 +218,7 @@ export default {
}
}
// type="number" 不支持 maxlength 属性,因此需要主动限制长度。
if (this.inputType === 'number') {
const maxlength = parseInt(this.maxlength, 10)
if (maxlength > 0 && $event.target.value.length > maxlength) {
$event.target.value = $event.target.value.slice(0, maxlength)
this.valueSync = $event.target.value
// 字符长度超出范围不触发 input 事件
return
}
}
if (outOfMaxlength) return
this.$triggerInput($event, Object.assign({
value: this.valueSync
......
......@@ -270,6 +270,7 @@ uni-textarea[hidden] {
position: relative;
width: 100%;
height: 100%;
min-height: inherit;
}
.uni-textarea-placeholder,
.uni-textarea-line,
......
......@@ -64,6 +64,10 @@ body {
content: "\EA08";
}
.uni-icon-error:before {
content: "\EA0B";
}
.uni-loading,
uni-button[loading]:before {
background: transparent url("data:image/svg+xml;base64, PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgxMDB2MTAwSDB6Ii8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTlFOUU5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTMwKSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iIzk4OTY5NyIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgzMCAxMDUuOTggNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjOUI5OTlBIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDYwIDc1Ljk4IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0EzQTFBMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA2NSA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNBQkE5QUEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoMTIwIDU4LjY2IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0IyQjJCMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgxNTAgNTQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjQkFCOEI5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDE4MCA1MCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDMkMwQzEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTE1MCA0NS45OCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDQkNCQ0IiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTEyMCA0MS4zNCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNEMkQyRDIiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDM1IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0RBREFEQSIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgtNjAgMjQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTJFMkUyIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKC0zMCAtNS45OCA2NSkiLz48L3N2Zz4=") no-repeat;
......
......@@ -117,6 +117,7 @@ export default {
}, 100)
this.$watch('value', valueChange)
this.__triggerInput = throttle(($event, detail) => {
this.__valueChange.cancel()
this.$emit('update:value', detail.value)
this.$trigger('input', $event, detail)
}, 100)
......
......@@ -188,6 +188,9 @@ export default {
}
el.addEventListener('blur', () => {
// 在iOS设备上,手动调用uni.hideKeyboard(),键盘收起并且触发blur,但实际并没有blur。
// 此时如果再点击页面其他地方会重新聚焦,此处做处理
el.blur()
focus = false
onKeyboardHide()
})
......
import {
wgs84togcj02,
gcj02towgs84
gcj02towgs84,
warpPlusErrorCallback
} from '../util'
import {
......@@ -53,6 +54,7 @@ export function getLocation ({
geocode = false,
altitude = false
} = {}, callbackId) {
const errorCallback = warpPlusErrorCallback(callbackId, 'getLocation')
plus.geolocation.getCurrentPosition(
position => {
getLocationSuccess(type, position, callbackId)
......@@ -63,10 +65,7 @@ export function getLocation ({
getLocationSuccess(type, e, callbackId)
return
}
invoke(callbackId, {
errMsg: 'getLocation:fail ' + e.message
})
errorCallback(e)
}, {
geocode: geocode,
enableHighAccuracy: altitude
......
......@@ -43,7 +43,7 @@ export function showToast ({
})
toast = true
} else {
if (icon && !~['success', 'loading', 'none'].indexOf(icon)) {
if (icon && !~['success', 'loading', 'error', 'none'].indexOf(icon)) {
icon = 'success'
}
const waitingOptions = {
......@@ -70,11 +70,11 @@ export function showToast ({
interval: duration
}
} else {
if (icon === 'success') {
if (icon !== 'loading') {
waitingOptions.loading = {
display: 'block',
height: '55px',
icon: '__uniappsuccess.png',
icon: icon === 'success' ? '__uniappsuccess.png' : '__uniapperror.png',
interval: duration
}
}
......
......@@ -174,13 +174,13 @@ export default {
},
header: {
type: Object,
defult () {
default () {
return {}
}
},
advanced: {
type: Array,
defult () {
default () {
return []
}
}
......
......@@ -72,6 +72,10 @@ body {
content: "\EA08";
}
.uni-icon-error:before {
content: "\EA0B";
}
.uni-loading,
uni-button[loading]:before {
background: transparent url("data:image/svg+xml;base64, PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgxMDB2MTAwSDB6Ii8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTlFOUU5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTMwKSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iIzk4OTY5NyIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgzMCAxMDUuOTggNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjOUI5OTlBIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDYwIDc1Ljk4IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0EzQTFBMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA2NSA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNBQkE5QUEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoMTIwIDU4LjY2IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0IyQjJCMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgxNTAgNTQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjQkFCOEI5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDE4MCA1MCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDMkMwQzEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTE1MCA0NS45OCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDQkNCQ0IiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTEyMCA0MS4zNCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNEMkQyRDIiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDM1IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0RBREFEQSIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgtNjAgMjQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTJFMkUyIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKC0zMCAtNS45OCA2NSkiLz48L3N2Zz4=") no-repeat;
......
......@@ -52,7 +52,7 @@ export default {
icon: {
default: 'success',
validator (value) {
return ['success', 'loading', 'none'].indexOf(value) !== -1
return ['success', 'loading', 'error', 'none'].indexOf(value) !== -1
}
},
image: {
......@@ -80,6 +80,9 @@ export default {
if (this.icon === 'loading') {
return 'uni-loading'
}
if (this.icon === 'error') {
return 'uni-icon-error'
}
return ''
}
},
......@@ -168,6 +171,11 @@ uni-toast .uni-icon_toast.uni-icon-success-no-circle:before {
font-size: 55px;
}
uni-toast .uni-icon_toast.uni-icon-error:before {
color: #ffffff;
font-size: 50px;
}
uni-toast .uni-icon_toast.uni-loading {
margin: 20px 0 0;
width: 38px;
......
......@@ -78,9 +78,9 @@ class AdConfig {
_doCallback (adpid, success, fail) {
AdConfig.IS++
var data = this._adConfig
if (data[adpid]) {
success(data[adpid])
var { a, b } = this._adConfig
if (a[adpid]) {
success(b, a[adpid])
} else {
fail(this.ERROR_INVALID_ADPID)
}
......@@ -95,7 +95,7 @@ class AdConfig {
uni.request({
url: this.URL,
method: 'GET',
timeout: 5000,
timeout: 8000,
data: {
d: location.hostname,
a: adpid
......@@ -150,11 +150,11 @@ class AdConfig {
}
}
Object.assign(AdConfig.prototype, {
URL: '//qy5y9ee9ch8r87pg72w5.dcloud.net.cn/hcs',
URL: 'https://hac1.dcloud.net.cn/ah5',
KEY: 'uni_app_ad_config',
CACHE_TIME: 1000 * 60 * 10,
ERROR_INVALID_ADPID: {
'-5002': '无效adpid'
'-5002': 'invalid adpid'
}
})
......@@ -234,17 +234,73 @@ class AdReport {
}
}
Object.assign(AdReport.prototype, {
URL: '//hp66hwpyev7yx2hfughh.dcloud.net.cn/ahl',
URL: 'https://has1.dcloud.net.cn/ahl',
KEY: 'uni_app_ad_guid'
})
const adProvider = {
hx: 'zswx_hx',
ky: 'zswx_ky'
class AdScript {
static get instance () {
if (this._instance == null) {
this._instance = new AdScript()
}
return this._instance
}
constructor () {
this._instance = null
this._callback = {}
this._cache = {}
}
load (data, success, fail) {
const provider = data.provider
if (this._cache[provider] === undefined) {
this.loadScript(data)
}
if (this._cache[provider] === 1) {
success()
} else {
if (!this._callback[provider]) {
this._callback[provider] = []
}
this._callback[provider].push({
success,
fail
})
}
}
loadScript (data) {
const provider = data.provider
this._cache[provider] = 0
var ads = document.createElement('script')
ads.setAttribute('id', 'uniad_provider' + provider)
const script = data.script
for (const var1 in script) {
ads.setAttribute(var1, script[var1])
}
ads.onload = () => {
this._cache[provider] = 1
this._callback[provider].forEach(({ success }) => {
success()
})
this._callback[provider].length = 0
}
ads.onerror = (err) => {
this._cache[provider] = undefined
this._callback[provider].forEach(({ fail }) => {
fail(err)
})
this._callback[provider].length = 0
}
document.body.append(ads)
}
}
const CHECK_RENDER_DELAY = 1000
const CHECK_RENDER_RETRY = 3
const CHECK_RENDER_RETRY = 5
const DEFAULT_WIDESCREEN_WIDTH = 750
export default {
name: 'Ad',
......@@ -253,6 +309,14 @@ export default {
adpid: {
type: [Number, String],
default: ''
},
adpidWidescreen: {
type: [Number, String],
default: ''
},
widescreenWidth: {
type: [Number, String],
default: DEFAULT_WIDESCREEN_WIDTH
}
},
watch: {
......@@ -260,19 +324,25 @@ export default {
if (val) {
this._loadData(val)
}
},
adpidWidescreen (val) {
if (val) {
this._loadData(val)
}
}
},
mounted () {
this._p = {}
this._pl = []
this._pd = {}
this._pi = 0
this._checkTimer = null
this._checkTimerCount = 0
this._isWidescreen = this.$refs.container.clientWidth > parseInt(this.widescreenWidth)
this._loadData()
AdReport.instance.get({
h: __uniConfig.compilerVersion,
a: this.adpid,
at: 30,
at: -3,
ic: AdConfig.IC,
is: AdConfig.IS
})
......@@ -286,17 +356,18 @@ export default {
this._report(41)
},
_reset () {
this._p = {}
this._pl = []
this._pd = {}
this._pi = 0
this._clearCheckTimer()
this.$refs.container.innerHTML = ''
},
_loadData (adpid) {
this._reset()
AdConfig.instance.get(adpid || this.adpid, (data) => {
this._pd = data
this._pl = data.psp.split(',')
const aid = adpid || (this._isWidescreen ? this.adpidWidescreen : this.adpid)
AdConfig.instance.get(aid, (b, a) => {
this._b = b
this._pl = a
this._renderAd()
}, (err) => {
this.$trigger('error', {}, err)
......@@ -307,56 +378,37 @@ export default {
return
}
var ap = this._pl[this._pi]
var data = this._pd[ap]
switch (ap) {
case adProvider.hx:
this._renderHX(data)
break
case adProvider.ky:
this._renderKY(data)
break
}
},
_renderNext () {
if (this._pi >= this._pl.length - 1) {
return
}
const data = this._pl[this._pi]
const providerId = data.a1
this._b[providerId].provider = providerId
this._pi++
this._renderAd()
AdScript.instance.load(this._b[providerId], () => {
this._renderAdView(this._b[providerId], data)
}, (err) => {
this.$trigger('error', {}, err)
})
},
_renderHX (data) {
if (document.querySelector('#' + adProvider.hx)) {
this._renderNext()
return
}
var ad = document.createElement('script')
ad.src = data.src || data.url
_renderAdView (provider, data) {
var randomId = this._randomId()
var adView = document.createElement('div')
adView.setAttribute('id', adProvider.hx)
adView.appendChild(ad)
adView.setAttribute('class', randomId)
this.$refs.container.innerHTML = ''
this.$refs.container.append(adView)
let bindThis = window
provider.s.split('.').reduce((total, currentValue) => {
bindThis = total
return total[currentValue]
}, window).bind(bindThis)(data.a2, randomId, 2)
this._startCheckTimer()
},
_renderKY (data) {
var randomId = this._randomId()
var ad = document.createElement('script')
ad.src = (data.src || data.url) + '&_ct=' + randomId
var adView = document.createElement('div')
adView.setAttribute('id', randomId)
adView.appendChild(ad)
this.$refs.container.innerHTML = ''
this.$refs.container.append(adView)
_renderNext () {
if (this._pi >= this._pl.length - 1) {
return
}
this._startCheckTimer()
this._pi++
this._renderAd()
},
_checkRender () {
var hasContent = (this.$refs.container.children.length > 0 && this.$refs.container.clientHeight > 40)
......@@ -388,27 +440,18 @@ export default {
}
},
_report (type) {
var taskId = ''
if (this._pl.length > 0 && this._pi < this._pl.length) {
var data = this._pd[this._pl[this._pi]]
if (data) {
taskId = data.task_id
}
}
AdReport.instance.get({
h: __uniConfig.compilerVersion,
a: this.adpid,
t: taskId,
at: type
})
},
_randomId () {
var result = ''
for (let i = 0; i < 2; i++) {
for (let i = 0; i < 4; i++) {
result += (65536 * (1 + Math.random()) | 0).toString(16).substring(1)
}
return result
return '_u' + result
}
}
}
......
......@@ -64,6 +64,10 @@ body {
content: "\EA08";
}
.uni-icon-error:before {
content: "\EA0B";
}
.uni-loading,
uni-button[loading]:before {
background: transparent url("data:image/svg+xml;base64, PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgxMDB2MTAwSDB6Ii8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTlFOUU5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTMwKSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iIzk4OTY5NyIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgzMCAxMDUuOTggNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjOUI5OTlBIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDYwIDc1Ljk4IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0EzQTFBMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA2NSA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNBQkE5QUEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoMTIwIDU4LjY2IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0IyQjJCMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgxNTAgNTQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjQkFCOEI5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDE4MCA1MCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDMkMwQzEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTE1MCA0NS45OCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDQkNCQ0IiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTEyMCA0MS4zNCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNEMkQyRDIiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDM1IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0RBREFEQSIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgtNjAgMjQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTJFMkUyIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKC0zMCAtNS45OCA2NSkiLz48L3N2Zz4=") no-repeat;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册