增加 lay 模块部分函数 JSDoc 注释和示例

This commit is contained in:
sight 2023-10-22 07:07:03 +08:00
parent 6aebbbbc38
commit 04394340a5

View File

@ -7,7 +7,10 @@
var MOD_NAME = 'lay'; // 模块名
var document = window.document;
// 元素查找
/**
* 元素查找
* @param {string | HTMLElement | JQuery} selector
*/
var lay = function(selector){
return new Class(selector);
};
@ -49,8 +52,15 @@
Class.fn = Class.prototype = [];
Class.fn.constructor = Class;
// 普通对象深度扩展
/**
* 将两个或多个对象的内容深度合并到第一个对象中
* @callback ExtendFunc
* @param {*} target - 一个对象
* @param {...*} objectN - 包含额外的属性合并到第一个参数
* @returns {*} 返回合并后的对象
*/
/** @type ExtendFunc*/
lay.extend = function(){
var ai = 1;
var length;
@ -77,7 +87,10 @@
return args[0];
};
// ie 版本
/**
* IE 版本
* @type {string | boolean} - 如果是 IE 返回版本字符串否则返回 false
*/
lay.ie = function(){
var agent = navigator.userAgent.toLowerCase();
return (!!window.ActiveXObject || "ActiveXObject" in window) ? (
@ -98,8 +111,18 @@
return this;
};
// 数字前置补零
/**
* 数字前置补零
* @param {number | string} num - 原始数字
* @param {number} [length=2] - 数字长度如果原始数字长度小于 length则前面补零
* @returns {string} 返回补 0 后的数字
* @example
* ```js
* lay.digit(6, 2); // "06"
* lay.digit('7', 3); // "007"
* ```
*/
lay.digit = function(num, length){
if(!(typeof num === 'string' || typeof num === 'number')) return '';
@ -112,7 +135,16 @@
return num < Math.pow(10, length) ? str + num : num;
};
// 创建元素
/**
* 创建元素
* @param {string} elemName - 元素的标签名
* @param {{attrName: string, attrValue:string}} [attr] - 添加到元素上的属性
* @returns {HTMLElement} 返回创建的 HTML 元素
* @example
* ```js
* lay.elem('div', {id: 'test'}) // <div id="test"></div>
* ```
*/
lay.elem = function(elemName, attr){
var elem = document.createElement(elemName);
lay.each(attr || {}, function(key, value){
@ -121,12 +153,43 @@
return elem;
};
// 当前页面是否存在滚动条
/**
* 当前页面是否存在滚动条
* @returns {boolean} 是否存在滚动条
* @example
* ```
* lay.hasScrollbar() // true 或 false
* ```
*/
lay.hasScrollbar = function(){
return document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight);
};
// 获取 style rules
/**
* 获取 style rules
* @param {HTMLStyleElement} style - HTMLStyle 元素
* @param {(ruleItem: CSSStyleRule, index: number) => boolean} [callback] - 用来返回 style 元素中的每个 `style rule` 的函数返回 true 终止遍历
* @returns {CSSRuleList } 返回 `style rules`
* @example
* ```
* <style id="test">
* .lay-card{
* color: #000;
* }
* .lay-btn-success{
* color: green;
* }
* </style>
*
* lay.getStyleRules($('#test')[0], function(rule, index){
* if(rule.selectorText === '.lay-card'){
* console.log(index, rule.cssText) // 0 '.lay-card{color: #000}'
* rule.style.color = '#EEE';
* return true; // 终止遍历
* }
* }) // RuleList
* ```
*/
lay.getStyleRules = function(style, callback) {
if (!style) return;
@ -142,7 +205,26 @@
return rules;
};
// 创建 style 样式
/**
* 创建 style 样式
* @param {Object} options - 可配置的选项
* @param {string | HTMLElement | JQuery} [options.target] - 目标容器指定后会将样式追加到目标容器
* @param {string} [options.id] - 样式元素的 id默认自增
* @param {string} options.text - 样式内容
* @returns {HTMLStyleElement} 返回创建的样式元素
* @example
* ```html
* <div id="targetEl">
* <!-- 样式追加到目标容器 -->
* <style id="LAY-STYLE-DF-0">.card{color: #000}</style>
* </div>
*
* lay.style({
* target: '#targetEl',
* text: '.card{color: #000}'
* }) // <style id="LAY-STYLE-DF-0">.card{color: #000}</style>
* ```
*/
lay.style = function(options){
options = options || {};
@ -176,7 +258,37 @@
return style;
};
// 元素定位
/**
* 将元素定位到指定目标元素附近
* @param {HTMLElement} target - 目标元素
* @param {HTMLElement} elem - 定位元素
* @param {Object} [opts] - 可配置的选项
* @param {'absolute' | 'fixed'} [opts.position] - 元素的定位类型
* @param {'left' | 'right'} [opts.clickType="left"] - 点击类型默认为 'left'如果 {@link target} document body 元素则为 'right'
* @param {'left' | 'right' | 'center'} [opts.align="left"] - 对齐方式
* @param {boolean} [opts.allowBottomOut=false] - 顶部没有足够区域显示时是否允许底部溢出
* @param {string | number} [opts.margin=5] - 边距
* @param {Event} [opts.e] - 事件对象仅右键生效
* @param {boolean} [opts.SYSTEM_RELOAD] - 是否重载用于出现滚动条时重新计算位置
* @example
* ```js
* <button id="targetEl">dropdown</button>
* <ul id="contentEl" class="dropdown-menu">
* <li>菜单1</li>
* <li>菜单2</li>
* </ul>
*
* // 下拉菜单将被定位到按钮附近
* lay.position(
* $('#targetEl')[0],
* $('#contentEl')[0],
* {
* position: 'fixed',
* align: 'center'
* }
* )
* ```
*/
lay.position = function(target, elem, opts){
if(!elem) return;
opts = opts || {};
@ -276,7 +388,25 @@
}
};
// 获取元素上的属性配置项
/**
* 获取元素上的属性配置项
* @param {string | HTMLElement | JQuery} elem - HTML 元素
* @param {{attr: string} | string} [opts="lay-options"] - 可配置的选项string 类型指定属性名
* @returns {*} 返回元素上的属性配置项
* @example
* ```js
* <div id="testEl" lay-options="{color:red}" lay-toc="{hot: true}"></div>
*
* var elem = $('#testEl')
* lay.options(elem) // {color:red}
* lay.options(elem[0]) // {color:red}
* lay.options('#testEl') // {color:red}
* lay.options('#testEl', {attr: 'lay-toc'}) // {hot: true}
* lay.options('#testEl', 'lay-toc') // {hot: true}
*
* $('#testEl').attr('lay-toc') // '{hot: true}'
* ```
*/
lay.options = function(elem, opts){
opts = typeof opts === 'object' ? opts : {attr: opts};
@ -297,7 +427,16 @@
}
};
// 元素是否属于顶级元素document 或 body
/**
* 元素是否属于顶级元素document body
* @param {HTMLElement} elem - HTML 元素
* @returns {boolean} 是否属于顶级元素
* @example
* ```js
* lay.isTopElem(document) // true
* ```
*/
lay.isTopElem = function(elem){
var topElems = [document, lay('body')[0]]
,matched = false;
@ -311,7 +450,21 @@
// 剪切板
lay.clipboard = {
// 写入文本
/**
* 写入文本
* @param {Object} options - 可配置的选项
* @param {string} options.text - 写入剪贴板的文本
* @param {() => void} [options.done] - 写入成功/完成回调
* @param {(err?: any) => void} [options.error] - 写入失败回调
* @example
* ```js
* lay.clipboard.writeText({
* text: '测试文本',
* done: function(){ layer.msg('copied')},
* error: function(){ layer.msg('error')}
* })
* ```
*/
writeText: function(options) {
var text = String(options.text);