s94-js v2.0.8
s94-js
封装了同步加载CommonJS模块的require方法,以及一些常用的js方法,
安装
$ npm install s94-js
使用
浏览器中
<script src="/node_modules/s94-web/s94.js" type="text/javascript" charset="utf-8"></script>
<script>
console.log(s94.type([]));
//使用require方法
var $ = require('s94-web');
console.log($('body'));
</script>
Nodejs中
var s94 = require('s94-js');
console.log(s94.type([]));
属性和方法
s94.__stack([index]) 获取js执行堆栈
s94.filename 文件的url地址
s94.dirname(path) 计算path的上级目录地址
s94.path(path, base) 计算相对路径
new s94.Ready(f) 函数队列对象
s94.extend(obj, data[, options]) 对象扩展
s94.type(obj) 返回obj参数的数据类型
s94.each(obj, callback[, thisArg]) 遍历obj对象(for in的语法糖)
s94.eachloop(obj, childkey, callback[, thisArg]) 递归遍历obj对象
s94.eachlimit(obj, op) 限制遍历obj对象
s94.merge(obj1[, obj2 ,...]) 递归合并多个对象
s94.trim(str[, mask]) 去除字符串首尾的空格,传入mask参数可以额外去除对应字符
s94.split(str[, mask]) 去除字符串首尾的空格,传入mask参数可以额外去除对应字符
s94.reparam(str) 把urlparam类型字符串转化成对象
s94.param(obj) 把对象转化成urlparam类型字符串
s94.url(str[, base]) new URL()的低版本兼容
s94.encode(data) 把data编码成36位字符串(包含小写英文、数字)
new s94.Cache(engine) 示例化缓存对象
s94.cache(name_kv[, def_timeout, engine]) 缓存数据或者提取缓存的数据
s94.cache.remove(name[, engine]) 清理缓存数据
s94.date(fmt[, time]) 格式化时间日期
s94.strtodate(str, fmt) 字符转Date对象
s94.__stack(index)
- index
Number
序号,不传返回所有。0:s94.stack所在位置;1:执行“s94.stack方法”的闭包所在位置;2:执行“执行了s94.__stack方法”的闭包所在位置;3:依此类推 - 返回
Object|Array
包含了执行流程中的文件url、行号、列号的Object或者包含所有Object的Array获取js执行堆栈,包含了执行流程中的文件url、行号、列号
//获取当前js代码执行所在的url地址
alert(s94.__stack(1)['file']);
//创建一个方法,执行方法的时候,获取执行时所在的url地址
function this_file(){
return s94.__stack(2)['file'];
}
s94.dirname(path)
- path
String
路径,最好位http(s)协议 - 返回
String
上级目录地址计算path的上级目录地址
var dir = s94.dirname('http://127.0.0.1/debug/index.html'); //http://127.0.0.1/debug
s94.path(path, base)
- path
String
相对路径 - base
String
基准路径 - 返回
String
计算后的绝对路径相对路径path转换为绝对路径
var dir = s94.path('../','http://127.0.0.1/debug/index.html'); //http://127.0.0.1/debug
new s94.Ready(f)
- f
Function
队列执行的回调函数,方法接收两个参数(next, data) - nextFunction
表示队列中的下一个方法,用于在需要的地方和时候异步执行。或者f方法直接return非underfind数据也可以等同于执行next(如果f中没有执行next的,同时return的是underfind。表示终止流程,意味着,队列中后面的方法不再会执行。) - dataObject
表示上一个方法传递过来的数据,可能是上一个f中next([data])
执行的传参,也可能是上一个f中return的非underfind数据 - 返回
s94.Ready
对象创建函数队列对象,
s94.Ready
的原型方法then
可以用于插入下一个需要执行的方法
s94.Ready
和Promise
类似,但是在处理大量异步执行队列的时候,s94.Ready
更加简洁。Promise
有两个状态指示,主要异步优化,可以直接获取异步操作句柄,方便调用异步返回结果。而s94.Ready
的只有一个用来表示执行下一个方法,具体的判断和是否终止执行队列,需要用户自己在回到函数里面判断,主要用于队列执行的流程,例如动画等需要按步骤进行的异步操作var ready = new s94.Ready(function(next){ //TODO.... }) //简便写法 var ready = $(function(next){ //TODO.... }) //解和then的用法 var r = $(function(next, data){ console.log('选择食物中。。。'); setTimeout(function () { console.log('下好订单了,顶单号:1'); next(1); },1000) }).then(function(next, data){ console.log('收到订单,顶单号:'+data+'。开始制作'); setTimeout(function () { console.log('制作完成,开始准备派送,排送员:XXX'); next('XXX');next('XX2X'); },1000) }).then(function(next, data){ console.log('排送员:'+data+'接到商品,开始派送'); setTimeout(function(){ console.log('商品送达,接收人没在,放在了存放点,取件码:123'); next('123'); },1000) }) setTimeout(function(){ r.then(function(next, data){ console.log('想起来要去取件,查看取件码:'+data) }) },5000)
s94.extend(obj, data, options)
- obj
Object
需要扩展的对象 - data
Object
{key: value},包含扩展的键、值 - options
Object
属性描述符,具体参考Object.defineProperty() ,只能规定数据描述符的configurable、enumerable、writable这三个参数 - 返回
Underfind
对obj对象进行扩展
var Obj = function(name, age){
this.name = name || '未知';
this.age = age || 0;
}
//普通的对象扩展不够精细,扩展的属性或方法是否可修改,是否枚举这些都无法控制
Obj.prototype.myname = function(){
console.log(this.name);
}
//使用Object.defineProperty()做精细的扩展,使myname方法不能修改,不能删除,但是可以枚举
Object.defineProperty(Obj.prototype, 'myname', {
value: function(){
console.log(this.name);
},
enumerable: true,
})
//s94.extend是Object.defineProperty()方法的简化,并且方便批量扩展多个属性或者方法
s94.extend(Obj.prototype, {
myname: function(){
console.log(this.name);
},
myage: function(){
console.log(this.age);
},
},{enumerable: true});
s94.type(obj)
- obj
Object
判断的数据 - 返回
String
数据类型,就是对象的名称返回obj参数的数据类型
s94.type({a:1}); // Object
s94.type([1,2]); // Array
s94.type(new Date()); // Date
function Obj(){}
s94.type(new Obj()); // Obj
s94.each(obj, callback, thisArg)
- obj
Object
遍历的对象 - callback
Function
遍历时执行的回调函数,接收三个参数,类似Array.prototype.forEach,函数返回false终止遍历 - thisArg
Object
callback执行的this - 返回
Underfind
遍历obj对象(for in的语法糖)
var obj = {a:1, b:2}
s94.each(obj, function(row, i, o){
//row 正在处理的当前元素。
//i 当前元素的键值。
//o 正在操作的对象,等同于obj
console.log(i+':'+row)
});
//打印 a:1
//打印 a:2
s94.each(obj, function(row, i, o){
//row 正在处理的当前元素。
//i 当前元素的键值。
//o 正在操作的对象,等同于obj
console.log(i+':'+row);
return false;
});
//打印 a:1
s94.eachloop(obj, childkey, callback, thisArg)
- obj
Object
遍历的对象 - childkey
String
需要递归遍历的属性名,为空表示直接递归遍历正在处理的当前元素。 - callback
Function
遍历时执行的回调函数,接收四个参数,相比于s94.each,第四个参数记录了键值路径,函数返回false终止遍历,返回underfind不递归遍历当前元素 - thisArg
Object
callback执行的this - 返回
Underfind
遍历obj对象(for in的语法糖)
var obj = {
a: 'a',
arr: [1,2,3],
obj: {a:1, b:2}
}
s94.eachloop(obj, '', function(row, i, o, ks){
//row 正在处理的当前元素。
//i 当前元素的键值。
//o 正在操作的对象,等同于obj
//ks 键值路径
console.log(ks+':'+row);
return true
})
//a:a
//arr:1,2,3
//arr,0:1
//arr,1:2
//arr,2:3
//obj:[object Object]
//obj,a:1
//obj,b:2
var list = [
{name: 'dir1',open:false, child:[
{name: 'file1'},
{name: 'file2'}
]},
{name: 'dir2',open:true, child:[
{name: 'file3'},
{name: 'file4'}
]},
]
s94.eachloop(list, 'child', function(row, i, o, ks){
console.log(row.name);
if(row.open) return true;
});
//dir1
//dir2
//file3
//file4
s94.eachlimit(obj, op)
- obj
Object
遍历的对象 - op
Function
|Object
配置参数,如果为Function
,表示op.each - limitNumber
限制同时执行的数量,默认为100 - eachFunction
遍历执行的回调函数,each(next, row, k),当前遍历执行完成后,调用next表示进行下一个row的遍历 - overFunction
遍历结束后的回调函数,over(obj) - 返回
Underfind
限制遍历obj对象,主要用于不能同时遍历的情况,例如大批量的ajax请求,可以用eachlimit防止同时请求数量太多
var obj = [
{name: 'name1', url: 'url1'},
{name: 'name2', url: 'url2'},
{name: 'name3', url: 'url3'},
{name: 'name4', url: 'url4'},
{name: 'name5', url: 'url5'},
//......
{name: 'name10000', url: 'url10000'},
]
s94.eachlimit(obj, {
limit: 50,
each: function(next, row, k){
$.ajax({
url: row.url,
success: function(res){
row.res = res;
next();
}
})
},
over: function(){
alert('下载完成')
}
});
s94.merge(obj1, obj2 ,...)
- obj1、obj2
Object
用于合并的多个对象 - 返回
Object
合并后的对象合并多个对象,支持合并数组和对象。返回新的对象,不改变传入的对象
var obj1 = {a:1,b:2,c:{c1:3}};
var obj2 = {c:{a1:1}};
var res1 = s94.merge(obj1, obj2);
console.log( res1 );//{a: 1, b: 2, c: {c1: 3, a1: 1}}
s94.trim(str, mask)
- str
String
操作的字符串 - mask
String
额外需要去除的对应字符 - 返回
Object
合并后的对象去除字符串首尾的空格或者其他字符串
var str = '$ hello world ';
console.log( s94.trim(str) );//打印$ hello world
console.log( s94.trim(str, 'd$') );//打印hello worl
s94.reparam(str)
- str
String
操作的字符串 - 返回
Object
转化后的对象把urlparam类型字符串转化成对象
var str = 'name=name1&pass=123456';
console.log( s94.reparam(str) );//打印{name: "name1", pass: "123456"}
//比较复杂的
var str = 'a=a&arr[]=1&arr[]=2&arr[]=3&obj[a]=1&obj[b]=2';
console.log( s94.reparam(str) );//打印{a: "a", arr: Array(3), obj: {…}}
s94.param(obj)
- str
String
操作的对象 - 返回
Object
转化后的字符串把对象转化成urlparam类型字符串
var str = 'name=name1&pass=123456';
var obj = s94.reparam(str);
console.log( obj );//打印{name: "name1", pass: "123456"}
console.log( s94.param(obj) );//打印name=name1&pass=123456
//比较复杂的
var obj = {
a: 'a',
arr: [1,2,3],
obj: {a:1, b:2}
}
var str = s94.param(obj);
console.log( str );//打印a=a&arr[0]=1&arr[1]=2&arr[2]=3&obj[a]=1&obj[b]=2
s94.url(str, base)
- str
String
是一个表示绝对或相对 URL字符串 - base
String
如果str是一个相对URL,将以此地址为基础 - 返回
URL
URL对象,包含字段有href,protocol,username,password,host,hostname,port,origin,pathname,search,hash创建URL对象
s94.url('../index.html', 'http://localhost/html/s94.html');
// hash: ""
// host: "localhost"
// hostname: "localhost"
// href: "http://localhost/index.html"
// origin: "http://localhost"
// password: ""
// pathname: "/index.html"
// port: ""
// protocol: "http:"
// search: ""
// searchParams: URLSearchParams {}
// username: ""
s94.encode(data)
- data
Object
编码对象 - 返回
String
编码后的编码成36位字符串(包含小写英文、数字)把data编码成36位字符串(包含小写英文、数字),主要是用来压缩对象,并且避免重复
console.log(s94.encode('123'));//打印1e3h5k6789abcdefghijklmnopqrstuvwxyz
console.log(s94.encode('321'));//打印1g3h5i6789abcdefghijklmnopqrstuvwxyz
var obj = {
a: 'a',
arr: [1,2,3],
obj: {a:1, b:2}
}
console.log(s94.encode(obj));//打印6w568l9dfqidknk0kxoanoptqtvjxpzz0z11
new s94.Cache(engine)
- engine
Object
设定的Cache的引擎,包含方法setItem、getItem、removeItem参考Storage。默认为window.sessionStorage - 返回
Object
缓存示例,包含:- get(name, def) 获取缓存名为
name
的缓存值,如果缓存不存在,返回def
- set(kv, timeout) 按
kv
的键值关系设定缓存,键和值分别表示缓存名和对应的值,timeout
为过期的时间戳(毫秒),判定为false时表示永久 -remove(name) 移除缓存缓存name
- get(name, def) 获取缓存名为
s94.cache(name_kv, def_timeout)
- name_kv
String|Object
缓存名称或者设定缓存的键值对象。如果传入String
表示获取缓存的name
,如果传入键值对象,表示设定缓存的ky
- def_timeout
mixed
获取缓存的缺省值def
,或者缓存过期的时间戳timeout
- engine
Object
设定的Cache的引擎 - 返回
mixed
如果是获取缓存,返回对应的缓存值,如果缓存数据不存在,返回缺省值。如果传入value,返回underfind
s94.cache.remove(name, engine)
- name
String
缓存名称 - engine
Object
设定的Cache的引擎 - 返回
Underfind
缓存数据或者提取缓存的数据
s94.cache({'name1':123}); console.log(s94.cache('name1'));//打印123 s94.cache.remove('name1');//移除缓存
//使用其他引擎-方式1 var c = new s94.Cache(localStorage); c.set({'name2':456}); console.log(c.get('name2'));//打印456 c.remove('name2');//移除缓存 //使用其他引擎-方式2 s94.cache({'name3':789}, 0, localStorage); console.log(s94.cache('name3', undefined, localStorage));//打印789 s94.cache.remove('name3', localStorage);//移除缓存
//使用自定义引擎 var engine = { setItem: function(keyName, keyValue){ //设定缓存操作... }, getItem: function(keyName){ //获取缓存操作... }, removeItem: function(keyName){ //移除缓存操作... } } s94.cache({'name4':789}, 0, engine); //。。。。。。
<p id="date"></p>
## **s94.date(fmt[, time])**
- fmt `String` 格式化样式模板,如果模板需要[YMDHISWymdhisw]字符串的,需要在前面加\
- Y|y 表示年份
- M|m 表示月份(1-12),大写的表示有前导0的,
- D|d 表示当月的第几天(1-31),大写的表示有前导0的,
- H|h 表示小时数量(0-23),大写的表示有前导0的,
- I|i 表示分钟(0-59),大写的表示有前导0的,
- S|s 表示秒(0-59),大写的表示有前导0的,
- W|w 表示星期几,大写的表示汉字的(一-日),小写的表示数字(1-7)
- time `String|Number` 需要格式化的时间,参数格式参考[new Date()](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date),默认为当前时间
- 返回 `String` 格式化后的时间日期字符串
>格式化时间日期
```js
console.log( s94.date( 'Y-M-D H:I:S') );//打印2022-06-15 09:11:18
//指定时间
console.log( s94.date( 'Y-M-D H:I:S', 1655255526000) );//打印2022-06-15 09:12:06
console.log( s94.date( 'Y-M-D H:I:S', '2022-06-15T09:12:06') );//打印2022-06-15 09:12:06
//模板中需要[YMDHISWymdhisw]字符串
console.log( s94.date( '<\\span>m-d W</\\span>', 1655255526000) );//打印<span>6-15 三</span>
s94.strtodate(str, fmt)
- str
String
转化的字符串 - fmt
String
格式化样式模板,格式等同s94.date - 返回
Date
日期对象格式化时间日期
var str = s94.date( 'Y-M-D H:I:S');
console.log( s94.strtodate( str, 'Y-M-D H:I:S') );//打印Wed Jun 15 2022 09:12:06 GMT+0800 (中国标准时间)
//字符串中没有指定的数据,会按最小值替换
console.log( s94.strtodate('<span>09:12:06</span>', '<\\span>H:I:S</\\span>') );//打印Thu Jan 01 1970 09:12:06 GMT+0800 (中国标准时间)
3 days ago
4 days ago
4 days ago
21 days ago
21 days ago
24 days ago
26 days ago
26 days ago
26 days ago
28 days ago
29 days ago
29 days ago
30 days ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
4 months ago
4 months ago
4 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
6 months ago
5 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago