# basics
**Repository Path**: darth_ef/basics
## Basic Information
- **Project Name**: basics
- **Description**: 提供一些强化js操作和dom操作和bom操作和数学支持。
- **Primary Language**: Unknown
- **License**: LGPL-2.1
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 0
- **Created**: 2021-06-02
- **Last Updated**: 2022-09-11
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 提供一些函数, 全局变量 和 一些类 的js文件
---
# 全局变量
## thisEnvironment
指向当前运行环境
---
## Math.DEG
一度角度对应的弧度 = Math.PI/180
---
##
# 函数
## 什么都不做的空函数 bullFnc
* 顾名思义
---
## 让 dom 停止触发事件
在 dom 事件 中运行
* stopPropagation(e)
阻止事件冒泡
* stopEvent(e)
阻止默认事件发生
* stopPE(e)
阻止冒泡和默认事件
---
## inputSupportsTypeF
## 让控件仅接受数字 inputNumber
* 在 keydown 事件 中运行 inputNumber(e); 可以让控件仅接受数字
---
## 获取当前运行脚本的地址 getCurrAbsPath
* getCurrAbsPath()
---
## 把 url 相对地址转换成绝对地址 rltToAbs
* 例1:
``` javascript
rltToAbs("url","http://127.0.0.1/index")
// "http://127.0.0.1/url"
```
* 例2:
``` javascript
rltToAbs("../../../img/logo.svg","http://127.0.0.1/index/js/basics/basics.js")
// "http://127.0.0.1/img/logo.svg"
```
---
## 数组移动位置 arrayMove
```javascript
// arrayMove(arr,l)
arrayMove([1,2,3,4,5,6],2); // >> [5,6,1,2,3,4]
```
数组移位
@param {Array} arr 数组
@param {Number} l 移动步长
@returns {Array} 返回一个新数组
---
## 对比两个列表项是否相同 arrayEqual
``` javascript
// arrayEqual(a1,a2)
arrayEqual([1,2,3,4,5],[1,2,3,4,5])
arrayEqual([1,2,3,5,4],[1,2,3,4,5])
```
@param {Array} a1 要进行比较的数组
@param {Array} a2 要进行比较的数组
@return {Boolean} 返回是否相同
---
## 对比两个列表项是否相同(不区分项的类型和顺序) arrayDiff
``` javascript
arrayDiff(a1,a2)
```
@param {Array} a1 要进行比较的数组
@param {Array} a2 要进行比较的数组
@return {Boolean} 返回是否相同
---
## 类继承函数 inheritClass
``` javascript
inheritClass(_basics,_derived)
```
将 function 写法的类进行继承
在派生类中不能直接使用 Class.prototype={}
而是使用 Class.prototype.act=function(){/* do something */}
---
## 对部分字符转码 encodeHTML
``` javascript
encodeHTML(str)
```
为了防止服务器出错对部分字符进行编码
@param {String} str <>"'{}[] to ascii;
@returns {String} 转换后的字符串
如果需要修改,请修改下列静态属性
* encodeHTML.regex 存放正则表达式
* encodeHTML.rStrL 存放对应字符
---
## 模板字符串 templateStringRender
``` javascript
templateStringRender(str,that,argArray,opKey="${",edKey="}",opKeyMask='\\',edKeyMask='\\')
```
@param {String} _str 字符串
@param {Object} that this 指针
@param {Array} argArray 实参
@param {String} _opKey 插值关键文本 op
@param {String} _edKey 插值关键文本 ed
@returns {{str:String,hit:Array\< String \>}}
* hit 是被认为是
## 将字符串转换成js的类型 strToVar
将字符串转换成js的类型, 相当于JSON.parse, 如果只是个字符串就是字符串(口胡)
* 参数和 JSON.parse 一样
---
## 添加keyNotBook按键事件 addKeyEvent
``` javascript
addKeyEvent(_Element,_keepFlag,_keycode,_event,_type)
```
@param {Document} _Element 添加事件的元素
@param {Boolean} _keepFlag 是否重复触发事件
@param {Number|Array} _keycode 按键的 keycode 如果是组合键 需要输入数组
@param {function} _event 触发的事件
@param {Boolean} _type false=>down;true=>up
---
## 移除keyNotBook事件 removeKeyEvent
``` javascript
removeKeyEvent(_Element,_keycode,_event,_type)
```
@param {Document} _Element
@param {Number|Array} _keycode
@param {function} _event
@param {Boolean} _type false=>down;true=>up.
---
## 添加resize事件 addResizeEvent
``` javascript
addResizeEvent(_element,_listener)
```
给element添加resize事件, 没有 e 事件参数
@param {Element} _element 绑定的元素
@param {function} _listener 触发的函数
---
# 类
文件中部分的类有使用上面的函数, 它们不能直接拷贝走就使用; 部分类使用了 class 语法, 所以不能在 ie 中使用
---
## UnitBezier 贝塞尔曲线
在 (0,0) 与 (1,1) 之间的三阶贝塞尔曲线
*这个贝塞尔曲线的算法来自网络 详见代码*
* 构造函数 UnitBezier(p1x,p1y,p2x,p2y)
@param {Number} p1x (0,0) 的 控制点 的 x 坐标
@param {Number} p1y (0,0) 的 控制点 的 y 坐标
@param {Number} p2x (1,1) 的 控制点 的 x 坐标
@param {Number} p2y (1,1) 的 控制点 的 y 坐标
* sampleCurveX(t) , sampleCurveY(t)
根据时间柄参数得到x坐标
@param {Number} t 时间柄参数
@returns {Number} x坐标
---
## OlFunction 重载函数
*注意, 该类使用了 class 语法,所以不能直接使用于ie*
没有构造函数, 写成类的语法纯粹是为了让编辑器认代码提示
* 使用 OlFunction.create(defineFnc)创建一个重载函数
@param {function} defaultFnc 当没有和实参对应的重载时默认执行的函数
* 使用 addOverload(parameterType,fnc) 以添加重载
@param {Array} parameterType 形参的类型
@param {function} fnc 执行的函数
后加入的会先运行
* 使用例
``` javascript
var fnc=OlFunction.create(function(){console.log("def")});
fnc.addOverload([String],function(str){console.log(str)});
fnc.addOverload([String,Number],function(str,nub){for(var i=0,iaddKeyEvent(_Element,_keepFlag,_keycode,_event,_type) 来使用这个类
* 构造函数 KeyNotbook()
@param {Element} FElement 加入到的元素
*因为属性没什么被外部使用就不写文档里了*
### 方法
* setDKeyFunc(keycode,func)
添加按键事件
@param {Number|Array} keycode 触发回调的按键 keycode, 接受 数字 或者 数组
@param {function} func 触发后的回调函数
* removeDKeyFunc(_keycode,func)
移除按键事件
@param {Number|Array} _keycode 触发回调的按键 keycode, 接受 数字 或者 数组
@param {function} func 触发后的回调函数
* setKey(e)
按下按键需要触发事件
* removeKey(e)
抬起按键需要触发事件
---
## Stepper 步进器
* 构造函数 Stepper(max,min,now)
@param {Number} max 步进器的最大值
@param {Number} min 步进器的最小值
@param {Number} now 步进器的当前值
### 方法
* toString()返回当前值
* set()
设置当前值
@param {Number} _i 目标
* next(_l)
让步进器步进
@param {Number} _l 步长
@returns {Number} 返回步进后的值
* overflowHanding()
让步进器的溢出值回到范围内
---
## DEF_CUEOBJ 存储 cue 格式为js的obj格式
*注意, 该类使用了 class 语法,所以不能直接使用于ie*
构造函数无参数 请使用 函数 loadCue(str) 创建
### 属性
* @type {String} performer 演出者/作者
* @type {String} songwriter 歌唱者
* @type {String} title 标题
* @type {String} file 文件路径
* @type {String} file_type 文件类型
* @type {String[]} rem 额外指令/注释
* @type {DEF_CUEOBJTrack[]} track 分轨道
### 方法
* selectRem(rem1)
@param {String} rem1 rem 的 第一个指令
* 方法集 setCommand 详见代码
---
## DEF_CUEOBJTrack 在 DEF_CUEOBJ 中的分轨道
*注意, 该类使用了 class 语法,所以不能直接使用于ie*
构造函数
DEF_CUEOBJTrack(file,root,track_index)
@param {String} file 文件路径
@param {DEF_CUEOBJ} root 根 对象
@param {Number} track_index 轨道序号
### 属性
* @type {String} performer 演出者/作者
* @type {String} songwriter 歌唱者
* @type {String} title 标题
* @type {Number} list_index 在 列表 中的序号
* @type {String[]} rem 额外指令/注释
* @type {Number} track_index 轨道序号
* @type {DEF_CUEOBJ} root 根
* @type {String} file 文件路径
* @type {Number} op 在波形文件中的 开始时间(单位 秒)
* @type {Number} ed 在波形文件中的 结束时间(单位 秒)
* @type {Object} index_list 子 index 的列表
### 方法
* getDuration() 获取当前轨道的长度 单位(秒)
---
## DEF_MediaObj 给我的 audio 控制器 用的数据对象
*注意, 该类使用了 class 语法,所以不能直接使用于ie*
构造函数 constructor(src,title)
### 属性
* @type {String} title 标题
* @type {String[]} cover 封面 (url)
* @type {String} artist 艺术家
* @type {String} songwriter 歌唱者
* @type {String} performer 表演者
* @type {String} album 专辑
* @type {Number} op 开始时间
* @type {Number} ed 结束时间
* @type {Number} duration 持续时间
* @type {DEF_MediaObjMarkList} mark 标记集合
* @type {String} urlList 文件 url 列表
### 方法
* 静态方法 f(src,callback)
通过路径创建mediaObj, 并尝试读取 ID3
@param {String} src 媒体的链接
@param {function} callback 读取 id3 之后的回调 callback(rtn{DEF_MediaObj})
* getArtist()
获取 "Artist" 编曲者 and 演唱者
* clone()
克隆
* copy()
拷贝
* getDuration()
获取当前轨道的长度
@param {Audio} audio 当前正在播放这个文件的 Audio 元素
@param {function} _callback _Callback({Number}Duration) 某些情况无法直接获取当前的长度,所以需要传入回调函数接收值
3个重载 fnc(audio) 和 fnc(callback); 用 audio 的重载可以返回长度, 可以不用 callback
---
## DEF_MediaObjMarkList 给媒体做标记的列表
*注意, 该类使用了 class 语法,所以不能直接使用于ie*
构造函数constructor(DEF_MediaObjMarkArray)
DEF_MediaObjMark 的列表
@param {DEF_MediaObjMark[]} DEF_MediaObjMarkArray DEF_MediaObjMark 的数组
### 属性
* @type{DEF_MediaObjMark[]} list 存储着 mark 的 数组
### 方法
* reCount()
重置内容中的所有计数器
* touchMarkByTime(mediaCtrl,time,afterTolerance)
根据时刻触发标记, 如果有两个会被触发 将会仅触发在 list 中靠后的
@param {Exctrl} mediaCtrl 媒体控件
@param {Number} time 时刻
@param {Number} afterTolerance 向后容差 在容差内的时刻也会触发
---
## DEF_MediaObjMark 给 DEF_MediaObj 的时间轴 做标记
构造函数 constructor(command,time,maxTouch)
@param {String} command 遭遇标记指令的
@param {Number} time 时刻
@param {Number} maxTouch 最大触发次数
## hash 监听者的发生器 Hashcaller
*注意, 该类使用了 class 语法,所以不能直接使用于ie*
构造函数constructor(onlyTouchOne=true)
---
## HashListener
# 对已有的类增加功能
## Element.prototype.getChildElement()
获取元素的所有后代元素
## Date.prototype.toString()
* 添加了一个重载 toString(str)
@param {String} str 用%{控制字符}{长度}控制打印字符: Y-年 M-月 D-日 d-星期几 h-小时 m-分钟 s-秒 如果没有写长度将使用自动长度, 如果长度超出将在前面补0; 例: %Y6-%M2-%D -> 001970-01-1