重写框架组件机制;重写pages组件;优化request插件
parent
b5d4ee1cc1
commit
9848dd63bd
Binary file not shown.
|
@ -217,7 +217,7 @@ define(['yua', 'lib/drag', 'css!./skin/def'], function(yua){
|
|||
layerObj[conf].show = true
|
||||
|
||||
if(!yua.vmodels[conf]){
|
||||
yua.define(layerObj[conf].obj.init)
|
||||
yua(layerObj[conf].obj.init)
|
||||
}
|
||||
|
||||
yua.scan(layerDom[conf][1])
|
||||
|
@ -386,13 +386,13 @@ define(['yua', 'lib/drag', 'css!./skin/def'], function(yua){
|
|||
document.body.appendChild(layerDom[this.init.$id][0])
|
||||
//仅在允许点击遮罩时,初始化控制器,减少资源消耗
|
||||
if(this.init.shadeClose){
|
||||
yua.define(this.cInit)
|
||||
yua(this.cInit)
|
||||
yua.scan(layerDom[this.init.$id][0])
|
||||
}
|
||||
}
|
||||
|
||||
document.body.appendChild(layerDom[this.init.$id][1])
|
||||
yua.define(this.init)
|
||||
yua(this.init)
|
||||
yua.scan(layerDom[this.init.$id][1])
|
||||
return this
|
||||
},
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,57 +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-1</title>
|
||||
<meta name="description" content="">
|
||||
<meta name="keywords" content="">
|
||||
<link href="../css/base.min.css" rel="stylesheet">
|
||||
<style>
|
||||
.do-mod-test {width:800px;height:100px;margin:30px;padding:30px;border:1px solid #ddd;}
|
||||
.do-mod-test .date-start {width:100%;height:35px;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
||||
<div class="do-mod-test" ms-controller="test">
|
||||
|
||||
<div class="pages" ms-widget="pages" data-pages-skin="red"></div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<script src="../avalon.modern.min.js"></script>
|
||||
<script>
|
||||
|
||||
;(function(A){
|
||||
|
||||
require(['./pages/pages'], function(){
|
||||
|
||||
var test = A.define({
|
||||
$id: 'test',
|
||||
aa: '112233',
|
||||
pages: {
|
||||
callback: function(id){
|
||||
console.log(id);
|
||||
},
|
||||
total: 30
|
||||
}
|
||||
});
|
||||
|
||||
A.scan();
|
||||
|
||||
})
|
||||
|
||||
|
||||
})(avalon);
|
||||
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -1,34 +1,10 @@
|
|||
.widget-pages .do-ui-pages {width:100%;height:30px;text-align:center;}
|
||||
.widget-pages.h20 .do-ui-pages {height:20px;}
|
||||
.widget-pages .do-ui-pages a {display:inline-block;width:auto;min-width:20px;height:30px;padding:0 10px;margin:0 3px;line-height:28px;}
|
||||
.widget-pages .do-ui-pages .curr,.widget-pages .do-ui-pages .more {line-height:30px;padding:0;border:none!important;background:none!important;color:#666!important;cursor:default}
|
||||
.widget-pages.h20 .do-ui-pages a {min-width:10px;height:20px;line-height:18px;}
|
||||
.widget-pages.h20 .do-ui-pages .curr,.widget-pages.h20 .do-ui-pages .more {line-height:20px;}
|
||||
.do-pages {width:100%;height:auto;text-align:center;font-size:13px;}
|
||||
.do-pages a.normal,.do-pages a.disabled,.do-pages a.curr {display:inline-block;width:auto;height:30px;padding:0 10px;margin:0 3px;line-height:30px;text-decoration:none;border-radius:3px;cursor:pointer;background:#6bb294;color:#fff;}
|
||||
.do-pages a.disabled,.do-pages a.curr {background:none;color:#666;cursor:default}
|
||||
.do-pages a.disabled {padding:0;}
|
||||
.do-pages a.curr {font-weight:bold;font-size:15px;color:#429572;}
|
||||
|
||||
.widget-pages .do-ui-pages .page-jump {display:inline-block;}
|
||||
.widget-pages .do-ui-pages .page-jump span,.widget-pages .do-ui-pages .page-jump input{display:inline-block;}
|
||||
.widget-pages .do-ui-pages .page-jump input {width:25px;height:18px;padding:0 3px;background:none;border:1px solid #ddd;}
|
||||
|
||||
.widget-pages.skin-default .do-ui-pages a {border:1px solid #ddd;background:#f3f3f3;color:#666;}
|
||||
.widget-pages.skin-default .do-ui-pages a:hover {border:1px solid #e3e3e3;background:#e3e3e3;color:#666;}
|
||||
.widget-pages.skin-default .do-ui-pages a:active {border:1px solid #ccc;background:#ccc;color:#666;}
|
||||
|
||||
.widget-pages.skin-blue .do-ui-pages a {border:1px solid #1b9af7;background:#1b9af7;color:#fff;}
|
||||
.widget-pages.skin-blue .do-ui-pages a:hover {border:1px solid #13b5ff;background:#13b5ff;color:#fff;}
|
||||
.widget-pages.skin-blue .do-ui-pages a:active {border:1px solid #1682cf;background:#1682cf;color:#fff;}
|
||||
|
||||
.widget-pages.skin-red .do-ui-pages a {border:1px solid #ff4351;background:#ff4351;color:#fff;}
|
||||
.widget-pages.skin-red .do-ui-pages a:hover {border:1px solid #ff7680;background:#ff7680;color:#fff;}
|
||||
.widget-pages.skin-red .do-ui-pages a:active {border:1px solid #f64c59;background:#f64c59;color:#fff;}
|
||||
|
||||
.widget-pages.skin-yellow .do-ui-pages a {border:1px solid #feae1b;background:#feae1b;color:#fff;}
|
||||
.widget-pages.skin-yellow .do-ui-pages a:hover {border:1px solid #fec04e;background:#fec04e;color:#fff;}
|
||||
.widget-pages.skin-yellow .do-ui-pages a:active {border:1px solid #f3ab26;background:#f3ab26;color:#fff;}
|
||||
|
||||
.widget-pages.skin-green .do-ui-pages a {border:1px solid #a5de37;background:#a5de37;color:#fff;}
|
||||
.widget-pages.skin-green .do-ui-pages a:hover {border:1px solid #b9e563;background:#b9e563;color:#fff;}
|
||||
.widget-pages.skin-green .do-ui-pages a:active {border:1px solid #a1d243;background:#a1d243;color:#fff;}
|
||||
|
||||
.widget-pages.skin-purple .do-ui-pages a {border:1px solid #7b72e9;background:#7b72e9;color:#fff;}
|
||||
.widget-pages.skin-purple .do-ui-pages a:hover {border:1px solid #a49ef0;background:#a49ef0;color:#fff;}
|
||||
.widget-pages.skin-purple .do-ui-pages a:active {border:1px solid #827ae1;background:#827ae1;color:#fff;}
|
||||
.do-pages a.normal:hover{background:#429572;}
|
||||
.do-pages a.normal:active{background:#64bf99;}
|
||||
.do-pages .input-box,.do-pages .input-box span,.do-pages .input-box input {display:inline-block}
|
||||
.do-pages .input-box input {width:25px;height:20px;padding:0 3px;background:#fff;border:1px solid #ddd}
|
|
@ -0,0 +1,33 @@
|
|||
<div class="do-pages do-fn-noselect" :class="{{'skin-' + skin}}">
|
||||
<a class="normal"
|
||||
:if="curr > 1 && !simpleMode"
|
||||
:attr="{href: $setUrl(1)}"
|
||||
:text="btns.home"
|
||||
:click="$jump($event, 1)"></a>
|
||||
<a class="normal"
|
||||
:if="curr > 1"
|
||||
:attr="{href: $setUrl(curr - 1)}"
|
||||
:text="btns.prev"
|
||||
:click="$jump($event, curr - 1)"></a>
|
||||
<a :if-loop="!simpleMode || curr === el"
|
||||
:repeat="pageList"
|
||||
:attr="{href: $setUrl(el)}"
|
||||
:class="{normal: curr !== el && '...' !== el, disabled: '...' === el, curr: curr === el}"
|
||||
:text="el"
|
||||
:click="$jump($event, el)"></a>
|
||||
<a class="normal"
|
||||
:if="curr < total"
|
||||
:attr="{href: $setUrl(curr + 1)}"
|
||||
:click="$jump($event, curr + 1)">{{btns.next}}</a>
|
||||
<a class="normal"
|
||||
:if="curr < total && !simpleMode"
|
||||
:attr="{href: $setUrl(total)}"
|
||||
:click="$jump($event, total)">{{btns.end}}</a>
|
||||
|
||||
<div class="input-box" :if="inputJump && !simpleMode">
|
||||
<span>共{{total}}页,跳转到第</span>
|
||||
<input type="text" :duplex-number="input" :keyup="$jump($event)">
|
||||
<span>页</span>
|
||||
<a class="normal" :attr="{href: $setUrl(input)}" :click="$jump($event, input)">确定</a>
|
||||
</div>
|
||||
</div>
|
|
@ -1,127 +1,111 @@
|
|||
define(["avalon","text!./pages.tpl","css!./pages.css"], function (av, tpl) {
|
||||
"use strict";
|
||||
define(["yua","text!./pages.htm", "css!./pages"], function(yua, tpl) {
|
||||
|
||||
var widget = av.ui.pages = function(ele, data, vms){
|
||||
//计算页码列表
|
||||
function calculate(vm){
|
||||
if (vm.total < 2)
|
||||
return vm.pageList.clear();
|
||||
|
||||
var opts = av.mix({}, data.pagesOptions);
|
||||
var height = opts.height || '',
|
||||
skin = opts.skin || 'default';
|
||||
var arr = [],
|
||||
mid = vm.curr < vm.max / 2 ? vm.max - vm.curr : Math.floor(vm.max / 2);
|
||||
|
||||
delete opts.skin;
|
||||
delete opts.height;
|
||||
opts.pages = []; //无论是否定义,都会清掉,有点暴力
|
||||
|
||||
opts.$id = data.pagesId;
|
||||
opts.$init = function(scan){
|
||||
ele.classList.add('widget-pages', 'skin-' + skin, 'do-fn-noselect');
|
||||
height && ele.classList.add(height);//非空时才添加,避免报错
|
||||
ele.innerHTML = tpl;
|
||||
calPages(Pager);
|
||||
scan()
|
||||
};
|
||||
opts.$remove = function() {
|
||||
ele.innerHTML = ''
|
||||
};
|
||||
opts.setUrl = function(id){
|
||||
if(!Pager.url || id === '...' || Pager.curr === id || id > Pager.total || id < 1)
|
||||
return 'javascript:;'
|
||||
return Pager.url.replace('{id}', id)
|
||||
};
|
||||
opts.onJump = function(event, id){
|
||||
event.preventDefault()
|
||||
id = id >> 0;
|
||||
jump(id, Pager);
|
||||
};
|
||||
opts.jumpPage = function(event){
|
||||
var pid = Pager.jumpTxt;
|
||||
if(pid > Pager.total)
|
||||
Pager.jumpTxt = Pager.total;
|
||||
|
||||
if(event.keyCode == 13)
|
||||
return jump(pid, Pager);
|
||||
if(vm.curr - mid > 1){
|
||||
arr.push('...')
|
||||
}
|
||||
|
||||
var Pager = av.define(opts);
|
||||
|
||||
|
||||
Pager.$watch('total', function(v, old){
|
||||
Pager.total = v >> 0 || 1; //自动转换成数字类型,防止传入的值为字符串时报错,如 '3'
|
||||
old = old >> 0;
|
||||
(v !== old) && calPages(Pager);
|
||||
})
|
||||
|
||||
Pager.$watch('curr', function(v, old){
|
||||
v = v >> 0 || 1;//自动转换成数字类型
|
||||
old = old >> 0;
|
||||
Pager.curr = v;
|
||||
(v !== old) && calPages(Pager);
|
||||
})
|
||||
|
||||
return Pager;
|
||||
for (var i = vm.curr - mid; i < vm.curr + mid + 1 && i <= vm.total; i++){
|
||||
if(i > 0){
|
||||
arr.push(i)
|
||||
}
|
||||
}
|
||||
if(vm.curr + mid < vm.total){
|
||||
arr.push('...')
|
||||
}
|
||||
vm.pageList = arr
|
||||
}
|
||||
|
||||
/**
|
||||
* [calPages 计算要显示的页码数组,并赋值给pages]
|
||||
* @param {[type]} Pager [分页vm对象]
|
||||
*/
|
||||
function calPages(Pager){
|
||||
if(Pager.total < 2){
|
||||
Pager.pages.clear();
|
||||
return;
|
||||
function update(pid, vm) {
|
||||
if(pid < 1){
|
||||
pid = vm.input = 1
|
||||
}
|
||||
|
||||
var pageArr = [], len = (Pager.curr < Pager.max / 2) ? Pager.max : Math.floor(Pager.max / 2);
|
||||
|
||||
if(Pager.curr - len > 1)
|
||||
pageArr.push('...');
|
||||
|
||||
for(var i = Pager.curr - len; i < Pager.curr + len && i <= Pager.total; i++){
|
||||
if(i > 0)
|
||||
pageArr.push(i)
|
||||
if(pid > vm.total){
|
||||
pid = vm.input = vm.total
|
||||
}
|
||||
if(pid !== vm.curr){
|
||||
vm.curr = vm.input = pid
|
||||
vm.$onJump(pid)
|
||||
}
|
||||
if(Pager.curr + len < Pager.total)
|
||||
pageArr.push('...');
|
||||
|
||||
Pager.pages = pageArr;
|
||||
}
|
||||
|
||||
/**
|
||||
* [jump 内部跳转函数]
|
||||
* @param {[type]} id [要跳转去的页码]
|
||||
* @param {[type]} Pager [分页vm对象]
|
||||
*/
|
||||
function jump(id, Pager){
|
||||
if(id < 1)
|
||||
id = Pager.jumpTxt = 1;
|
||||
if(id > Pager.total)
|
||||
id = Pager.jumpTxt = Pager.total;
|
||||
if(Pager.curr === id)
|
||||
return;
|
||||
return yua.component('pages', {
|
||||
$template: tpl,
|
||||
$init: function(vm) {
|
||||
|
||||
Pager.curr = Pager.jumpTxt = id;
|
||||
Pager.callback && Pager.callback(id);
|
||||
calculate(vm)
|
||||
|
||||
calPages(Pager);
|
||||
}
|
||||
vm.$setUrl = function(val) {
|
||||
if(!vm.url
|
||||
|| '...' === val
|
||||
|| vm.curr === val
|
||||
|| val > vm.total
|
||||
|| 1 > val) {
|
||||
|
||||
//默认参数
|
||||
widget.defaults = {
|
||||
curr: 1, //当前页
|
||||
total: 1, // 总页数默认为1,即页面上不会显示分页条
|
||||
max: 5, // 最多显示页码数
|
||||
url: 'javascript:;', //页码按钮上的url,如'#!/page-{id}.html',其中{id}会被替换成该页码
|
||||
pageJump: !1, //是否显示跳转表单
|
||||
simpleMode: !1, //简单模式,即只有上一页和下一页
|
||||
jumpTxt: 1, //跳转输入框显示的页码
|
||||
pages: [], //页码数组
|
||||
btns: { //除页码本身外的按钮上的字符
|
||||
prev: '<<',
|
||||
next: '>>',
|
||||
home: '首页',
|
||||
end: '末页'
|
||||
return 'javascript:;'
|
||||
}else{
|
||||
return vm.url.replace('{id}', val)
|
||||
}
|
||||
}
|
||||
|
||||
vm.$jump = function(ev, val) {
|
||||
if ('...' !== val) {
|
||||
var link = this.getAttribute('href') || this.getAttribute('xlink:href')
|
||||
|
||||
if (val !== void 0){
|
||||
if('javascript:;' !== link){
|
||||
location.hash = link
|
||||
}
|
||||
var pid = val >> 0;
|
||||
update(pid, vm)
|
||||
} else {
|
||||
vm.input = vm.input >>> 0 || 1;
|
||||
if(13 == ev.keyCode){
|
||||
update(vm.input, vm)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
vm.$watch('curr', function(val, old) {
|
||||
val = (val >>> 0) || 1
|
||||
old = old >>> 0
|
||||
if(val !== old){
|
||||
calculate(vm)
|
||||
}
|
||||
})
|
||||
|
||||
vm.$watch('total', function(val, old) {
|
||||
val = (val >>> 0) || 1
|
||||
old = old >>> 0
|
||||
if(val !== old){
|
||||
calculate(vm)
|
||||
}
|
||||
})
|
||||
},
|
||||
callback: null //点击页码/上/下/首/末页的回调,页码无效或者为当前页的时候不会触发
|
||||
}
|
||||
|
||||
|
||||
return av;
|
||||
})
|
||||
curr: 1,
|
||||
total: 1,
|
||||
max: 5,
|
||||
url: "javascript:;",
|
||||
inputJump: !1,
|
||||
simpleMode: !1,
|
||||
input: 1,
|
||||
pageList: [],
|
||||
btns: {
|
||||
prev: "<<",
|
||||
next: ">>",
|
||||
home: "首页",
|
||||
end: "末页"
|
||||
},
|
||||
$skipArray: ['max', 'btns', 'url'],
|
||||
$setUrl: yua.noop,
|
||||
$jump: yua.noop,
|
||||
$onJump: yua.noop
|
||||
})
|
||||
});
|
|
@ -1 +0,0 @@
|
|||
.widget-pages .do-ui-pages{width:100%;height:30px;text-align:center}.widget-pages.h20 .do-ui-pages{height:20px}.widget-pages .do-ui-pages a{display:inline-block;width:auto;min-width:20px;height:30px;padding:0 10px;margin:0 3px;line-height:28px}.widget-pages .do-ui-pages .curr,.widget-pages .do-ui-pages .more{line-height:30px;padding:0;border:none!important;background:none!important;color:#666!important;cursor:default}.widget-pages.h20 .do-ui-pages a{min-width:10px;height:20px;line-height:18px}.widget-pages.h20 .do-ui-pages .curr,.widget-pages.h20 .do-ui-pages .more{line-height:20px}.widget-pages .do-ui-pages .page-jump,.widget-pages .do-ui-pages .page-jump input,.widget-pages .do-ui-pages .page-jump span{display:inline-block}.widget-pages .do-ui-pages .page-jump input{width:25px;height:18px;padding:0 3px;background:0 0;border:1px solid #ddd}.widget-pages.skin-default .do-ui-pages a{border:1px solid #ddd;background:#f3f3f3;color:#666}.widget-pages.skin-default .do-ui-pages a:hover{border:1px solid #e3e3e3;background:#e3e3e3;color:#666}.widget-pages.skin-default .do-ui-pages a:active{border:1px solid #ccc;background:#ccc;color:#666}.widget-pages.skin-blue .do-ui-pages a{border:1px solid #1b9af7;background:#1b9af7;color:#fff}.widget-pages.skin-blue .do-ui-pages a:hover{border:1px solid #13b5ff;background:#13b5ff;color:#fff}.widget-pages.skin-blue .do-ui-pages a:active{border:1px solid #1682cf;background:#1682cf;color:#fff}.widget-pages.skin-red .do-ui-pages a{border:1px solid #ff4351;background:#ff4351;color:#fff}.widget-pages.skin-red .do-ui-pages a:hover{border:1px solid #ff7680;background:#ff7680;color:#fff}.widget-pages.skin-red .do-ui-pages a:active{border:1px solid #f64c59;background:#f64c59;color:#fff}.widget-pages.skin-yellow .do-ui-pages a{border:1px solid #feae1b;background:#feae1b;color:#fff}.widget-pages.skin-yellow .do-ui-pages a:hover{border:1px solid #fec04e;background:#fec04e;color:#fff}.widget-pages.skin-yellow .do-ui-pages a:active{border:1px solid #f3ab26;background:#f3ab26;color:#fff}.widget-pages.skin-green .do-ui-pages a{border:1px solid #a5de37;background:#a5de37;color:#fff}.widget-pages.skin-green .do-ui-pages a:hover{border:1px solid #b9e563;background:#b9e563;color:#fff}.widget-pages.skin-green .do-ui-pages a:active{border:1px solid #a1d243;background:#a1d243;color:#fff}.widget-pages.skin-purple .do-ui-pages a{border:1px solid #7b72e9;background:#7b72e9;color:#fff}.widget-pages.skin-purple .do-ui-pages a:hover{border:1px solid #a49ef0;background:#a49ef0;color:#fff}.widget-pages.skin-purple .do-ui-pages a:active{border:1px solid #827ae1;background:#827ae1;color:#fff}
|
|
@ -1 +0,0 @@
|
|||
define(["avalon","text!./pages.tpl","css!./pages.css"],function(t,a){function e(t){if(t.total<2)return void t.pages.clear();var a=[],e=t.curr<t.max/2?t.max:Math.floor(t.max/2);t.curr-e>1&&a.push("...");for(var r=t.curr-e;r<t.curr+e&&r<=t.total;r++)r>0&&a.push(r);t.curr+e<t.total&&a.push("..."),t.pages=a}function r(t,a){1>t&&(t=a.jumpTxt=1),t>a.total&&(t=a.jumpTxt=a.total),a.curr!==t&&(a.curr=a.jumpTxt=t,a.callback&&a.callback(t),e(a))}var n=t.ui.pages=function(n,u){var c=t.mix({},u.pagesOptions),l=c.height||"",i=c.skin||"default";delete c.skin,delete c.height,c.pages=[],c.$id=u.pagesId,c.$init=function(t){n.classList.add("widget-pages","skin-"+i,"do-fn-noselect"),l&&n.classList.add(l),n.innerHTML=a,e(o),t()},c.$remove=function(){n.innerHTML=""},c.setUrl=function(t){return!o.url||"..."===t||o.curr===t||t>o.total||1>t?"javascript:;":o.url.replace("{id}",t)},c.onJump=function(t,a){t.preventDefault(),a>>=0,r(a,o)},c.jumpPage=function(t){var a=o.jumpTxt;return a>o.total&&(o.jumpTxt=o.total),13==t.keyCode?r(a,o):void 0};var o=t.define(c);return o.$watch("total",function(t,a){o.total=t>>0||1,a>>=0,t!==a&&e(o)}),o.$watch("curr",function(t,a){t=t>>0||1,a>>=0,o.curr=t,t!==a&&e(o)}),o};return n.defaults={curr:1,total:1,max:5,url:"javascript:;",pageJump:!1,simpleMode:!1,jumpTxt:1,pages:[],btns:{prev:"<<",next:">>",home:"首页",end:"末页"},callback:null},t});
|
|
@ -1,13 +0,0 @@
|
|||
<div class="do-ui-pages">
|
||||
<a class="rd3" ms-if="curr > 1 && !simpleMode" ms-attr="{href: setUrl(1)}" ms-click="onJump($event, 1)">{{btns.home}}</a>
|
||||
<a class="rd3" ms-if="curr > 1" ms-attr="{href: setUrl(curr - 1)}" ms-click="onJump($event, curr - 1)">{{btns.prev}}</a>
|
||||
<a class="rd3" ms-if-loop="!simpleMode || curr === el" ms-repeat="pages" ms-attr="{href: setUrl(el)}" ms-class="curr: curr === el" ms-class-1="more: '...' === el" ms-click="onJump($event, el)">{{el}}</a>
|
||||
<a class="rd3" ms-if="curr < total" ms-attr="{href: setUrl(curr + 1)}" ms-click="onJump($event, curr + 1)">{{btns.next}}</a>
|
||||
<a class="rd3" ms-if="curr < total && !simpleMode" ms-attr="{href: setUrl(total)}" ms-click="onJump($event, total)">{{btns.end}}</a>
|
||||
<div class="page-jump" ms-if="pageJump && !simpleMode">
|
||||
<span>共{{total}}页,跳转到第</span>
|
||||
<input type="text" ms-duplex-number="jumpTxt" ms-keyup="jumpPage($event)">
|
||||
<span>页</span>
|
||||
<a class="rd3" ms-attr="{href: setUrl(jumpTxt)}" ms-click="onJump($event, jumpTxt)">确定</a>
|
||||
</div>
|
||||
</div>
|
File diff suppressed because one or more lines are too long
|
@ -15,6 +15,7 @@ define(function(){
|
|||
url: (url + '').trim(),
|
||||
type: protocol || 'GET',
|
||||
form: '',
|
||||
data: {},
|
||||
headers: {},
|
||||
timeoutID: 0,
|
||||
uuid: Math.random().toString(16).substr(2)
|
||||
|
|
442
js/yua-touch.js
442
js/yua-touch.js
|
@ -8,12 +8,6 @@
|
|||
(function(global, factory) {
|
||||
|
||||
if (typeof module === "object" && typeof module.exports === "object") {
|
||||
// For CommonJS and CommonJS-like environments where a proper `window`
|
||||
// is present, execute the factory and get yua.
|
||||
// For environments that do not have a `window` with a `document`
|
||||
// (such as Node.js), expose a factory as module.exports.
|
||||
// This accentuates the need for the creation of a real `window`.
|
||||
// e.g. var yua = require("yua")(window);
|
||||
module.exports = global.document ? factory(global, true) : function(w) {
|
||||
if (!w.document) {
|
||||
throw new Error("Yua只能运行在浏览器环境")
|
||||
|
@ -31,7 +25,7 @@
|
|||
* 全局变量及方法 *
|
||||
**********************************************************************/
|
||||
|
||||
var expose = Date.now()
|
||||
var expose = generateID()
|
||||
//http://stackoverflow.com/questions/7290086/javascript-use-strict-and-nicks-find-global-function
|
||||
var DOC = window.document
|
||||
var head = DOC.head //HEAD元素
|
||||
|
@ -39,10 +33,8 @@ head.insertAdjacentHTML("afterBegin", '<yua :skip class="yua-hide"><style id="yu
|
|||
var ifGroup = head.firstChild
|
||||
|
||||
function log() {
|
||||
if (yua.config.debug) {
|
||||
// http://stackoverflow.com/questions/8785624/how-to-safely-wrap-console-log
|
||||
console.log.apply(console, arguments)
|
||||
}
|
||||
console.log.apply(console, arguments)
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -64,7 +56,6 @@ var nullObject = {} //作用类似于noop,只用于代码防御,千万不要
|
|||
var rword = /[^, ]+/g //切割字符串为一个个小块,以空格或豆号分开它们,结合replace实现字符串的forEach
|
||||
var rw20g = /\w+/g
|
||||
var rsvg = /^\[object SVG\w*Element\]$/
|
||||
var rwindow = /^\[object (?:Window|DOMWindow|global)\]$/
|
||||
var oproto = Object.prototype
|
||||
var ohasOwn = oproto.hasOwnProperty
|
||||
var serialize = oproto.toString
|
||||
|
@ -101,9 +92,9 @@ function oneObject(array, val) {
|
|||
return result
|
||||
}
|
||||
|
||||
var generateID = function (mark) {
|
||||
function generateID(mark) {
|
||||
mark = mark && (mark + '-') || 'yua-'
|
||||
return mark + Math.floor(Date.now() / 1000).toString(16) + '-' + Math.random().toString(16).slice(2, 6) + '-' + Math.random().toString(16).slice(6, 10)
|
||||
return mark + Date.now().toString(16) + '-' + Math.random().toString(16).slice(2, 6)
|
||||
}
|
||||
|
||||
yua = function (el) { //创建jQuery式的无new 实例化结构
|
||||
|
@ -148,11 +139,6 @@ yua.nextTick = new function () {// jshint ignore:line
|
|||
* yua的静态方法定义区 *
|
||||
**********************************************************************/
|
||||
|
||||
yua.init = function (el) {
|
||||
this[0] = this.element = el
|
||||
}
|
||||
yua.fn = yua.prototype = yua.init.prototype
|
||||
|
||||
yua.type = function (obj) { //取得目标的类型
|
||||
if (obj == null) {
|
||||
return String(obj)
|
||||
|
@ -167,9 +153,6 @@ yua.isFunction = function (fn) {
|
|||
return serialize.call(fn) === "[object Function]"
|
||||
}
|
||||
|
||||
yua.isWindow = function (obj) {
|
||||
return rwindow.test(serialize.call(obj))
|
||||
}
|
||||
|
||||
/*判定是否是一个朴素的javascript对象(Object),不是DOM对象,不是BOM对象,不是自定义类的实例*/
|
||||
yua.isPlainObject = function (obj) {
|
||||
|
@ -177,6 +160,27 @@ yua.isPlainObject = function (obj) {
|
|||
return serialize.call(obj) === "[object Object]" && Object.getPrototypeOf(obj) === oproto
|
||||
}
|
||||
|
||||
|
||||
var VMODELS = yua.vmodels = {} //所有vmodel都储存在这里
|
||||
yua.init = function (source) {
|
||||
if(yua.isPlainObject(source)){
|
||||
|
||||
var $id = source.$id,vm;
|
||||
if (!$id) {
|
||||
log("warning: vm必须指定$id")
|
||||
}
|
||||
vm = modelFactory(source)
|
||||
vm.$id = $id
|
||||
return VMODELS[$id] = vm
|
||||
|
||||
}else{
|
||||
this[0] = this.element = source
|
||||
}
|
||||
}
|
||||
yua.fn = yua.prototype = yua.init.prototype
|
||||
|
||||
|
||||
|
||||
//与jQuery.extend方法,可用于浅拷贝,深拷贝
|
||||
yua.mix = yua.fn.mix = function () {
|
||||
var options, name, src, copy, copyIsArray, clone,
|
||||
|
@ -491,8 +495,7 @@ if(!Date.prototype.format){
|
|||
yua.mix({
|
||||
rword: rword,
|
||||
subscribers: subscribers,
|
||||
version: '1.0.0-touch',
|
||||
ui: {},
|
||||
version: '1.0.0',
|
||||
log: log,
|
||||
slice: function (nodes, start, end) {
|
||||
return aslice.call(nodes, start, end)
|
||||
|
@ -502,8 +505,6 @@ yua.mix({
|
|||
error: function (str, e) {
|
||||
throw new (e || Error)(str)// jshint ignore:line
|
||||
},
|
||||
/*将一个以空格或逗号隔开的字符串或数组,转换成一个键值都为1的对象*/
|
||||
oneObject: oneObject,
|
||||
/* yua.range(10)
|
||||
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
||||
yua.range(1, 11)
|
||||
|
@ -521,8 +522,8 @@ yua.mix({
|
|||
start = 0
|
||||
}
|
||||
var index = -1,
|
||||
length = Math.max(0, Math.ceil((end - start) / step)),
|
||||
result = new Array(length)
|
||||
length = Math.max(0, Math.ceil((end - start) / step)),
|
||||
result = new Array(length)
|
||||
while (++index < length) {
|
||||
result[index] = start
|
||||
start += step
|
||||
|
@ -1079,7 +1080,6 @@ kernel.plugins = plugins
|
|||
kernel.plugins['interpolate'](["{{", "}}"])
|
||||
|
||||
kernel.async = true
|
||||
kernel.debug = true
|
||||
kernel.paths = {}
|
||||
kernel.shim = {}
|
||||
kernel.maxRepeatSize = 100
|
||||
|
@ -1249,17 +1249,13 @@ function notifySubscribers(subs, args) {
|
|||
|
||||
|
||||
|
||||
//yua最核心的方法的两个方法之一(另一个是yua.scan),返回一个ViewModel(VM)
|
||||
var VMODELS = yua.vmodels = {} //所有vmodel都储存在这里
|
||||
yua.define = function (source) {
|
||||
var $id = source.$id
|
||||
if (!$id) {
|
||||
log("warning: vm必须指定$id")
|
||||
}
|
||||
var vmodel = modelFactory(source)
|
||||
vmodel.$id = $id
|
||||
return VMODELS[$id] = vmodel
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//一些不需要被监听的属性
|
||||
var $$skipArray = oneObject("$id,$watch,$fire,$events,$model,$skipArray,$active,$pathname,$up,$ups,$track,$accessors")
|
||||
|
@ -1628,8 +1624,13 @@ var $modelDescriptor = {
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*********************************************************************
|
||||
* 监控数组(与:each, :repeat配合使用) *
|
||||
* 监控数组(:repeat配合使用) *
|
||||
**********************************************************************/
|
||||
|
||||
var arrayMethods = ['push', 'pop', 'shift', 'unshift', 'splice']
|
||||
|
@ -1941,6 +1942,23 @@ function getProxyIds(a, isArray) {
|
|||
return ret.join(";")
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*********************************************************************
|
||||
* 定时GC回收机制 (基于1.6基于频率的GC) *
|
||||
**********************************************************************/
|
||||
|
@ -2123,6 +2141,12 @@ yua.clearHTML = function(node) {
|
|||
return node
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*********************************************************************
|
||||
* yua的原型方法定义区 *
|
||||
**********************************************************************/
|
||||
|
@ -3062,8 +3086,12 @@ function scanAttr(elem, vmodels, match) {
|
|||
var rnoscanAttrBinding = /^if|widget|repeat$/
|
||||
var rnoscanNodeBinding = /^html|include$/
|
||||
|
||||
function scanNodeList(parent, vmodels) {
|
||||
var nodes = yua.slice(parent.childNodes)
|
||||
function scanNodeList(elem, vmodels) {
|
||||
if(isWidget(elem)){
|
||||
// elem = elem.content
|
||||
log(elem)
|
||||
}
|
||||
var nodes = yua.slice(elem.childNodes)
|
||||
scanNodeArray(nodes, vmodels)
|
||||
}
|
||||
|
||||
|
@ -3078,21 +3106,18 @@ function scanNodeArray(nodes, vmodels) {
|
|||
case 1:
|
||||
var elem = node
|
||||
if (!elem.msResolved && elem.parentNode && elem.parentNode.nodeType === 1) {
|
||||
var library = isWidget(elem)
|
||||
if (library) {
|
||||
var widget = elem.localName ? elem.localName.replace(library + ":", "") : elem.nodeName
|
||||
var fullName = library + ":" + camelize(widget)
|
||||
var widget = isWidget(elem)
|
||||
|
||||
if (widget) {
|
||||
componentQueue.push({
|
||||
library: library,
|
||||
element: elem,
|
||||
fullName: fullName,
|
||||
widget: widget,
|
||||
vmodels: vmodels,
|
||||
name: "widget"
|
||||
name: widget
|
||||
})
|
||||
if (yua.components[fullName]) {
|
||||
if (yua.components[widget]) {
|
||||
// log(widget, yua.components)
|
||||
//确保所有:attr-name扫描完再处理
|
||||
_delay_component(fullName)
|
||||
_delay_component(widget)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3263,6 +3288,19 @@ Buffer.prototype = {
|
|||
|
||||
var buffer = new Buffer()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
var componentQueue = []
|
||||
var widgetList = []
|
||||
var componentHooks = {
|
||||
|
@ -3274,34 +3312,31 @@ var componentHooks = {
|
|||
$dispose: noop,
|
||||
$container: null,
|
||||
$childReady: noop,
|
||||
$replace: false,
|
||||
$extend: null,
|
||||
$$template: function (str) {
|
||||
return str
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
yua.components = {}
|
||||
yua.component = function (name, opts) {
|
||||
if (opts) {
|
||||
yua.components[name] = yua.mix({}, componentHooks, opts)
|
||||
}
|
||||
for (var i = 0, obj; obj = componentQueue[i]; i++) {
|
||||
if (name === obj.fullName) {
|
||||
componentQueue.splice(i, 1)
|
||||
if (name === obj.name) {
|
||||
componentQueue.splice(i, 1);
|
||||
i--;
|
||||
|
||||
(function (host, hooks, elem, widget) {
|
||||
//如果elem已从Document里移除,直接返回
|
||||
//issuse : https://github.com/RubyLouvre/yua2/issues/40
|
||||
if (!yua.contains(DOC, elem) || elem.msResolved) {
|
||||
yua.Array.remove(componentQueue, host)
|
||||
return
|
||||
}
|
||||
|
||||
var dependencies = 1
|
||||
var library = host.library
|
||||
var global = yua.libraries[library] || componentHooks
|
||||
var global = componentHooks
|
||||
|
||||
//===========收集各种配置=======
|
||||
if (elem.getAttribute(":attr-identifier")) {
|
||||
|
@ -3309,25 +3344,21 @@ yua.component = function (name, opts) {
|
|||
return
|
||||
}
|
||||
var elemOpts = getOptionsFromTag(elem, host.vmodels)
|
||||
var vmOpts = getOptionsFromVM(host.vmodels, elemOpts.config || host.fullName)
|
||||
var vmOpts = getOptionsFromVM(host.vmodels, elemOpts.config || host.name)
|
||||
var $id = elemOpts.$id || elemOpts.identifier || generateID(widget)
|
||||
delete elemOpts.config
|
||||
delete elemOpts.$id
|
||||
delete elemOpts.identifier
|
||||
var componentDefinition = {}
|
||||
|
||||
var parentHooks = yua.components[hooks.$extend]
|
||||
if (parentHooks) {
|
||||
yua.mix(true, componentDefinition, parentHooks)
|
||||
componentDefinition = parentHooks.$construct.call(elem, componentDefinition, {}, {})
|
||||
} else {
|
||||
yua.mix(true, componentDefinition, hooks)
|
||||
}
|
||||
yua.mix(true, componentDefinition, hooks)
|
||||
|
||||
componentDefinition = yua.components[name].$construct.call(elem, componentDefinition, vmOpts, elemOpts)
|
||||
|
||||
componentDefinition.$refs = {}
|
||||
componentDefinition.$id = $id
|
||||
|
||||
|
||||
//==========构建VM=========
|
||||
var keepSlot = componentDefinition.$slot
|
||||
var keepReplace = componentDefinition.$replace
|
||||
|
@ -3338,62 +3369,39 @@ yua.component = function (name, opts) {
|
|||
delete componentDefinition.$container
|
||||
delete componentDefinition.$construct
|
||||
|
||||
var vmodel = yua.define(componentDefinition) || {}
|
||||
var vmodel = yua(componentDefinition) || {}
|
||||
vmodel.$ups = host.vmodels
|
||||
vmodel.$up = host.vmodels[0]
|
||||
elem.msResolved = 1 //防止二进扫描此元素
|
||||
vmodel.$init(vmodel, elem)
|
||||
global.$init(vmodel, elem)
|
||||
var nodes = elem.childNodes
|
||||
//收集插入点
|
||||
var slots = {}, snode
|
||||
for (var s = 0, el; el = nodes[s++]; ) {
|
||||
var type = el.nodeType === 1 && el.getAttribute("slot") || keepSlot
|
||||
if (type) {
|
||||
if (slots[type]) {
|
||||
slots[type].push(el)
|
||||
} else {
|
||||
slots[type] = [el]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (vmodel.$$template) {
|
||||
yua.clearHTML(elem)
|
||||
elem.innerHTML = vmodel.$$template(keepTemplate)
|
||||
}
|
||||
for (s in slots) {
|
||||
if (vmodel.hasOwnProperty(s)) {
|
||||
var ss = slots[s]
|
||||
if (ss.length) {
|
||||
var fragment = yuaFragment.cloneNode(true)
|
||||
for (var ns = 0; snode = ss[ns++]; ) {
|
||||
fragment.appendChild(snode)
|
||||
}
|
||||
vmodel[s] = fragment
|
||||
}
|
||||
slots[s] = null
|
||||
}
|
||||
}
|
||||
slots = null
|
||||
var child = elem.children[0] || elem.firstChild
|
||||
if (keepReplace) {
|
||||
elem.parentNode.replaceChild(child, elem)
|
||||
child.msResolved = 1
|
||||
var cssText = elem.style.cssText
|
||||
var className = elem.className
|
||||
elem = host.element = child
|
||||
elem.style.cssText += ";"+ cssText
|
||||
if (className) {
|
||||
yua(elem).addClass(className)
|
||||
}
|
||||
|
||||
// 组件所使用的标签是temlate,所以必须要要用子元素替换掉
|
||||
var child = elem.content.firstChild
|
||||
elem.parentNode.replaceChild(child, elem)
|
||||
child.msResolved = 1
|
||||
var cssText = elem.style.cssText
|
||||
var className = elem.className
|
||||
elem = host.element = child
|
||||
elem.style.cssText += ";"+ cssText
|
||||
if (className) {
|
||||
yua(elem).addClass(className)
|
||||
}
|
||||
//指定了组件的容器的话,则把组件节点转过去
|
||||
if (keepContainer) {
|
||||
keepContainer.appendChild(elem)
|
||||
}
|
||||
yua.fireDom(elem, "datasetchanged",
|
||||
{library: library, vm: vmodel, childReady: 1})
|
||||
{vm: vmodel, childReady: 1})
|
||||
var children = 0
|
||||
var removeFn = yua.bind(elem, "datasetchanged", function (e) {
|
||||
if (e.childReady && e.library === library) {
|
||||
if (e.childReady) {
|
||||
dependencies += e.childReady
|
||||
if (vmodel !== e.vm) {
|
||||
vmodel.$refs[e.vm.$id] = e.vm
|
||||
|
@ -3433,15 +3441,15 @@ yua.component = function (name, opts) {
|
|||
scanTag(elem, [vmodel].concat(host.vmodels))
|
||||
yua.vmodels[vmodel.$id] = vmodel
|
||||
if (!elem.childNodes.length) {
|
||||
yua.fireDom(elem, "datasetchanged", {library: library, vm: vmodel, childReady: -1})
|
||||
yua.fireDom(elem, "datasetchanged", {vm: vmodel, childReady: -1})
|
||||
} else {
|
||||
var id2 = setTimeout(function () {
|
||||
clearTimeout(id2)
|
||||
yua.fireDom(elem, "datasetchanged", {library: library, vm: vmodel, childReady: -1})
|
||||
yua.fireDom(elem, "datasetchanged", {vm: vmodel, childReady: -1})
|
||||
}, 17)
|
||||
}
|
||||
|
||||
})(obj, yua.components[name], obj.element, obj.widget)// jshint ignore:line
|
||||
})(obj, yua.components[name], obj.element, obj.name)// jshint ignore:line
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -3461,20 +3469,14 @@ function getOptionsFromVM(vmodels, pre) {
|
|||
return {}
|
||||
}
|
||||
|
||||
yua.libraries = []
|
||||
yua.library = function (name, opts) {
|
||||
if (DOC.namespaces) {
|
||||
DOC.namespaces.add(name, 'http://www.w3.org/1999/xhtml');
|
||||
function isWidget(el) {//如果是组件,则返回组件的名字
|
||||
var name = el.nodeName.toLowerCase()
|
||||
if(name === 'template' && el.getAttribute('name')){
|
||||
return el.getAttribute('name')
|
||||
}
|
||||
yua.libraries[name] = yua.mix({
|
||||
$init: noop,
|
||||
$ready: noop,
|
||||
$dispose: noop
|
||||
}, opts || {})
|
||||
return null
|
||||
}
|
||||
|
||||
yua.library("ms")
|
||||
yua.library("do")
|
||||
|
||||
|
||||
|
||||
|
@ -3486,26 +3488,13 @@ yua.library("do")
|
|||
|
||||
|
||||
|
||||
/*
|
||||
broswer nodeName scopeName localName
|
||||
IE9 ONI:BUTTON oni button
|
||||
IE10 ONI:BUTTON undefined oni:button
|
||||
IE8 button oni undefined
|
||||
chrome ONI:BUTTON undefined oni:button
|
||||
|
||||
*/
|
||||
function isWidget(el) { //如果为自定义标签,返回UI库的名字
|
||||
if (el.scopeName && el.scopeName !== "HTML") {
|
||||
return el.scopeName
|
||||
}
|
||||
var fullName = el.nodeName.toLowerCase()
|
||||
var index = fullName.indexOf(":")
|
||||
if (index > 0) {
|
||||
return fullName.slice(0, index)
|
||||
}
|
||||
}
|
||||
//各种MVVM框架在大型表格下的性能测试
|
||||
// https://github.com/RubyLouvre/yua/issues/859
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
var bools = ["autofocus,autoplay,async,allowTransparency,checked,controls",
|
||||
"declare,disabled,defer,defaultChecked,defaultSelected",
|
||||
|
@ -5728,7 +5717,7 @@ new function () {// jshint ignore:line
|
|||
return ""
|
||||
})
|
||||
if (res === "ready") {
|
||||
log("debug: ready!已经被废弃,请使用domReady!")
|
||||
log("ready!已经被废弃,请使用domReady!")
|
||||
res = "domReady"
|
||||
}
|
||||
//2. 去掉querystring, hash
|
||||
|
@ -5806,6 +5795,7 @@ new function () {// jshint ignore:line
|
|||
var requireQueue = []
|
||||
var isUserFirstRequire = false
|
||||
innerRequire = yua.require = function (array, factory, parentUrl, defineConfig) {
|
||||
|
||||
if (!isUserFirstRequire) {
|
||||
requireQueue.push(yua.slice(arguments))
|
||||
if (arguments.length <= 2) {
|
||||
|
@ -5817,7 +5807,6 @@ new function () {// jshint ignore:line
|
|||
}
|
||||
return
|
||||
}
|
||||
|
||||
if (!Array.isArray(array)) {
|
||||
yua.error("require方法的第一个参数应为数组 " + array)
|
||||
}
|
||||
|
@ -5841,10 +5830,11 @@ new function () {// jshint ignore:line
|
|||
}
|
||||
var req = makeRequest(name, defineConfig)
|
||||
var url = fireRequest(req) //加载资源,并返回该资源的完整地址
|
||||
|
||||
if (url) {
|
||||
if (!uniq[url]) {
|
||||
deps.push(url)
|
||||
uniq[url] = !0//去重
|
||||
uniq[url] = !0
|
||||
}
|
||||
}
|
||||
})
|
||||
|
@ -6016,7 +6006,7 @@ new function () {// jshint ignore:line
|
|||
head.removeChild(node)
|
||||
node = null // 处理旧式IE下的循环引用问题
|
||||
})
|
||||
log("debug: 加载 " + id + " 失败" + onError + " " + (!modules[id].state))
|
||||
log("加载 " + id + " 失败")
|
||||
} else {
|
||||
return true
|
||||
}
|
||||
|
@ -6089,13 +6079,12 @@ new function () {// jshint ignore:line
|
|||
css: {
|
||||
load: function (name, req, onLoad) {
|
||||
var url = req.url
|
||||
head.insertAdjacentHTML("beforeend", '<link rel="stylesheet" href="' + url + '">')
|
||||
head.insertAdjacentHTML("afterBegin", '<link rel="stylesheet" href="' + url + '">')
|
||||
onLoad()
|
||||
}
|
||||
},
|
||||
text: {
|
||||
load: function (name, req, onLoad) {
|
||||
var url = req.url
|
||||
var xhr = getXHR()
|
||||
xhr.onload = function () {
|
||||
var status = xhr.status;
|
||||
|
@ -6105,13 +6094,7 @@ new function () {// jshint ignore:line
|
|||
onLoad(xhr.responseText)
|
||||
}
|
||||
}
|
||||
var time = "_=" + (new Date() - 0)
|
||||
var _url = url.indexOf("?") === -1 ? url + "?" + time : url + "&" + time
|
||||
xhr.open("GET", _url, true)
|
||||
if ("withCredentials" in xhr) {//这是处理跨域
|
||||
xhr.withCredentials = true
|
||||
}
|
||||
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest")//告诉后端这是AJAX请求
|
||||
xhr.open("GET", req.url, true)
|
||||
xhr.send()
|
||||
}
|
||||
}
|
||||
|
@ -6360,70 +6343,6 @@ new function () {// jshint ignore:line
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*********************************************************************
|
||||
* DOMReady *
|
||||
**********************************************************************/
|
||||
|
||||
var readyList = [],
|
||||
isReady
|
||||
var fireReady = function (fn) {
|
||||
isReady = true
|
||||
var require = yua.require
|
||||
if (require && require.checkDeps) {
|
||||
modules["domReady!"].state = 4
|
||||
require.checkDeps()
|
||||
}
|
||||
while (fn = readyList.shift()) {
|
||||
fn(yua)
|
||||
}
|
||||
}
|
||||
|
||||
if (DOC.readyState === "complete") {
|
||||
setTimeout(fireReady) //如果在domReady之外加载
|
||||
} else {
|
||||
DOC.addEventListener("DOMContentLoaded", fireReady)
|
||||
}
|
||||
window.addEventListener("load", fireReady)
|
||||
yua.ready = function (fn) {
|
||||
if (!isReady) {
|
||||
readyList.push(fn)
|
||||
} else {
|
||||
fn(yua)
|
||||
}
|
||||
}
|
||||
|
||||
yua.config({
|
||||
loader: true
|
||||
})
|
||||
yua.ready(function () {
|
||||
yua.scan(DOC.body)
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -6986,6 +6905,95 @@ Recognizer.add('swipe', swipeRecognizer)
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*********************************************************************
|
||||
* DOMReady *
|
||||
**********************************************************************/
|
||||
|
||||
var readyList = [],
|
||||
isReady
|
||||
var fireReady = function (fn) {
|
||||
isReady = true
|
||||
var require = yua.require
|
||||
if (require && require.checkDeps) {
|
||||
modules["domReady!"].state = 4
|
||||
require.checkDeps()
|
||||
}
|
||||
while (fn = readyList.shift()) {
|
||||
fn(yua)
|
||||
}
|
||||
}
|
||||
|
||||
if (DOC.readyState === "complete") {
|
||||
setTimeout(fireReady) //如果在domReady之外加载
|
||||
} else {
|
||||
DOC.addEventListener("DOMContentLoaded", fireReady)
|
||||
}
|
||||
window.addEventListener("load", fireReady)
|
||||
yua.ready = function (fn) {
|
||||
if (!isReady) {
|
||||
readyList.push(fn)
|
||||
} else {
|
||||
fn(yua)
|
||||
}
|
||||
}
|
||||
|
||||
yua.config({
|
||||
loader: true
|
||||
})
|
||||
yua.ready(function () {
|
||||
yua.scan(DOC.body)
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
282
js/yua.js
282
js/yua.js
|
@ -8,12 +8,6 @@
|
|||
(function(global, factory) {
|
||||
|
||||
if (typeof module === "object" && typeof module.exports === "object") {
|
||||
// For CommonJS and CommonJS-like environments where a proper `window`
|
||||
// is present, execute the factory and get yua.
|
||||
// For environments that do not have a `window` with a `document`
|
||||
// (such as Node.js), expose a factory as module.exports.
|
||||
// This accentuates the need for the creation of a real `window`.
|
||||
// e.g. var yua = require("yua")(window);
|
||||
module.exports = global.document ? factory(global, true) : function(w) {
|
||||
if (!w.document) {
|
||||
throw new Error("Yua只能运行在浏览器环境")
|
||||
|
@ -31,7 +25,7 @@
|
|||
* 全局变量及方法 *
|
||||
**********************************************************************/
|
||||
|
||||
var expose = Date.now()
|
||||
var expose = generateID()
|
||||
//http://stackoverflow.com/questions/7290086/javascript-use-strict-and-nicks-find-global-function
|
||||
var DOC = window.document
|
||||
var head = DOC.head //HEAD元素
|
||||
|
@ -39,10 +33,8 @@ head.insertAdjacentHTML("afterBegin", '<yua :skip class="yua-hide"><style id="yu
|
|||
var ifGroup = head.firstChild
|
||||
|
||||
function log() {
|
||||
if (yua.config.debug) {
|
||||
// http://stackoverflow.com/questions/8785624/how-to-safely-wrap-console-log
|
||||
console.log.apply(console, arguments)
|
||||
}
|
||||
console.log.apply(console, arguments)
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -64,7 +56,6 @@ var nullObject = {} //作用类似于noop,只用于代码防御,千万不要
|
|||
var rword = /[^, ]+/g //切割字符串为一个个小块,以空格或豆号分开它们,结合replace实现字符串的forEach
|
||||
var rw20g = /\w+/g
|
||||
var rsvg = /^\[object SVG\w*Element\]$/
|
||||
var rwindow = /^\[object (?:Window|DOMWindow|global)\]$/
|
||||
var oproto = Object.prototype
|
||||
var ohasOwn = oproto.hasOwnProperty
|
||||
var serialize = oproto.toString
|
||||
|
@ -101,9 +92,9 @@ function oneObject(array, val) {
|
|||
return result
|
||||
}
|
||||
|
||||
var generateID = function (mark) {
|
||||
function generateID(mark) {
|
||||
mark = mark && (mark + '-') || 'yua-'
|
||||
return mark + Math.floor(Date.now() / 1000).toString(16) + '-' + Math.random().toString(16).slice(2, 6) + '-' + Math.random().toString(16).slice(6, 10)
|
||||
return mark + Date.now().toString(16) + '-' + Math.random().toString(16).slice(2, 6)
|
||||
}
|
||||
|
||||
yua = function (el) { //创建jQuery式的无new 实例化结构
|
||||
|
@ -148,11 +139,6 @@ yua.nextTick = new function () {// jshint ignore:line
|
|||
* yua的静态方法定义区 *
|
||||
**********************************************************************/
|
||||
|
||||
yua.init = function (el) {
|
||||
this[0] = this.element = el
|
||||
}
|
||||
yua.fn = yua.prototype = yua.init.prototype
|
||||
|
||||
yua.type = function (obj) { //取得目标的类型
|
||||
if (obj == null) {
|
||||
return String(obj)
|
||||
|
@ -167,9 +153,6 @@ yua.isFunction = function (fn) {
|
|||
return serialize.call(fn) === "[object Function]"
|
||||
}
|
||||
|
||||
yua.isWindow = function (obj) {
|
||||
return rwindow.test(serialize.call(obj))
|
||||
}
|
||||
|
||||
/*判定是否是一个朴素的javascript对象(Object),不是DOM对象,不是BOM对象,不是自定义类的实例*/
|
||||
yua.isPlainObject = function (obj) {
|
||||
|
@ -177,6 +160,27 @@ yua.isPlainObject = function (obj) {
|
|||
return serialize.call(obj) === "[object Object]" && Object.getPrototypeOf(obj) === oproto
|
||||
}
|
||||
|
||||
|
||||
var VMODELS = yua.vmodels = {} //所有vmodel都储存在这里
|
||||
yua.init = function (source) {
|
||||
if(yua.isPlainObject(source)){
|
||||
|
||||
var $id = source.$id,vm;
|
||||
if (!$id) {
|
||||
log("warning: vm必须指定$id")
|
||||
}
|
||||
vm = modelFactory(source)
|
||||
vm.$id = $id
|
||||
return VMODELS[$id] = vm
|
||||
|
||||
}else{
|
||||
this[0] = this.element = source
|
||||
}
|
||||
}
|
||||
yua.fn = yua.prototype = yua.init.prototype
|
||||
|
||||
|
||||
|
||||
//与jQuery.extend方法,可用于浅拷贝,深拷贝
|
||||
yua.mix = yua.fn.mix = function () {
|
||||
var options, name, src, copy, copyIsArray, clone,
|
||||
|
@ -492,7 +496,6 @@ yua.mix({
|
|||
rword: rword,
|
||||
subscribers: subscribers,
|
||||
version: '1.0.0',
|
||||
ui: {},
|
||||
log: log,
|
||||
slice: function (nodes, start, end) {
|
||||
return aslice.call(nodes, start, end)
|
||||
|
@ -502,8 +505,6 @@ yua.mix({
|
|||
error: function (str, e) {
|
||||
throw new (e || Error)(str)// jshint ignore:line
|
||||
},
|
||||
/*将一个以空格或逗号隔开的字符串或数组,转换成一个键值都为1的对象*/
|
||||
oneObject: oneObject,
|
||||
/* yua.range(10)
|
||||
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
||||
yua.range(1, 11)
|
||||
|
@ -521,8 +522,8 @@ yua.mix({
|
|||
start = 0
|
||||
}
|
||||
var index = -1,
|
||||
length = Math.max(0, Math.ceil((end - start) / step)),
|
||||
result = new Array(length)
|
||||
length = Math.max(0, Math.ceil((end - start) / step)),
|
||||
result = new Array(length)
|
||||
while (++index < length) {
|
||||
result[index] = start
|
||||
start += step
|
||||
|
@ -1079,7 +1080,6 @@ kernel.plugins = plugins
|
|||
kernel.plugins['interpolate'](["{{", "}}"])
|
||||
|
||||
kernel.async = true
|
||||
kernel.debug = true
|
||||
kernel.paths = {}
|
||||
kernel.shim = {}
|
||||
kernel.maxRepeatSize = 100
|
||||
|
@ -1249,17 +1249,13 @@ function notifySubscribers(subs, args) {
|
|||
|
||||
|
||||
|
||||
//yua最核心的方法的两个方法之一(另一个是yua.scan),返回一个ViewModel(VM)
|
||||
var VMODELS = yua.vmodels = {} //所有vmodel都储存在这里
|
||||
yua.define = function (source) {
|
||||
var $id = source.$id
|
||||
if (!$id) {
|
||||
log("warning: vm必须指定$id")
|
||||
}
|
||||
var vmodel = modelFactory(source)
|
||||
vmodel.$id = $id
|
||||
return VMODELS[$id] = vmodel
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//一些不需要被监听的属性
|
||||
var $$skipArray = oneObject("$id,$watch,$fire,$events,$model,$skipArray,$active,$pathname,$up,$ups,$track,$accessors")
|
||||
|
@ -1628,8 +1624,13 @@ var $modelDescriptor = {
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*********************************************************************
|
||||
* 监控数组(与:each, :repeat配合使用) *
|
||||
* 监控数组(:repeat配合使用) *
|
||||
**********************************************************************/
|
||||
|
||||
var arrayMethods = ['push', 'pop', 'shift', 'unshift', 'splice']
|
||||
|
@ -1941,6 +1942,23 @@ function getProxyIds(a, isArray) {
|
|||
return ret.join(";")
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*********************************************************************
|
||||
* 定时GC回收机制 (基于1.6基于频率的GC) *
|
||||
**********************************************************************/
|
||||
|
@ -2123,6 +2141,12 @@ yua.clearHTML = function(node) {
|
|||
return node
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*********************************************************************
|
||||
* yua的原型方法定义区 *
|
||||
**********************************************************************/
|
||||
|
@ -3062,8 +3086,12 @@ function scanAttr(elem, vmodels, match) {
|
|||
var rnoscanAttrBinding = /^if|widget|repeat$/
|
||||
var rnoscanNodeBinding = /^html|include$/
|
||||
|
||||
function scanNodeList(parent, vmodels) {
|
||||
var nodes = yua.slice(parent.childNodes)
|
||||
function scanNodeList(elem, vmodels) {
|
||||
if(isWidget(elem)){
|
||||
// elem = elem.content
|
||||
log(elem)
|
||||
}
|
||||
var nodes = yua.slice(elem.childNodes)
|
||||
scanNodeArray(nodes, vmodels)
|
||||
}
|
||||
|
||||
|
@ -3078,21 +3106,18 @@ function scanNodeArray(nodes, vmodels) {
|
|||
case 1:
|
||||
var elem = node
|
||||
if (!elem.msResolved && elem.parentNode && elem.parentNode.nodeType === 1) {
|
||||
var library = isWidget(elem)
|
||||
if (library) {
|
||||
var widget = elem.localName ? elem.localName.replace(library + ":", "") : elem.nodeName
|
||||
var fullName = library + ":" + camelize(widget)
|
||||
var widget = isWidget(elem)
|
||||
|
||||
if (widget) {
|
||||
componentQueue.push({
|
||||
library: library,
|
||||
element: elem,
|
||||
fullName: fullName,
|
||||
widget: widget,
|
||||
vmodels: vmodels,
|
||||
name: "widget"
|
||||
name: widget
|
||||
})
|
||||
if (yua.components[fullName]) {
|
||||
if (yua.components[widget]) {
|
||||
// log(widget, yua.components)
|
||||
//确保所有:attr-name扫描完再处理
|
||||
_delay_component(fullName)
|
||||
_delay_component(widget)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3263,6 +3288,19 @@ Buffer.prototype = {
|
|||
|
||||
var buffer = new Buffer()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
var componentQueue = []
|
||||
var widgetList = []
|
||||
var componentHooks = {
|
||||
|
@ -3274,34 +3312,31 @@ var componentHooks = {
|
|||
$dispose: noop,
|
||||
$container: null,
|
||||
$childReady: noop,
|
||||
$replace: false,
|
||||
$extend: null,
|
||||
$$template: function (str) {
|
||||
return str
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
yua.components = {}
|
||||
yua.component = function (name, opts) {
|
||||
if (opts) {
|
||||
yua.components[name] = yua.mix({}, componentHooks, opts)
|
||||
}
|
||||
for (var i = 0, obj; obj = componentQueue[i]; i++) {
|
||||
if (name === obj.fullName) {
|
||||
componentQueue.splice(i, 1)
|
||||
if (name === obj.name) {
|
||||
componentQueue.splice(i, 1);
|
||||
i--;
|
||||
|
||||
(function (host, hooks, elem, widget) {
|
||||
//如果elem已从Document里移除,直接返回
|
||||
//issuse : https://github.com/RubyLouvre/yua2/issues/40
|
||||
if (!yua.contains(DOC, elem) || elem.msResolved) {
|
||||
yua.Array.remove(componentQueue, host)
|
||||
return
|
||||
}
|
||||
|
||||
var dependencies = 1
|
||||
var library = host.library
|
||||
var global = yua.libraries[library] || componentHooks
|
||||
var global = componentHooks
|
||||
|
||||
//===========收集各种配置=======
|
||||
if (elem.getAttribute(":attr-identifier")) {
|
||||
|
@ -3309,25 +3344,21 @@ yua.component = function (name, opts) {
|
|||
return
|
||||
}
|
||||
var elemOpts = getOptionsFromTag(elem, host.vmodels)
|
||||
var vmOpts = getOptionsFromVM(host.vmodels, elemOpts.config || host.fullName)
|
||||
var vmOpts = getOptionsFromVM(host.vmodels, elemOpts.config || host.name)
|
||||
var $id = elemOpts.$id || elemOpts.identifier || generateID(widget)
|
||||
delete elemOpts.config
|
||||
delete elemOpts.$id
|
||||
delete elemOpts.identifier
|
||||
var componentDefinition = {}
|
||||
|
||||
var parentHooks = yua.components[hooks.$extend]
|
||||
if (parentHooks) {
|
||||
yua.mix(true, componentDefinition, parentHooks)
|
||||
componentDefinition = parentHooks.$construct.call(elem, componentDefinition, {}, {})
|
||||
} else {
|
||||
yua.mix(true, componentDefinition, hooks)
|
||||
}
|
||||
yua.mix(true, componentDefinition, hooks)
|
||||
|
||||
componentDefinition = yua.components[name].$construct.call(elem, componentDefinition, vmOpts, elemOpts)
|
||||
|
||||
componentDefinition.$refs = {}
|
||||
componentDefinition.$id = $id
|
||||
|
||||
|
||||
//==========构建VM=========
|
||||
var keepSlot = componentDefinition.$slot
|
||||
var keepReplace = componentDefinition.$replace
|
||||
|
@ -3338,62 +3369,39 @@ yua.component = function (name, opts) {
|
|||
delete componentDefinition.$container
|
||||
delete componentDefinition.$construct
|
||||
|
||||
var vmodel = yua.define(componentDefinition) || {}
|
||||
var vmodel = yua(componentDefinition) || {}
|
||||
vmodel.$ups = host.vmodels
|
||||
vmodel.$up = host.vmodels[0]
|
||||
elem.msResolved = 1 //防止二进扫描此元素
|
||||
vmodel.$init(vmodel, elem)
|
||||
global.$init(vmodel, elem)
|
||||
var nodes = elem.childNodes
|
||||
//收集插入点
|
||||
var slots = {}, snode
|
||||
for (var s = 0, el; el = nodes[s++]; ) {
|
||||
var type = el.nodeType === 1 && el.getAttribute("slot") || keepSlot
|
||||
if (type) {
|
||||
if (slots[type]) {
|
||||
slots[type].push(el)
|
||||
} else {
|
||||
slots[type] = [el]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (vmodel.$$template) {
|
||||
yua.clearHTML(elem)
|
||||
elem.innerHTML = vmodel.$$template(keepTemplate)
|
||||
}
|
||||
for (s in slots) {
|
||||
if (vmodel.hasOwnProperty(s)) {
|
||||
var ss = slots[s]
|
||||
if (ss.length) {
|
||||
var fragment = yuaFragment.cloneNode(true)
|
||||
for (var ns = 0; snode = ss[ns++]; ) {
|
||||
fragment.appendChild(snode)
|
||||
}
|
||||
vmodel[s] = fragment
|
||||
}
|
||||
slots[s] = null
|
||||
}
|
||||
}
|
||||
slots = null
|
||||
var child = elem.children[0] || elem.firstChild
|
||||
if (keepReplace) {
|
||||
elem.parentNode.replaceChild(child, elem)
|
||||
child.msResolved = 1
|
||||
var cssText = elem.style.cssText
|
||||
var className = elem.className
|
||||
elem = host.element = child
|
||||
elem.style.cssText += ";"+ cssText
|
||||
if (className) {
|
||||
yua(elem).addClass(className)
|
||||
}
|
||||
|
||||
// 组件所使用的标签是temlate,所以必须要要用子元素替换掉
|
||||
var child = elem.content.firstChild
|
||||
elem.parentNode.replaceChild(child, elem)
|
||||
child.msResolved = 1
|
||||
var cssText = elem.style.cssText
|
||||
var className = elem.className
|
||||
elem = host.element = child
|
||||
elem.style.cssText += ";"+ cssText
|
||||
if (className) {
|
||||
yua(elem).addClass(className)
|
||||
}
|
||||
//指定了组件的容器的话,则把组件节点转过去
|
||||
if (keepContainer) {
|
||||
keepContainer.appendChild(elem)
|
||||
}
|
||||
yua.fireDom(elem, "datasetchanged",
|
||||
{library: library, vm: vmodel, childReady: 1})
|
||||
{vm: vmodel, childReady: 1})
|
||||
var children = 0
|
||||
var removeFn = yua.bind(elem, "datasetchanged", function (e) {
|
||||
if (e.childReady && e.library === library) {
|
||||
if (e.childReady) {
|
||||
dependencies += e.childReady
|
||||
if (vmodel !== e.vm) {
|
||||
vmodel.$refs[e.vm.$id] = e.vm
|
||||
|
@ -3433,15 +3441,15 @@ yua.component = function (name, opts) {
|
|||
scanTag(elem, [vmodel].concat(host.vmodels))
|
||||
yua.vmodels[vmodel.$id] = vmodel
|
||||
if (!elem.childNodes.length) {
|
||||
yua.fireDom(elem, "datasetchanged", {library: library, vm: vmodel, childReady: -1})
|
||||
yua.fireDom(elem, "datasetchanged", {vm: vmodel, childReady: -1})
|
||||
} else {
|
||||
var id2 = setTimeout(function () {
|
||||
clearTimeout(id2)
|
||||
yua.fireDom(elem, "datasetchanged", {library: library, vm: vmodel, childReady: -1})
|
||||
yua.fireDom(elem, "datasetchanged", {vm: vmodel, childReady: -1})
|
||||
}, 17)
|
||||
}
|
||||
|
||||
})(obj, yua.components[name], obj.element, obj.widget)// jshint ignore:line
|
||||
})(obj, yua.components[name], obj.element, obj.name)// jshint ignore:line
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -3461,20 +3469,14 @@ function getOptionsFromVM(vmodels, pre) {
|
|||
return {}
|
||||
}
|
||||
|
||||
yua.libraries = []
|
||||
yua.library = function (name, opts) {
|
||||
if (DOC.namespaces) {
|
||||
DOC.namespaces.add(name, 'http://www.w3.org/1999/xhtml');
|
||||
function isWidget(el) {//如果是组件,则返回组件的名字
|
||||
var name = el.nodeName.toLowerCase()
|
||||
if(name === 'template' && el.getAttribute('name')){
|
||||
return el.getAttribute('name')
|
||||
}
|
||||
yua.libraries[name] = yua.mix({
|
||||
$init: noop,
|
||||
$ready: noop,
|
||||
$dispose: noop
|
||||
}, opts || {})
|
||||
return null
|
||||
}
|
||||
|
||||
yua.library("ms")
|
||||
yua.library("do")
|
||||
|
||||
|
||||
|
||||
|
@ -3486,26 +3488,13 @@ yua.library("do")
|
|||
|
||||
|
||||
|
||||
/*
|
||||
broswer nodeName scopeName localName
|
||||
IE9 ONI:BUTTON oni button
|
||||
IE10 ONI:BUTTON undefined oni:button
|
||||
IE8 button oni undefined
|
||||
chrome ONI:BUTTON undefined oni:button
|
||||
|
||||
*/
|
||||
function isWidget(el) { //如果为自定义标签,返回UI库的名字
|
||||
if (el.scopeName && el.scopeName !== "HTML") {
|
||||
return el.scopeName
|
||||
}
|
||||
var fullName = el.nodeName.toLowerCase()
|
||||
var index = fullName.indexOf(":")
|
||||
if (index > 0) {
|
||||
return fullName.slice(0, index)
|
||||
}
|
||||
}
|
||||
//各种MVVM框架在大型表格下的性能测试
|
||||
// https://github.com/RubyLouvre/yua/issues/859
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
var bools = ["autofocus,autoplay,async,allowTransparency,checked,controls",
|
||||
"declare,disabled,defer,defaultChecked,defaultSelected",
|
||||
|
@ -5728,7 +5717,7 @@ new function () {// jshint ignore:line
|
|||
return ""
|
||||
})
|
||||
if (res === "ready") {
|
||||
log("debug: ready!已经被废弃,请使用domReady!")
|
||||
log("ready!已经被废弃,请使用domReady!")
|
||||
res = "domReady"
|
||||
}
|
||||
//2. 去掉querystring, hash
|
||||
|
@ -6017,7 +6006,7 @@ new function () {// jshint ignore:line
|
|||
head.removeChild(node)
|
||||
node = null // 处理旧式IE下的循环引用问题
|
||||
})
|
||||
log("debug: 加载 " + id + " 失败" + onError + " " + (!modules[id].state))
|
||||
log("加载 " + id + " 失败")
|
||||
} else {
|
||||
return true
|
||||
}
|
||||
|
@ -6090,13 +6079,12 @@ new function () {// jshint ignore:line
|
|||
css: {
|
||||
load: function (name, req, onLoad) {
|
||||
var url = req.url
|
||||
head.insertAdjacentHTML("beforeend", '<link rel="stylesheet" href="' + url + '">')
|
||||
head.insertAdjacentHTML("afterBegin", '<link rel="stylesheet" href="' + url + '">')
|
||||
onLoad()
|
||||
}
|
||||
},
|
||||
text: {
|
||||
load: function (name, req, onLoad) {
|
||||
var url = req.url
|
||||
var xhr = getXHR()
|
||||
xhr.onload = function () {
|
||||
var status = xhr.status;
|
||||
|
@ -6106,13 +6094,7 @@ new function () {// jshint ignore:line
|
|||
onLoad(xhr.responseText)
|
||||
}
|
||||
}
|
||||
var time = "_=" + (new Date() - 0)
|
||||
var _url = url.indexOf("?") === -1 ? url + "?" + time : url + "&" + time
|
||||
xhr.open("GET", _url, true)
|
||||
if ("withCredentials" in xhr) {//这是处理跨域
|
||||
xhr.withCredentials = true
|
||||
}
|
||||
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest")//告诉后端这是AJAX请求
|
||||
xhr.open("GET", req.url, true)
|
||||
xhr.send()
|
||||
}
|
||||
}
|
||||
|
|
Reference in New Issue