# LayX
**Repository Path**: rxtech/LayX
## Basic Information
- **Project Name**: LayX
- **Description**: 总有一天,Layx 将成为网页弹窗最佳选择.
- **Primary Language**: JavaScript
- **License**: MIT
- **Default Branch**: master
- **Homepage**: http://monksoul.gitee.io/layx/doc/
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 449
- **Created**: 2018-05-17
- **Last Updated**: 2022-06-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
> Layx 网页弹窗最佳选择.

# 序言
Layx 诞生于一次C/S架构系统往B/S架构系统迁移项目中。起初,我们想在B/S架构上实现类C/S架构窗口功能,但百度、谷歌过后依然没能找到合适的Javascript插件。于是乎在2018年05月01日五一劳动节期间连夜赶工创造出了 Layx 。
目前 Layx 拥有和C/S架构一样灵活的操作方式,支持网页多窗口、多任务协同操作,支持窗口各种事件。
## 信息
- `原创作者`:百小僧
- `开源协议`:MIT
- `当前版本`:v2.0.4
- `发布日期`:2018.05.17
- `交流Q群`:18863883
# 特性
- 纯原生Javascript实现,不依赖任何第三方框架
- 支持IE10+(含IE10)、Chrome、Firefox、Opera、Edge等主流浏览器
- 支持多种窗口类型:`html:文本窗口`,`url:页面窗口`,`alert:提示窗口`,`msg:消息窗口`,`confirm:询问窗口`,`prompt:输入窗口`,`load:加载窗口`
- 支持窗口最大化、最小化、恢复、置顶、关闭控制及事件监听
- 支持窗口阻隔、窗口闪烁功能
- 支持窗口点击标题获取焦点、点击内容/页面获取焦点
- 支持窗口图标定制、操作按钮定制
- 支持窗口四个方向拖动及方向控制
- 支持窗口八个方向拖曳大小及拖曳方向控制
- 支持窗口自动获取页面标题
- 支持窗口位置记录及恢复
- 支持窗口相互通讯
- 支持窗口设定自动关闭
- 支持窗口外观控制、状态栏、透明度控制
- 支持窗口操作拦截器、可以拦截任何不正常操作
- 支持窗口初始化位置、宽高度、最小化宽高度控制
- 支持窗口加载文字控制
- 支持窗口滚动条自能判断
- 支持窗口最小化统一管理
- 支持滚动条智能判断
# 使用
第一步:引入 layx.css / layx.min.css
```
```
第二步:引入 layx.js / layx.min.js
```
```
第三步:打开一个窗口试试
```
layx.open({
id: 'new-window',
title: 'Layx 网页弹窗最佳选择.',
content: 'Hello World!'
});
```

# 示例
[查看更多示例](http://monksoul.gitee.io/layx/doc/)
# 参数
- `id`:窗口唯一Id,String 类型。
- `icon`:窗口图标,Boolean 或 String 类型。false:不启用窗口图标,支持 TEXT/HTML 字符串,默认值:空字符串
- `title`:窗口标题,String 类型。支持 TEXT/HTML 字符串,默认值:空字符串
- `width`:窗口初始化宽度,Number 或 百分比字符串 类型。支持 正整数或 百分比(如:`50%`),默认值:800
- `height`:窗口初始化高度,Number 或 百分比字符串 类型。支持 正整数或 百分比(如:`50%`),默认值:600
- `minWidth`:窗口最小宽度,Number 或 百分比字符串 类型。支持 正整数或 百分比(如:`50%`),默认值:100
- `minHeight`:窗口最小高度,Number 或 百分比字符串 类型。支持 正整数或 百分比(如:`50%`),默认值:100
- `position`:窗口初始化位置,Array[Number/Enum,Number/Enum] 或 Enum 类型。Enum 枚举类型有: `ct:浏览器正中间`、`lt:浏览器左上角`、`rt:浏览器右上角`、`lb:浏览器左下角`、`rb:浏览器右下角`、`lc:浏览器左中间`、`tc:浏览器上中间`、`rc:浏览器右中间`、`bc:浏览器下中间`,也支持自定义上边、左边距离,如:`[100,200]`,表示上边距离100px、左边距离200px,还可以更组合配置,如:`[100,'tc']`,表示顶部中间并距离顶部 100px,默认值:ct
- **`style`**:定义窗口的css样式,通过style可以定制窗口所有的外观属性,是一个非常强大的功能,String 类型。如:`.layx-window:{border-radius:4px;}`默认值:空字符串
- `control`:是否显示控制栏(标题栏),Boolean 类型。默认值:true
- `controlStyle`:控制栏(标题栏)样式,String 类型。支持 `color:#f00;font-size:14px;`,默认值:空字符串
- `bgColor`:窗口背景颜色,String 类型。支持 css 颜色值,透明颜色为:`transparent`,默认值:#fff
- `shadow`:是否显示窗口阴影,Boolean 类型。默认值:true
- `border`:窗口边框,Boolean 或 String 类型。false:不启用边框,默认值:1px solid #3baced
- `type`:窗口类型,Enum 类型。Enum枚举类型有:`html:html窗口`、`url:页面窗口`,默认值:html
- `content`:窗口内容,String 或 HTMLElement 类型。`type:'html'`时有效,支持 TEXT/HTML 字符串,同时也支持 HTMLElement 元素对象,默认值:空字符串
- `url`:窗口页面地址,URL 类型, `type:'url'`时有效,默认值:空字符串
- `useFrameTitle`:是否自动获取 iframe 页面标题设置为当前窗口标题,Boolean 类型,**只支持同域页面标题获取**,默认值:false
- `opacity`:窗口透明度,Float 类型,取值:`0~1`,`0:完全不可见`,`0.5:半透明`,`1:可见`,默认值:1
- `shadable`:是否显示窗口阻隔/遮罩,Boolean 类型。true:阻隔非当前窗口的所有操作直至关闭才释放,默认值:false
- `loaddingText`:窗口内容加载中提示符,String 或 HTMLElement 类型。支持 TEXT/HTML 字符串,同时也支持 HTMLElement 元素对象,默认值:内容正在加载中,请稍后...
- `stickMenu`:是否显示置顶按钮,Boolean 类型。默认值:false
- `stickable`:是否允许置顶操作,Boolean 类型。默认值:true
- `minMenu`:是否显示最小化按钮,Boolean 类型。默认值:true
- `minable`:是否允许最小化操作,Boolean 类型。默认值:true
- `maxMenu`:是否显示最大化按钮,Boolean 类型。默认值:true
- `maxable`:是否允许最大化操作,Boolean 类型。默认值:true
- `closeMenu`:是否显示关闭按钮,Boolean 类型。默认值:true
- `closable`:是否允许关闭操作,Boolean 类型。默认值:true
- `restorable`:是否允许恢复操作,Boolean 类型。默认值:true
- `resizable`:是否允许窗口拖曳调整大小,Boolean 类型。默认值:true
- `resizeLimit`:窗口拖曳调整大小方向限制,Object/Class 类型。可选值:
- `t`:是否限制上边拖曳调整大小,Boolean类型。默认值:false
- `r`:是否限制右边拖曳调整大小,Boolean类型。默认值:false
- `b`:是否限制下边拖曳调整大小,Boolean类型。默认值:false
- `l:`:是否限制左边拖曳调整大小,Boolean类型。默认值:false
- `lt:`:是否限制左上边拖曳调整大小,Boolean类型。默认值:false
- `rt:`:是否限制右上边拖曳调整大小,Boolean类型。默认值:false
- `lb:`:是否限制左下边拖曳调整大小,Boolean类型。默认值:false
- `rb:`:是否限制右下边拖曳调整大小,Boolean类型。默认值:false
- `movable`:是否允许窗口拖动位置,Boolean 类型。默认值:false
- `moveLimit`:窗口拖动方向、范围限制,Object/Class 类型。可选值:
- `vertical`:是否禁止垂直拖动,Boolean类型。默认值:false
- `horizontal`:是否禁止水平拖动,Boolean类型。默认值:false
- `leftOut`:是否允许窗口拖出浏览器左边可视区域,Boolean类型。默认值:true
- `rightOut`:是否允许窗口拖出浏览器右边可视区域,Boolean类型。默认值:true
- `topOut`:是否允许窗口拖出浏览器上边可视区域,Boolean类型。默认值:true,**不管这个值设置为true或false,窗口总时不能拖出浏览器可视区域顶部**
- `bottomOut`:是否允许窗口拖出浏览器下边可视区域,Boolean类型。默认值:true,**下边拖出时至少露出 15px 的窗口可视区域**
- `autodestroy`:窗口自动关闭时间,Boolean 或 Number 类型。false:不自动关闭,Number 类型时表示 **多少毫秒后关闭**,如:5000,表示5秒后自动关闭窗口,默认值:false
- `autodestroyText`:窗口自动关闭提示文字(在窗口右下角显示),Boolean 或 String 类型。false:不显示,默认值:`'
此窗口将在 {second} 秒内自动关闭.
'`,`{second}` 占位符代表 `autodestroy`的秒数
- `focusable`:窗口是否允许获取焦点,Boolean 类型。窗口获取焦点后会自动显示在顶层,默认值:true,**只支持同域页面获取焦点**
- `alwaysOnTop`:是否总是置顶,Boolean 类型。默认值 true,置顶之后将位于所有窗口之上(同级别除外)
- `allowControlDbclick`:是否允许控制栏双击切换窗口大小,Boolean 类型。默认值:true
- `buttons`:窗口按钮组,需设置 `statusBar:true` 才有效,Array(Button) 类型,Button 对象可选值:
- `label`:按钮名称,String 类型
- `callback`:按钮点击回调函数,如:`function(id){}`,id 表示窗口Id,**注意:如果窗口是 prompt 类型时,callback参赛为:function(id, value, textarea){}; id:窗口Id,value:输入框值,textarea:输入框对象**
传入示例:
```
buttons:[
{
label:'确定',
callback:function(id){
// your code...
// 关闭窗口
layx.destroy(id);
}
},
{
label:'取消',
callback:function(id){
// 关闭窗口
layx.destroy(id);
}
}
]
```
如果是 prompt 输入框
```
buttons:[
{
label:'确定',
cackback:function(id,value,textarea){
// your code...
// 关闭窗口
layx.destroy(id);
}
},
{
label:'取消',
cackback:function(id,value,textarea){
// 关闭窗口
layx.destroy(id);
}
}
]
```
- `statusBar`:是否显示窗口状态栏,Boolean 或 String 或 HTMLElement 类型。支持 TEXT/HTML 字符串,同时也支持 HTMLElement 元素对象,默认值:false
- `statusBarStyle`:窗口状态栏样式 ,String 类型。支持 `color:#f00;font-size:14px;`,默认值:空字符串
- `event`:窗口事件,Object/Class 类型。可选值:
- `onload`:内容加载事件,Object/Class 类型。可选值:
- `before`:内容加载之前,Function(layxWindow,winform) 类型,**设置 return false 禁止后续所有操作**
- `after`:内容加载之后,Function(layxWindow,winform) 类型
- `onmin`:窗口最小化事件,Object/Class 类型。可选值:
- `before`:最小化之前,Function(layxWindow,winform) 类型,**设置 return false 禁止后续所有操作**
- `after`:最小化之后,Function(layxWindow,winform) 类型
- `onmax`:窗口最大化事件,Object/Class 类型。可选值:
- `before`:最大化之前,Function(layxWindow,winform) 类型,**设置 return false 禁止后续所有操作**
- `after`:最大化之后,Function(layxWindow,winform) 类型
- `onrestore`:窗口恢复事件,Object/Class 类型。可选值:
- `before`:恢复之前,Function(layxWindow,winform) 类型,**设置 return false 禁止后续所有操作**
- `after`:恢复之后,Function(layxWindow,winform) 类型
- `ondestroy`:窗口关闭事件,Object/Class 类型。可选值:
- `before`:关闭之前,Function(layxWindow,winform) 类型,**设置 return false 禁止后续所有操作**
- `after`:关闭之后,Function() 类型
- `onmove`:窗口拖动事件,Object/Class 类型。可选值:
- `before`:拖动之前,Function(layxWindow,winform) 类型,**设置 return false 禁止后续所有操作**
- `progress`:拖动中,Function(layxWindow,winform) 类型
- `after`:拖动之后,Function(layxWindow,winform) 类型
- `onresize`:窗口拖曳调整大小事件,Object/Class 类型。可选值:
- `before`:拖曳调整大小之前,Function(layxWindow,winform) 类型,**设置 return false 禁止后续所有操作**
- `progress`:拖曳调整大小中,Function(layxWindow,winform) 类型
- `after`:拖曳调整大小之后,Function(layxWindow,winform) 类型
# 对象
## layxWindow
layxWindow 是窗口的 HTMLElment对象
## winform
winform 是窗口信息对象,包含属性:
- `id`:窗口Id
- `windowId`:layxWindow 对象Id
- `window`:layxWindow 对象
- `createDate`:创建时间
- `status`:窗口当前状态:可选值:`normal:正常`、`min:最小化`、`max:最大化`
- `type`:窗口类型,可选值:`html:文本窗口`、`url:页面窗口`
- `area`:窗口位置信息,包含属性:
- `width`:窗口宽度
- `height`:窗口高度
- `minWidth`:窗口最小宽度
- `minHeight`:窗口最小高度
- `top`:窗口上边距离
- `left`:窗口左边距离
- `isStick`:是否置顶状态
- `zIndex`:窗口层级别
- `movable`:窗口是否可拖动位置
- `moveLimit`:窗口拖动位置限制,包含属性:
- `vertical`:是否禁止垂直拖动
- `horizontal`:是否禁止水平拖动
- `leftOut`:是否允许窗口拖出浏览器左边可视区域
- `rightOut`:是否允许窗口拖出浏览器右边可视区域
- `topOut`:是否允许窗口拖出浏览器上边可视区域
- `bottomOut`:是否允许窗口拖出浏览器下边可视区域
- `resizable`:窗口是否可拖曳调整大小
- `resizeLimit`:窗口拖曳调整大小限制,包含属性:
- `t`:是否限制上边拖曳调整大小
- `r`:是否限制右边拖曳调整大小
- `b`:是否限制下边拖曳调整大小
- `l:`:是否限制左边拖曳调整大小
- `lt:`:是否限制左上边拖曳调整大小
- `rt:`:是否限制右上边拖曳调整大小
- `lb:`:是否限制左下边拖曳调整大小
- `rb:`:是否限制右下边拖曳调整大小
- `stickable`:是否允许窗口置顶操作
- `minable`:是否允许窗口最小化操作
- `maxable`:是否允许窗口最大化操作
- `restorable`:是否允许窗口恢复操作
- `closable`:是否允许窗口关闭操作
- `event`:窗口事件,包含属性
- `onload`:内容加载事件
- `before`:内容加载之前
- `after`:内容加载之后
- `onmin`:窗口最小化事件
- `before`:最小化之前
- `after`:最小化之后
- `onmax`:窗口最大化事件
- `before`:最大化之前
- `after`:最大化之后
- `onrestore`:窗口恢复事件
- `before`:恢复之前
- `after`:恢复之后
- `ondestroy`:窗口关闭事件
- `before`:关闭之前
- `after`:关闭之后
- `onmove`:窗口拖动事件
- `before`:拖动之前
- `progress`:拖动中
- `after`:拖动之后
- `onresize`:窗口拖曳调整大小事件
- `before`:拖曳调整大小之前
- `progress`:拖曳调整大小中
- `after`:拖曳调整大小之后
# 方法
- `var version = layx.v`:获取 layx 版本号,返回值:字符串
- `var winform = layx.open(options)`:打开一个窗口,options:配置参数,返回值:winform 对象
- `var winform = layx.html(id,title,content,options)`:打开一个文本窗口,id:窗口Id;title:窗口标题;content:窗口内容;options:配置参数,返回值:winform 对象
- `var winform = layx.iframe(id,title,url,options)`:打开一个网页窗口,id:窗口Id;title:窗口标题;url:窗口地址;options:配置参数,返回值:winform 对象
- `var windows = layx.windows()`:获取所有打开的窗口,返回值:{ 窗口Id:winform对象,窗口Id2:winform对象,...}
- `var winform = layx.getWindow(id)`:获取当前窗口 winform 对象,id:窗口Id
- `layx.destroy(id)`:关闭窗口,id:窗口Id
- `layx.max(id)`:最大化窗口,id:窗口Id
- `layx.setTitle(id,title,useFrameTitle)`:设置窗口标题,id:窗口Id;title:标题,支持html;useFrameTitle:是否自动获取 iframe页面标题填充,默认值:false
- `layx.flicker(id)`:**闪烁窗口**,id:窗口Id
- `layx.restore(id)`:恢复窗口,id:窗口Id
- `layx.updateZIndex(id)`:更新窗口层级别,id:窗口Id
- `layx.updateMinLayout()`:更新窗口最小化排版
- `layx.stickToggle(id)`:窗口置顶切换,id:窗口Id
- `layx.setPosition(id,position)`:设置窗口位置,id:窗口Id;position:见**参数**中position
- `var iframe = layx.getChildContext(id)`:获取 iframe 页面 Window 对象,id:窗口Id,**窗口通讯**
- `var iframeParent = layx.getParentContext(id)`:获取iframe 页面上级 Window 对象 ,id:窗口Id,**窗口通讯**
- `layx.setContent(id, content)`:设置文本窗口内容,id:窗口Id;content:String 或 HTMLElement
- `layx.setUrl(id,url)`:设置页面窗口url地址,id:窗口Id;url:网址 或 文件路径
- `layx.destroyAll()`:关闭所有窗口
- `var winform = layx.msg(msg,options)`:打开一个消息框,msg,消息,String类型;options:配置参数
- `var winform = layx.alert(title,msg,yes,options)`:打开一个提示框,title:提示框标题,String类型;msg,消息,String类型;yes:点击确定回调函数,`function(id){}`;options:配置参数
- `var winform = layx.confirm(title,msg,yes,options)`:打开一个询问框,title:提示框标题,String类型;msg,消息,String类型;yes:点击确定回调函数,`function(id){}`;options:配置参数
- `var winform = layx.prompt(title,msg,yes,options)`:打开一个输入框,title:提示框标题,String类型;msg,消息,String类型;yes:点击确定回调函数,`function(id,value,textarea){}`;options:配置参数
- `var promptTextare = layx.getPromptTextArea(id)`:获取输入框 `textarea` 对象 ,id:窗口Id,通常在 prompt 输入框点击按钮回调函数中使用
- `var winform = layx.load(id,msg,options)`: 打开一个加载框,id:窗口Id;msg,消息,String类型;options:配置参数
# 外观
通过窗口的 `style`属性可以定义窗口的外观,可以定制成任何您需要的样子。如:
```
style:`
#layx-窗口Id{border-radius:4px;-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;}
`
```
窗口css选择器说明:
- `#layx-窗口Id`:特定窗口最外层 `div`
- `.layx-window`:所有窗口最外层 `div`
- `.layx-control-bar`:所有窗口状态栏 `div`,如果需置顶窗口,则:`#layx-窗口Id .layx-control-bar`
- `.layx-title`:所有窗口标题 `div`,指定窗口同上。
- `.layx-inlay-menus`:所有窗口内置按钮(最小化,最大化,置顶、关闭、恢复)外层 `div`,指定窗口同上
...
...
...
如果你想修改更多外观,可以使用 Chrome 浏览器 F12检查元素获取您想要修改部分的标签名,然后写进 `style` 属性即可。如:

# 注意
默认窗口带有点击事件,如果窗口内部包含其他事件打开新窗口,该事件需要取消向上冒泡,如:
```
document.getElementById('btn').onclick=function(e){
e=e||window.event;
// 打开新窗口代码
// 停止冒泡
e.stopPropagation();
}
```
# 日志
```
# 2018.05.17 v2.0.4 发布
- [新增] buttons 配置属性
- [更新] 提示框、询问框、输入框代码
# 2018.05.16 v2.0.3 发布
- [新增] style 参数,可以嵌入css样式表
- [新增] 打开新窗口时如果可视区域小于窗口初始化宽高度,默认最大化
- [修复] 拖动层、拖曳层调整大小多窗口冲突bug
- [修复] 部分浏览器页面窗口不能自适应 bug
- [修复] 文本窗口样式被全局应用 bug
# 2018.05.15 v2.0.2 发布
- [修复] 低版本Chrome 浏览器bug
# 2018.05.15 v2.0.1 发布
- [新增] var winform = layx.html(id,title,content,options) 快捷打开文本窗口方法
- [新增] var winform = layx.iframe(id,title,url,options) 快捷打开网页窗口方法
- [新增] 窗口自动关闭文本可自定义功能:autodestroyText
- [新增] 打开一个存在的窗口时窗口闪烁获取焦点
- [更新] 调整最小化后显示宽度为:240px
- [修复] 点击文本窗口内容无法置顶 bug
- [修复] 置顶按钮点击切换 title 提示 bug
- [修复] 置顶层带有阻隔层时没有阻隔的bug
# 2018.05.12 v2.0.0 发布
- [新增] v2.0.0 正式发布
# 2018.05.06 v1.0.0 发布
- [新增] v1.0.0 正式发布
```
# 开源
- `Gitee`:[https://gitee.com/monksoul/LayX](https://gitee.com/monksoul/LayX)
- `Github` [https://github.com/MonkSoul/Layx](https://github.com/MonkSoul/Layx)
# 捐赠