常量定义

  • 红色 = red:红色常量。
  • 绿色 = green:绿色常量。
  • 蓝色 = blue:蓝色常量。
  • 黑色 = black:黑色常量。
  • 白色 = white:白色常量。
  • 灰色 = gray:灰色常量。
  • 透明 = transparent:透明常量。
  • 黄色 = yellow:黄色常量。
  • 橙色 = orange:橙色常量。
  • 紫色 = purple:紫色常量。
  • 青色 = cyan:青色常量。
  • 粉色 = pink:粉色常量。
  • 棕色 = brown:棕色常量。
  • 银色 = silver:银色常量。
  • 金色 = gold:金色常量。
  • 浅灰 = lightgray:浅灰色常量。
  • 深灰 = darkgray:深灰色常量。
  • 浅蓝 = lightblue:浅蓝色常量。
  • 深蓝 = darkblue:深蓝色常量。
  • 浅绿 = lightgreen:浅绿色常量。
  • 深绿 = darkgreen:深绿色常量。
  • 浅红 = lightcoral:浅红色常量。
  • 深红 = crimson:深红色常量。
  • 字体_超小 = xx-small:超小字体大小。
  • 字体_特小 = x-small:特小字体大小。
  • 字体_小 = small:小字体大小。
  • 字体_中 = medium:中等字体大小。
  • 字体_大 = large:大字体大小。
  • 字体_特大 = x-large:特大字体大小。
  • 字体_超大 = xx-large:超大字体大小。
  • 字体_加大 = larger:相对父元素更大的字体大小。
  • 字体_缩小 = smaller:相对父元素更小的字体大小。
  • 字体样式_斜体 = italic:斜体字体样式。
  • 字体样式_斜体小体大写 = oblique:倾斜字体样式。
  • 字体装饰_下划线 = underline:下划线字体装饰。
  • 字体装饰_上划线 = overline:上划线字体装饰。
  • 字体装饰_删除线 = line-through:删除线字体装饰。
  • 字体装饰_无 = none:无字体装饰。
  • 边距_小 = 5px:小边距值。
  • 边距_中 = 10px:中等边距值。
  • 边距_大 = 20px:大边距值。
  • 背景_居中 = center:背景居中位置。
  • 背景_顶部 = top:背景顶部位置。
  • 背景_底部 = bottom:背景底部位置。
  • 背景_左侧 = left:背景左侧位置。
  • 背景_右侧 = right:背景右侧位置。
  • 背景覆盖 = cover:背景覆盖模式。
  • 背景包含 = contain:背景包含模式。
  • 背景_不重复 = no-repeat:背景不重复。
  • 背景_水平 = repeat-x:背景水平重复。
  • 背景_垂直 = repeat-y:背景垂直重复。
  • 背景_平铺 = repeat:背景平铺重复。
  • 渐变_线性 = linear-gradient:线性渐变。
  • 渐变_径向 = radial-gradient:径向渐变。
  • 渐变_角度 = to right:角度渐变方向。
  • 主轴对齐_起点 = flex-start:主轴起点对齐。
  • 主轴对齐_终点 = flex-end:主轴终点对齐。
  • 主轴对齐_居中 = center:主轴居中对齐。
  • 主轴对齐_分散 = space-between:主轴两端对齐,项目间等距分布。
  • 主轴对齐_平均 = space-around:主轴项目两侧等距分布。
  • 主轴对齐_均匀 = space-evenly:主轴项目均匀分布。
  • 侧轴对齐_起点 = flex-start:侧轴起点对齐。
  • 侧轴对齐_终点 = flex-end:侧轴终点对齐。
  • 侧轴对齐_居中 = center:侧轴居中对齐。
  • 侧轴对齐_拉伸 = stretch:侧轴拉伸对齐。
  • 侧轴对齐_基线 = baseline:侧轴基线对齐。
  • 项目对齐_自动 = auto:项目自动对齐。
  • 项目对齐_拉伸 = stretch:项目拉伸对齐。
  • 项目对齐_居中 = center:项目居中对齐。
  • 项目对齐_起点 = flex-start:项目起点对齐。
  • 项目对齐_终点 = flex-end:项目终点对齐。
  • 项目对齐_基线 = baseline:项目基线对齐。
  • 网格对齐_起点 = start:网格起点对齐。
  • 网格对齐_终点 = end:网格终点对齐。
  • 网格对齐_居中 = center:网格居中对齐。
  • 网格对齐_拉伸 = stretch:网格拉伸对齐。
  • 网格对齐_平均 = space-around:网格平均分布对齐。
  • 网格对齐_分散 = space-between:网格两端对齐。
  • 网格对齐_均匀 = space-evenly:网格均匀分布对齐。
  • 屏幕_小 = 576px:小屏幕断点。
  • 屏幕_中 = 768px:中屏幕断点。
  • 屏幕_大 = 992px:大屏幕断点。
  • 屏幕_超大 = 1200px:超大屏幕断点。
  • 动画_线性 = linear:线性动画时间函数。
  • 动画_缓入 = ease-in:缓入动画时间函数。
  • 动画_缓出 = ease-out:缓出动画时间函数。
  • 动画_缓入缓出 = ease-in-out:缓入缓出动画时间函数。
  • 动画_弹性 = ease:缓动(ease)动画时间函数。
  • 动画_阶梯 = step-start:阶梯式动画时间函数。
  • 动画_反向阶梯 = step-end:反向阶梯动画时间函数。
  • 动画填充_无 = none:无动画填充模式。
  • 动画填充_向前 = forwards:动画结束后保持最终状态。
  • 动画填充_向后 = backwards:动画结束后保持初始状态。
  • 动画填充_向前向后 = both:动画结束后保持最终状态,开始前应用初始状态。
  • 动画状态_运行 = running:动画运行状态。
  • 动画状态_暂停 = paused:动画暂停状态。
  • 动画过渡_平滑 = all 0.3s ease:平滑过渡效果。
  • 动画过渡_快速 = all 0.1s ease:快速过渡效果。
  • 动画过渡_慢速 = all 0.5s ease:慢速过渡效果。
  • 动画过渡_弹性 = all 0.6s cubic-bezier(0.68, -0.55, 0.265, 1.55):弹性过渡效果。
  • 透明度_完全透明 = 0:完全透明。
  • 透明度_半透明 = 0.5:半透明。
  • 透明度_半透明_深 = 0.8:深半透明。
  • 透明度_半透明_浅 = 0.2:浅半透明。
  • 透明度_不透明 = 1:不透明。
  • 阴影_小 = 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24):小阴影效果。
  • 阴影_中 = 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23):中等阴影效果。
  • 阴影_大 = 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23):大阴影效果。
  • 阴影_内嵌 = inset 0 2px 4px rgba(0,0,0,0.25):内嵌阴影效果。
  • 编码_UTF8 = UTF-8:UTF-8字符编码。
  • 编码_GBK = GBK:GBK字符编码。
  • 编码_GB2312 = GB2312:GB2312字符编码。
  • 编码_ASCII = ASCII:ASCII字符编码。
  • 编码_Unicode = Unicode:Unicode字符编码。
  • HTTP_成功 = 200:HTTP成功状态码。
  • HTTP_未找到 = 404:HTTP未找到状态码。
  • HTTP_服务器错误 = 500:HTTP服务器内部错误状态码。
  • HTTP_禁止访问 = 403:HTTP禁止访问状态码。
  • HTTP_未授权 = 401:HTTP未授权状态码。
  • HTTP_请求超时 = 408:HTTP请求超时状态码。
  • HTTP_请求体过大 = 413:HTTP请求体过大状态码。
  • HTTP_请求地址过长 = 414:HTTP请求地址过长状态码。
  • 日期格式_标准 = yyyy-MM-dd:标准日期格式。
  • 日期格式_中文 = yyyy年MM月dd日:中文日期格式。
  • 日期格式_美式 = MM/dd/yyyy:美式日期格式。
  • 日期格式_欧式 = dd/MM/yyyy:欧式日期格式。
  • 时间格式_24小时 = HH:mm:ss:24小时制时间格式。
  • 时间格式_12小时 = hh:mm:ss a:12小时制时间格式。
  • 日期时间格式_完整 = yyyy-MM-dd HH:mm:ss:完整日期时间格式。
  • 日期时间格式_中文完整 = yyyy年MM月dd日 HH时mm分ss秒:中文完整日期时间格式。
  • 数字格式_整数 = #:整数数字格式。
  • 数字格式_两位小数 = #.00:两位小数数字格式。
  • 数字格式_百分比 = #.00%:百分比数字格式。
  • 数字格式_千分位 = #,###:千分位数字格式。
  • 数字格式_货币 = ¥#,###.00:货币数字格式。
  • 数字格式_科学计数 = #.###E+00:科学计数法数字格式。
  • 匹配父 = inherit:设置组件的宽高继承父控件对应的尺寸值。
  • 自适应 = initial:设置组件的宽高等于其组件中内容的宽高。
  • 百分百 = 100%:设置组件的宽高为“100%”。
  • 边框_点线 = dotted:点线边框。
  • 边框_虚线 = dashed:虚线边框。
  • 边框_实线 = solid:实线边框。
  • 边框_双线 = double:双线边框。
  • 边框_凹槽 = groove:3D凹槽边框。
  • 边框_垄状 = ridge:3D垄状边框。
  • 边框_内嵌 = inset:3D inset边框。
  • 边框_外凸 = outset:3D outset边框。
  • 居中 = center:设置组件中的内容水平居中。
  • 靠左 = left:设置组件中的内容靠左对齐。
  • 靠右 = right:设置组件中的内容靠右对齐。
  • 两端对齐 = justify:设置组件中的内容两端对齐。
  • 顶边对齐 = top:设置组件中的内容顶边对齐。
  • 垂直居中 = middle:设置组件中的内容垂直居中。
  • 底边对齐 = bottom:设置组件中的内容底边对齐。
  • 显示_块 = block:设置组件显示模式为块级元素。
  • 显示_行内 = inline:设置组件显示模式为行内元素。
  • 显示_行内块 = inline-block:设置组件显示模式为行内块元素。
  • 隐藏元素 = none:设置组件隐藏不显示。
  • 布局_弹性 = flex:设置组件布局为弹性布局。
  • 布局_网格 = grid:设置组件布局为网格布局。
  • 静态定位 = static:设置组件定位为静态定位。
  • 相对定位 = relative:设置组件定位为相对定位。
  • 绝对定位 = absolute:设置组件定位为绝对定位。
  • 固定定位 = fixed:设置组件定位为固定定位。
  • 粘性定位 = sticky:设置组件定位为粘性定位。
  • 布局方向_垂直 = column:设置当前组件或布局中的子组件或内容从上到下排列。
  • 布局方向_水平 = row:设置当前组件或布局中的子组件或内容从左到右排列。
  • 布局方向_从下向上 = column-reverse:设置当前组件或布局中的子组件或内容从下到上排列。
  • 布局方向_从右向左 = row-reverse:设置当前组件或布局中的子组件或内容从右到左排列。
  • 文本输入 = text:设置输入框类型为文本输入。
  • 密码输入 = password:设置输入框类型为密码输入。
  • 数字输入 = number:设置输入框类型为数字输入。
  • 邮箱输入 = email:设置输入框类型为邮箱输入。
  • 电话输入 = tel:设置输入框类型为电话输入。
  • 日期输入 = date:设置输入框类型为日期输入。
  • 文件上传 = file:设置输入框类型为文件上传。
  • 默认鼠标 = default:设置鼠标样式为默认箭头。
  • 指针鼠标 = pointer:设置鼠标样式为手形指针。
  • 文本鼠标 = text:设置鼠标样式为文本输入I型。
  • 等待鼠标 = wait:设置鼠标样式为等待状态。
  • 禁止鼠标 = not-allowed:设置鼠标样式为禁止操作状态。
  • 溢出隐藏 = hidden:设置内容溢出时隐藏。
  • 溢出滚动 = scroll:设置内容溢出时显示滚动条。
  • 溢出显示 = visible:设置内容溢出时仍然显示。
  • 当前窗口 = _self:设置链接在当前窗口打开。
  • 新窗口 = _blank:设置链接在新窗口打开。
  • 正常粗细 = normal:设置字体粗细为正常。
  • 粗体 = bold:设置字体粗细为粗体。
  • 较粗 = bolder:设置字体比父元素更粗。
  • 较细 = lighter:设置字体比父元素更细。
  • 引号 = \":英文模式下的双引号“"”。

语言关键字

  • 英文: ||
  • 说明: 逻辑‘或’运算符,用于条件判断,遵循短路求值原则,当任一操作数为真时返回真,否则返回假,常用于条件分支和默认值设置。
' 比较两个值,如果有一方符合条件则为真
变量 a = 20
变量 b = 50
如果(a > 10 或 b < 30)
	调试输出("条件为真")
否则
	调试输出("条件为假")
结束 如果

  • 英文: &&
  • 说明: 逻辑‘与’运算符,用于条件判断,遵循短路求值原则,当所有操作数都为真时返回真,否则返回假,常用于多重条件判断。
' 比较两个值,必须两方都符合条件才为真
变量 a = 20
变量 b = 50
如果(a > 10 且 b < 100)
	调试输出("条件为真")
否则
	调试输出("条件为假")
结束 如果

  • 英文: null
  • 说明: 空值,表示有意缺少的对象值,使用‘取数据类型’ 函数返回 'object',是 JavaScript 的历史遗留问题,用于显式表示变量未指向任何对象或值。
' 设置变量默认初始值为空
变量 a = 空
如果(a == 空)
	调试输出("a为空对象:" + 取数据类型(a))
否则
	调试输出("a不为空")
结束 如果

  • 英文: true
  • 说明: 布尔类型的真值,表示逻辑真,注意在条件判断中所有真值都会转换为‘true’,包括非空字符串、非零数字等。
' 设置变量默认初始值为真
变量 a = 真
如果(a == 真)
	调试输出("a为真")
否则
	调试输出("a不为真")
结束 如果

  • 英文: false
  • 说明: 布尔类型的假值,表示逻辑假,在条件判断中所有假值都会转换为‘false’,包括 0、空字符串、null、undefined等。
' 设置变量默认初始值为假
变量 a = 假
如果(a == 假)
	调试输出("a为假")
否则
	调试输出("a不为假")
结束 如果

类属

  • 英文: instanceof
  • 说明: 类型判断运算符,用于检测指定实例对象是否属于某个数据类型,语法:对象实例 类属 类型,返回布尔值表示是否属于该类型。
' 判断窗口中某个组件是否属于按钮类型
如果(按钮1 类属 按钮)
	调试输出("按钮1属于按钮类型")
否则
	调试输出("按钮1不属于按钮类型")
结束 如果

变量

  • 英文: let
  • 说明: 块级作用域变量声明关键字,声明的变量只在当前代码块内有效。
' 定义变量
变量 a = 10
调试输出(a) ' 输出10
' 定义数组
变量 b = [1,2,3]
调试输出(b) ' 输出[1,2,3]
' 定义对象
变量 c = { X:10,Y:20 }
调试输出(c)

判断

  • 英文: switch
  • 说明: 多分支条件语句,用于基于不同条件执行不同代码块,使用严格相等(===)进行比较,注意:该语句没有“默认”分支。
变量 时间 = 3
判断(时间)
	分支 1
		调试输出("星期一")
	分支 2
		调试输出("星期二")
	分支 3
		调试输出("星期三")
	分支 4
		调试输出("星期四")
	分支 5
		调试输出("星期五")
结束 判断

分支

  • 英文: case
  • 说明: 判断语句中的条件分支标记,用于指定匹配值,匹配成功后执行分支中的代码。
变量 时间 = 3
判断(时间)
	分支 1
		调试输出("星期一")
	分支 2
		调试输出("星期二")
	分支 3
		调试输出("星期三")
	分支 4
		调试输出("星期四")
	分支 5
		调试输出("星期五")
结束 判断

如果

  • 英文: if
  • 说明: 条件判断语句,根据条件表达式的结果决定是否执行代码块,可配合否则实现分支逻辑,是程序流程控制的基础结构。
' 条件判断
变量 a = 20
如果(a > 10)
	调试输出("a大于10")
否则
	调试输出("a不大于10")
结束 如果

否则

  • 英文: else
  • 说明: 条件语句的可选部分,当前面的‘如果’条件不满足时执行。
' 条件判断
变量 a = 5
如果(a > 10)
	调试输出("a大于10")
否则 如果(a < 5)
	调试输出("a小于5")
否则
	调试输出("a为其它区间值")
结束 如果

结束

  • 英文: end
  • 说明: 流程控制及标识函数,事件,定义等代码结束位置的关键字,用于显式指定代码块结尾。
' 结束关键字用于结束各种流程控制结构及标识语句结尾
如果(真)
	调试输出("条件为真")
结束 如果
' 标识函数结尾
函数 函数名称()
	调试输出("自定义函数")
结束 函数

退出

  • 英文: break
  • 说明: 退出循环控制语句,用于立即终止并退出循环。
变量 计次  = 0
判断循环(计次 < 10)
	' 当执行第5次循环的时候、提前结束并退出循环
	' 退出循环后、将不再执行后续的循环
	如果(计次 == 5)
		退出
	否则
		' 执行语句
	结束 如果
	计次 = 计次 + 1
结束循环

跳过

  • 英文: continue
  • 说明: 跳出循环控制语句,用于立即跳出当前这一次循环,而执行下一次(后续)的循环。
变量循环(索引 = 0,10,1)
	' 当 索引 等于 5 的时候、程序将跳过本次循环,不再执行本次循环后面的代码
	' 但下一次循环仍会继续
	如果(索引 == 5)
		跳过
	结束 如果
	调试输出("索引 = " + 索引)
结束循环

静态

  • 英文: static
  • 说明: 成员修饰符,在类中使用该修饰符的变量或函数,在使用时不需要创建类型或模块对象,直接使用类名调用即可。注意:网页中的普通JS脚本模块不需要静态修饰,在页面中引用脚本后,可以直接使用变量或函数。
' 使用面向对象方式在自定义类中声明静态变量或函数
定义 公用模块1 为 类
	' 定义一个静态变量,静态函数
	变量 静态 URL地址 = "http://www.vcnstudio.com"
	函数 静态 计算圆形面积(半径)
		返回 3.14 * 半径 * 半径
	结束 函数
结束 定义
' 调用静态方法,无需创建实例
变量 结果 = 公用模块1.计算圆形面积(10)
调试输出(结果)

创建

  • 英文: new
  • 说明: 对象实例化运算符,用于创建类型的实例对象。
' 创建一个按钮对象
变量 按钮1 = 创建 按钮()
按钮1.文本 = "点击我"
添加组件(按钮1)
调试输出(按钮1.文本)

事件

  • 英文: event
  • 说明: 定义接收事件语句的关键字,用于接收并处理指定组件的事件,轻语言是事件驱动语言,代码由用户操作或系统事件触发执行。
' 定义接收“按钮1被单击”的事件、回调参数请参考组件的回调接口(interface)中的事件(event)定义
事件 按钮1.被单击(源对象,事件源)
	调试输出("按钮1 被单击")
结束 事件

函数

  • 英文: function
  • 说明: 定义函数的关键字,创建可重复调用的代码块,支持参数、返回值等特性。
' 函数声明
函数 计算和(参数1, 参数2)
	返回 参数1 + 参数2
结束 函数
' 调用函数
变量 结果 = 计算和(10, 20)
调试输出("计算结果: " + 结果)

未定义

  • 英文: undefined
  • 说明: 表示声明但未赋值的变量或对象,与‘空’的区别在于‘未定义’表示未初始化,‘空’表示空对象引用。
' 声明但未赋值的变量
变量 未赋值变量
调试输出("变量值: " + 未赋值变量) ' 输出: 变量值: 未定义
调试输出("数据类型: " + 取数据类型(未赋值变量)) ' 输出: 数据类型: undefined
' 检查变量是否未定义
如果(未赋值变量 == 未定义)
	调试输出("变量确实未定义")
结束 如果

本对象

  • 英文: this
  • 说明: 调用上下文关键字,指向当前代码执行时的上下文对象,例如在类中调用本类中定义的变量,函数。

返回

  • 英文: return
  • 说明: 函数返回语句,终止函数执行并返回指定值。
' 函数返回值或提前终止执行后续语句
函数 计算(数值)
	如果(数值 < 0)
		返回 0 ' 提前返回
	结束 如果
	返回 数值 * 2 ' 返回计算结果
结束 函数
调试输出(计算(5)) ' 输出: 10
调试输出(计算(-1)) ' 输出: 0

变量循环

  • 英文: for
  • 说明: 循环结构,包含初始化、循环次数和增量值三部分。支持‘退出’和‘跳过’控制循环流程,是最常用的循环结构。
' 语法:
' 参数一:初始值、指定从什么值开始循环
' 参数二:目标值、指定循环到小于哪个值就退出循环
' 参数三:递增值、每次执行循环代码后初始变量增加的值
' 示例:初始变量为0、目标值为10、每次循环后初始变量加2、当初始变量小于10时、将会退出循环。
变量循环(计次 = 0, 10, 2) ' 等效于 for (let 计次 = 0; 计次 < 10; 计次 += 2){ }
	' 循环打印输出“计次”的值
	调试输出("计次" + 计次)
结束循环

计次循环

  • 英文:
  • 说明: 简化版变量循环,自动处理计数变量递增,适用于已知次数的循环场景。
' 语法:
' 参数一:总循环次数、指定要循环的总次数
' 参数二:计次变量、循环递增计次的变量、每次递增加1
' 示例:循环 10 次、计次变量从 0 开始、每次计次变量加 1 、当循环 10 次后退出循环。
变量 计次 = 0
计次循环(10,计次)
	' 待循环执行的代码、循环输出 计次 变量的值
	调试输出("计次:" + 计次)
结束循环

判断循环

  • 英文: while
  • 说明: 判断循环,先判断条件再执行循环体,适合不确定循环次数但需要满足条件才执行的场景。
' 语法:
' 参数一:是否符合条件,如果条件为真则执行循环
' 示例:
' 当变量 计次 的值小于10时、则进入循环体内、循环执行代码块内的代码,每次执行完循环代码、让变量计次的值加1;当计次大于10时、不符合条件则不再进入循环体内、程序将跳到结束循环标志、退出循环。
变量 计次 = 0
判断循环(计次 < 10)
	' 循环执行代码、使变量的值加1
	计次 = 计次 + 1
结束循环
调试输出(计次) ' 将输出 10

结束循环

  • 英文:
  • 说明: 循环控制语句,用于标记循环体的结束位置,每个合法,正确的循环体语句:变量循环、计次循环、判断循环 都必须使用‘结束循环’收尾。

文本型

  • 英文: String
  • 说明: 字符串数据类型,表示文本数据(使用引号包裹的常量内容),支持Unicode字符。
' 声明文本型变量,初始值使用引号包裹
变量 姓名 = "张三"
变量 说明 = "这是一个文本型变量示例"
' 文本拼接
变量 全名 = 姓名 + ":" + "李四"
调试输出(全名) ' 输出: 张三:李四
' 文本操作
变量 问候语 = "你好," + 姓名 + "!"
调试输出(问候语)
' 获取文本长度(统计一串文本中有多少个字符)
变量 长度 = 取文本长度(说明)
调试输出("文本长度: " + 长度)
' 查找字符串变量中是否含有‘文本’这两个字
如果(寻找文本(说明, "文本") >= 0)
	调试输出("找到了'文本'关键词")
结束 如果

数值型

  • 英文: number
  • 说明: 数字数据类型,包括整数和小数,采用 IEEE 754 双精度格式存储,支持各种数学运算和类型转换。
' 声明数值型变量,支持整数,小数,负数
变量 整数 = 42
变量 小数 = 3.14159
变量 负数 = -10
' 数值运算操作
变量 和 = 整数 + 小数
变量 差 = 整数 - 10
变量 积 = 小数 * 2
变量 商 = 整数 / 3
调试输出("和: " + 和)
调试输出("差: " + 差)
调试输出("积: " + 积)
调试输出("商: " + 商)
' 数学函数运算
变量 平方根 = 取平方根(整数)
变量 绝对值 = 取绝对值(负数)
调试输出("平方根: " + 平方根)
调试输出("绝对值: " + 绝对值)

逻辑型

  • 英文: boolean
  • 说明: 布尔数据类型,只有‘真’和‘假’两个值,用于条件判断和逻辑运算的基础类型。
' 声明逻辑型变量
变量 a = 真
变量 b = 假
' 逻辑比较运算
变量 与运算 = a 且 b  ' 结果为假
变量 或运算 = a 或 b  ' 结果为真
变量 非运算 = (b == 假) ' 结果为真
调试输出("与运算结果: " + 与运算)
调试输出("或运算结果: " + 或运算)
调试输出("非运算结果: " + 非运算)
' 条件判断中使用逻辑型
如果(a)
	调试输出("条件为真")
结束 如果
' 函数返回逻辑型值
函数 比较数值(值1, 值2)
	返回 值1 > 值2
结束 函数
调试输出("比较结果: " + 比较数值(10, 5)) ' 输出: 比较结果: 真

对象

  • 英文: object
  • 说明: 对象,表示类型的实体,例如:‘按钮’为一个组件类型,‘按钮1’则表示一个按钮的实体对象。
' 创建对象
变量 人员对象 = {姓名: "张三",年龄: 30,职业: "工程师"}
' 访问对象属性
调试输出("姓名: " + 人员对象.姓名)
调试输出("年龄: " + 人员对象.年龄)
' 修改对象属性
人员对象.年龄 = 31
调试输出("新年龄: " + 人员对象.年龄)
' 对象方法
人员对象.介绍 = ()=>{
	返回 "我是" + 本对象.姓名 + ",今年" + 本对象.年龄 + "岁"
}
调试输出(人员对象.介绍())
' 创建并使用组件对象
变量 按钮1 = 创建 按钮()
按钮1.文本 = "点击我"
按钮1.置被单击回调((源对象, 事件源) => {
	调试输出("按钮被点击")
})

域变量

  • 英文: var
  • 说明: 声明函数作用域变量的关键字,使用该关键字定义的变量,只有在函数内部声明时才会被限制作用域;在‘如果/循环/判断’等语句块中定义的变量在其外部也可以被访问,在实际开发中不建议使用该类型变量,日常开发中应优先使用‘变量’关键字定义变量。
' 使用域变量声明
如果(真)
	域变量 a = 10
结束 如果
' 如果语句块内部声明的 a 在外部也可以被访问
调试输出(a)

输出

  • 英文: echo
  • 说明: 后端脚本输出内容指令,该关键字仅可用于在后端脚本中向前端页面输出内容。
' 在后端脚本中使用
输出 "这是一段后端输出的文本内容"

引用

  • 英文: link|require_once
  • 说明: 资源或文件引用指令,在前端页面中用于引入并使用外部的CSS/JS文件,及引用项目中自定义的JSX脚本,CSX样式文件,编译时会自动生成相应的link或script标签,在后端脚本API接口(PHP)代码中引用外部php文件,等价于:“require_once ”。
' 引用外部直链JS文件地址或样式
引用 "https://code.jquery.com/jquery-1.12.4.min.js"
引用 "https://cdn.jsdelivr.net/css/test.min.css"
' 引用项目中的自定义JSX脚本文件及CSX样式表文件
引用 "测试JS.jsx"
引用 "测试CSS.csx"
' 在后端API接口中引用外部PHP
引用 "static/lib.php"

导入

  • 英文: use
  • 说明: 在后端API接口中导入外部PHP文件的命名空间中的类,函数或常量。
' 导入命名空间之前,必须先引用PHP文件,外部PHP文件一般放在项目static文件夹中
引用 "static/Test.php"
' 导入这个php文件中的类,注意:如果没有命令空间,默认无需导入可以直接使用类
导入 "some\namespace\ClassA"

  • 英文: as
  • 说明: 定义变量时显示指定变量类型、虽然在JS中无需显示指定,但在轻语言中显示指定类型可以提高编译时类型安全和支持更准确的编辑时智能提示。
' 定义按钮
变量 按钮1 为 按钮
' 在页面加载完毕中创建 按钮1 的对象
事件 页面加载完毕()
	按钮1 = 创建 按钮()
	按钮1.文本 = "按钮1"
结束 事件

轻语言(Qing)语法速查

本速查表适用于所有轻语言(Qing)代码生成场景。
除非用户明确要求,否则你必须严格输出轻语言语法,禁止将其转换为 JavaScript 或 PHP。

📌 快速索引

你想知道什么直接看这里
变量怎么声明一、基础语法
运算符怎么用三、运算符
三种循环怎么选四、流程控制
函数怎么定义五、函数
事件怎么用六、事件
拉姆达表达式八、拉姆达表达式
变量作用域九、变量作用域
哪些语句需要结束关键字十二、结束语句块规则

一、基础语法

功能轻语言语法错误示例(禁止)
变量声明变量 a = 10let a = 10
赋值语句a = 20a := 20
注释' 这是注释// 注释/* 注释 */
语句结束换行符结束语句❌ 分号 ;
允许调用JS/PHP原生函数console.log("文本")、count(数组)❌ if(条件){}、for(i=0;...;){...}

💡 常量(如 红色主轴对齐_居中)在 XML 中预定义,代码中直接使用即可,无需声明。

二、数据类型

类型轻语言类型名示例
文本文本型变量 姓名 = "张三"
数值数值型变量 年龄 = 25
逻辑逻辑型变量 是否登录 = 真
对象对象变量 用户 = {姓名:"张三"}
数组数组变量 列表 = [1,2,3]
空值变量 数据 = 空
未定义未定义变量 临时变量

三、运算符

功能轻语言语法说明
逻辑与条件1 且 条件2短路求值
逻辑或条件1 或 条件2短路求值
逻辑非!条件取反,也可写作 条件 == 假
等于a == b值相等
不等于a != b值不相等
大于a > b数值型比较大小
小于a < b数值型比较大小
大于等于a >= b数值型比较大小
小于等于a <= b数值型比较大小
类型判断对象 类属 类型按钮1 类属 按钮

四、流程控制

条件判断 - 如果语句

如果(条件)
    ' 条件为真时执行
否则 如果(条件2)
    ' 条件2为真时执行
否则
    ' 所有条件都不满足时执行
结束 如果

多分支判断

判断(表达式)
    分支 值1
        ' 匹配值1时执行
    分支 值2
        ' 匹配值2时执行
    分支 默认
        ' 无匹配时执行
结束 判断

三种循环对比

循环类型关键词适用场景退出条件
判断循环判断循环不确定循环次数,只根据条件是否满足决定条件为假时退出
变量循环变量循环明确知道起始值、目标值、步长变量小于目标值时循环,达到目标值退出
计次循环计次循环明确知道需要循环多少次达到指定次数后退出

判断循环(条件循环)

先判断条件,条件为真时进入循环体,否则退出。

判断循环(条件)
    ' 循环体
结束循环

示例:

变量 计次 = 0
判断循环(计次 < 10)
    计次 = 计次 + 1
结束循环
调试输出(计次)  ' 输出 10

⚠️ 使用判断循环时,必须确保条件有机会变为假,否则会导致死循环。

变量循环(计数循环)

指定起始值、目标值和步长,变量小于目标值时循环,达到目标值退出(等效于 for(i=0; i<目标值; i+=步长))。

变量循环(计次 = 0, 10, 2)
    ' 循环体
结束循环

参数说明:

  • 参数一:起始值(从什么值开始)
  • 参数二:目标值(达到什么值退出)
  • 参数三:步长(每次递增的值)

计次循环(简化计数循环)

指定总循环次数,自动从 0 开始递增。

计次循环(总次数, 计次变量)
    ' 循环体
结束循环

示例:

变量 计次 = 0
计次循环(10, 计次)
    调试输出("计次:" + 计次)
结束循环

循环控制

关键字说明
退出立即退出整个循环
跳过跳过本次循环,继续执行下一次循环

💡 区别退出 是“结束整个循环”,跳过 是“不执行本次循环的剩余代码,但继续下一次循环”。调用 跳过 之前的代码仍然会执行。

五、函数

函数定义

函数 函数名(参数1, 参数2)
    ' 函数体
    返回 结果
结束 函数

函数调用

变量 结果 = 函数名(参数1, 参数2)

六、事件

事件有两种等价写法:

风格格式示例
VB6风格事件 组件.事件名(参数)事件 按钮1.被单击(源对象,事件源)
Java风格组件.置{事件名}回调((参数) => {})按钮1.置被单击回调((源对象,事件源) => {})

映射规则:被单击置被单击回调被双击置被双击回调

VB6风格示例

使用场景:仅支持 .spldg 设计文件中的组件使用,代码中创建的组件不支持。

事件 按钮1.被单击(源对象, 事件源)
    弹出提示("按钮被点击")
结束 事件

Java风格示例

使用场景:同时支持 .spldg 设计文件和代码创建的组件。

按钮1.置被单击回调((源对象, 事件源) => {
    弹出提示("按钮被点击")
})

七、对象与类

创建对象

变量 按钮1 = 创建 按钮()

设置属性

按钮1.文本 = "点击我"
按钮1.宽度 = 120

调用方法

按钮1.置被单击回调(回调函数)

八、拉姆达表达式

拉姆达表达式在轻语言中只能作为参数传递,不能赋值给变量。

正确用法

' 作为参数传递给组件方法
组件1.置被单击回调((参数1, 参数2) => {
    语句1
    语句2
})

错误用法(禁止)

' ❌ 不能赋值给变量
变量 回调 = (参数) => 表达式

' ❌ 不能作为变量初始值
变量 回调 = (参数) => {
    语句1
}

拉姆达表达式的任何语句体(包含单行语句)必须使用花括号 {} 包裹。

九、变量作用域

关键字作用域说明
变量块级作用域如果循环 等代码块内声明的变量,外部不可访问
域变量函数级作用域(建议避免使用)在代码块内声明的变量,外部也可访问,易造成命名冲突

💡 日常开发中应优先使用 变量,仅在特殊场景下使用 域变量

十、常用内置函数

分类函数名说明
字符串取文本长度(内容)获取文本字符数
字符串寻找文本(源, 目标)查找子文本位置
字符串分割文本(源, 分隔符)分割为数组
数组取数组成员数(数组)获取数组长度
数组添加成员(数组, 值)追加元素
数学取绝对值(值)取绝对值
数学取随机整数(最小, 最大)生成随机整数
时间取现行时间()获取当前时间字符串
对象取数据类型(值)获取值类型
JSONJSON解析(文本)解析JSON为对象
JSONJSON编码(对象)编码对象为JSON
存储保存配置(键, 值)保存到localStorage
存储读取配置(键)读取localStorage

💡 以上仅为常用函数,完整列表请参考 前端(JavaScript)函数 相关文档。

十一、语句块嵌套规则

轻语言支持语句块无限嵌套,但必须注意:

  1. 嵌套层次不宜过深:建议不超过 3-4 层,以免影响可读性
  2. 结束关键字匹配:每个开始关键字必须与其对应的结束关键字匹配,嵌套时注意层级对应

示例

如果(条件)
    ' 外层条件
    变量循环(计次 = 0, 10, 1)
        ' 内层循环
        如果(内层条件)
            ' 内层判断
        结束 如果
    结束循环
结束 如果

十二、结束语句块规则

在轻语言中,所有流程控制语句、函数、事件等代码块,必须使用对应的关键字显式标记结束位置

规则表

语句块类型开始关键字结束关键字示例
条件判断如果(条件)结束 如果如果(条件) ... 结束 如果
多分支判断判断(表达式)结束 判断判断(值) ... 结束 判断
计数循环变量循环(...)结束循环变量循环(...) ... 结束循环
简化计数循环计次循环(...)结束循环计次循环(...) ... 结束循环
条件循环判断循环(条件)结束循环判断循环(条件) ... 结束循环
函数定义函数 函数名(...)结束 函数函数 函数名(...) ... 结束 函数
事件定义事件 组件名.事件名(...)结束 事件事件 按钮1.被单击(...) ... 结束 事件

重要说明

  1. 所有控制语句都必须显式结束:轻语言不支持类似 C/Java 中使用花括号 {} 隐式界定代码块的方式。

  2. 结束关键字必须与开始关键字匹配

    • 如果结束 如果(不可写成 结束如果,中间必须有空格)
    • 函数结束 函数
    • 事件结束 事件
    • 判断结束 判断
    • 三种循环(变量循环计次循环判断循环)→ 统一使用 结束循环
  3. 结束循环 是三种循环的通用结束标记,无论使用哪种循环开始,都用 结束循环 收尾。

正确示例

' 如果语句
如果(条件)
    ' 执行代码
否则 如果(条件2)
    ' 执行代码
否则
    ' 执行代码
结束 如果

' 变量循环
变量循环(计次 = 0, 10, 1)
    ' 循环体
结束循环

' 函数定义
函数 计算(参数1, 参数2)
    变量 结果 = 参数1 + 参数2
    返回 结果
结束 函数

' 事件定义
事件 按钮1.被单击(源对象, 事件源)
    弹出提示("按钮被点击")
结束 事件

错误示例(禁止)

' ❌ 错误:缺少结束标记
如果(条件)
    ' 执行代码

' ❌ 错误:结束标记不匹配
函数 计算(参数)
    ' 函数体
结束 如果

' ❌ 错误:循环使用了错误的结束标记
变量循环(计次 = 0, 10, 1)
    ' 循环体
结束 变量循环

💡 规则总结:任何 如果函数事件定义判断 以及三种循环语句,都必须使用对应的结束关键字收尾。这是轻语言语法的基础规则,AI 在生成代码时必须严格遵守。

十三、其它重要规则

  1. 语句结束符:轻语言使用换行符作为语句结束符,不使用分号。
  2. 注释:使用 ' 开头(单引号+空格),不支持 ///* */
  3. 关键字:所有流程控制关键字均为中文(如 如果否则结束)。
  4. 事件回调置{事件名}回调 是固定命名规则,不可自由命名。
  5. 拉姆达:拉姆达待执行语句必须使用 {} 包裹代码块。
  6. 空值判断:使用 表示空对象,未定义 表示未初始化的变量。
  7. 类型判断:使用 对象 类属 类型 判断对象类型。

AI 使用指南

  1. 当用户要求编写轻语言代码时,必须严格遵循本速查表中的轻语言语法规则
  2. 禁止使用 JavaScript 或 PHP 的语句结构(如 if()for()function() {}returnclass 等英文关键字)。
  3. 允许调用 JavaScript 或 PHP 的原生内置函数(如 console.log()count()json_encode() 等),这些是运行时环境提供的功能,可以直接在轻语言代码中使用。
  4. 如果用户明确要求使用其他语言,则按用户要求执行,无需遵循本规则。

相关文档

  • 文档轻语言网站:变量与数组与对象的定义 —— 变量、数组、对象、函数、拉姆达的详细用法
  • 文档轻语言网站:循环语句体结构 —— 三种循环的详细语法与边界语义
  • 文档轻语言网站:界面XML定义规范 —— .spldg XML 写法与组件属性
  • 文档轻语言网站:程序入口文件 —— App.spl 入口文件与 网站被访问 事件
  • 文档轻语言网站:工程项目结构 —— 项目目录与文件扩展名
  • 文档轻语言网站:发送网络请求与接口请求 —— 网络请求
  • 文档轻语言网站:服务端脚本程序API接口 —— .sph 后端脚本
  • 文档轻语言网站:与原生JS混合开发 —— 原生 JS 混合开发
  • 文档轻语言网站:静态资源文件的使用 —— 静态资源引用
  • 文档前端(JavaScript)函数_字符串 —— 字符串函数
  • 文档前端(JavaScript)函数_数组 —— 数组函数
  • 文档前端(JavaScript)函数_对象 —— 对象函数
  • 文档前端(JavaScript)函数_JSON —— JSON 函数
  • 文档前端(JavaScript)函数_存储 —— 保存配置/读取配置
  • 文档综合演示:网页留言板开发 —— 综合实战
  • 文档综合演示:XML 定义待办事项列表演示 —— 综合实战
  • 文档综合演示:贪吃蛇游戏开发演示 —— 综合实战

轻语言网站:变量与数组与对象的定义

文档概述

轻语言网站开发框架采用 JavaScript 作为底层语言,采用中文关键字,以下为轻语言网站开发中的变量、数组、函数、对象的语句定义与使用。

学习目标

阅读本文档后,你应当能够掌握以下内容:

  • 变量定义语法:变量 名称 = 初始值变量 名称 为 类型
  • 局部变量与页面变量的差异及类型要求
  • 函数定义语法:无需声明返回类型与参数类型
  • 数组定义与操作:[]、索引访问、增删成员
  • 对象定义与操作:{}、点取属性、遍历属性
  • 拉姆达表达式的语法与限制(必须用 {} 包裹)

涉及关键字与函数

变量与类型关键字:

关键字用途示例
变量声明变量变量 X = 0
指定变量类型(用于组件/类)变量 按钮1 为 按钮
/ 逻辑值变量 是否登录 = 假
空值变量 数据 = 空

数组函数:

函数作用示例
取数组成员数(数组)获取数组成员数取数组成员数(数组3)
删除成员(数组,索引)删除指定索引成员删除成员(数组3,0)
添加成员(数组,值)追加成员添加成员(列表,4)

对象函数:

函数作用示例
取对象成员数(对象)获取对象属性数取对象成员数(用户1)
取对象成员名(对象,索引)获取指定索引的属性名取对象成员名(用户1,0)
删除对象属性(对象,属性名)删除属性删除对象属性(用户1,"名称")

变量

在网页开发中,定义局部变量时可以指定数据类型,也可以不指定类型,只需要定义变量名称,或在定义时设置变量的初始值即可,但在定义页面变量时,如果是组件或类必须指定变量类型。

代码示例:

' 定义字符串文本变量
变量 页面变量 = "变量定义测试"

' 定义整数变量
变量 X,Y = 0

' 如果是组件或类,必须显示指定变量类型
变量 页面变量_按钮1 为 按钮

事件 页面加载完毕()
    页面变量_按钮1 = 创建 按钮()
    标签1.文本 = "欢迎使用 VcnStudio 网站开发插件!"
结束 事件

事件 按钮1.被单击(源对象,事件源)
    ' 局部变量无需指定变量类型
    变量 局_数据 = 10
    变量 局_已登录 = 假
    变量 局_URL = "http://www.vcnstudio.com"
    调试输出(局_数据)
    调试输出(局_URL)
结束 事件

变量定义要点

  • 局部变量:定义时可省略类型,直接赋初始值即可
  • 页面变量:定义组件或类的变量时必须 关键字指定类型
  • 批量定义变量 X,Y = 0 可同时定义多个变量并赋相同初始值
  • 逻辑型字面量:使用 / 表示真值与假值
  • 空值:使用 表示空对象

函数

在轻语言网页开发中使用函数时,有返回参数值的函数,无需定义返回类型;直接在函数中返回指定数据值即可。

代码示例:

' 无参数、无返回值的函数
函数 无返回值函数()
    调试输出("无返回值的函数被执行")
结束 函数

' 有返回值的函数、不需要定义返回类型,只需要在函数中返回值即可,
' 函数中的参数也不需要定义任何数据类型,所有参数默认可接收所有数据类型
函数 有返回值的函数(参数一,参数二)
    返回 参数一 + 参数二
结束 函数

函数定义要点

  • 使用 函数 ... 结束 函数 定义
  • 无需声明返回类型,直接用 返回 值 返回
  • 参数无需声明类型,所有参数默认可接收任意数据类型
  • 无返回值的函数可省略 返回 语句

数组与对象

数组的定义与使用

数组在轻语言网页开发中采用中括号 [ ] 定义,一个数组也表示用一个中括号包裹的数据值。

代码示例:

' 定义数组,只需要给变量设置初始值为 [ ] 即可
变量 数组1 = [ ]
' 定义含有默认整数值的数组,每个元素使用英文逗号分隔
变量 数组2 = [ 1,2,3]
' 定义含有默认文本值的数组
变量 数组3 = ["欢迎","使用","VcnStudio"]
' 使用数组,取出数组中指定位置的值,索引从 0 开始
' 例如:取出上方 数组3 中的第一个值
调试输出(数组3[0])
' 修改数组指定索引位置的值
' 例如:修改上方 数组3 中第2(索引为1)个值
数组3[1] = "中文编程"
调试输出(数组3)
' 获取数组中有多少个成员
调试输出(取数组成员数(数组3))
' 删除数组中指定索引成员
删除成员(数组3,0)
调试输出(数组3)
' 清空数组
数组3 = []

数组操作要点

  • 定义变量 名称 = [ ]变量 名称 = [值1,值2,...]
  • 索引:从 0 开始,通过 数组[索引] 访问
  • 修改数组[索引] = 新值
  • 成员数取数组成员数(数组)
  • 删除删除成员(数组,索引)
  • 追加添加成员(数组,值)(详见函数文档)
  • 清空:重新赋值为 []

对象的定义与使用

对象在网页开发中采用花括号 { } 定义,在轻语言网页中,使用花括号包裹的键值对数据值,表示一个对象。

代码示例:

' 定义对象,只需要设置初始值为 { } 即可,表示空对象
变量 对象1 = { }
' 空对象中没有任何属性,可以直接通过对象名称点设置属性
' 例如:给 对象1 设置一个类型的属性
对象1.类型 = "测试空对象"
调试输出(对象1)
' 也可以在定义的时候,通过初始值设置对象的属性与属性值
变量 用户1 = { 名称:"张三",年龄:25 }
调试输出(用户1)
' 修改属性的值,由于属性值是完全自定义的,因此IDE没有属性的智能提示,需要手敲
' 将用户1名称属性的值改为:李四
用户1.名称 = "李四"
调试输出(用户1)
' 获取属性的值
调试输出("用户1的年龄:" + 用户1.年龄)
' 遍历对象中的属性和值
变量循环(i = 0,取对象成员数(用户1),1)
    变量 key = 取对象成员名(用户1,i)
    调试输出("属性名称:" + key + ",属性值:" + 用户1[key])
结束循环
' 删除对象中的指定属性,注意:删除应谨慎操作,可能会影响之前的代码
删除对象属性(用户1,"名称")
调试输出(用户1)

对象操作要点

  • 定义空对象变量 名称 = { }
  • 定义带初始值对象变量 名称 = { 属性1:值1, 属性2:值2 }
  • 取属性对象.属性名对象[属性名]
  • 设属性对象.属性名 = 值
  • 遍历属性变量循环(i = 0, 取对象成员数(对象), 1) + 取对象成员名(对象, i)
  • 取属性数取对象成员数(对象)
  • 取属性名取对象成员名(对象, 索引)
  • 删除属性删除对象属性(对象, "属性名")

拉姆达表达式

轻语言网页中的拉姆达表达式与 JavaScript 语言基本一致,不同的区别为:

1.参数可以省略

代码示例:

' 默认表达式写法,带参数
按钮1.置被单击回调((源按钮,源事件)=>{
    调试输出(源按钮)
    调试输出(源事件)
})
' 如果不需要参数可以省略
按钮1.置被单击回调((源按钮,源事件)=>{
    调试输出("按钮1被单击")
})

什么时候拉姆达表达式的参数可以省略呢?

1.在不需要使用参数的时候。

2.在不使用子程序接收回调事件的时候。

2.被执行的代码必须使用 { } 包裹

代码示例:

按钮1.置被单击回调((源按钮,源事件)=>{
    ' 待执行语句必须在{ }中,哪怕只有一句代码,也必须在{ } 中。
    调试输出("按钮1被单击")
})

错误语法:
按钮1.置被单击回调((源按钮,源事件)=>调试输出("按钮1被单击")) ' 调试输出 函数没有在{ }内,轻语言编译器编译时会报错

注意事项

  • 页面变量声明类型:在页面级(不在函数/事件内)声明组件或类变量时必须用 关键字指定类型,例如 变量 按钮1 为 按钮;局部变量无此要求。
  • 数组索引从 0 开始:取出第 N 个元素用 数组[N-1]
  • 对象属性无智能提示:自定义对象属性 IDE 无法提示,需手敲。
  • 遍历对象需用循环:通过 变量循环 + 取对象成员数 + 取对象成员名 遍历对象的属性。
  • 拉姆达表达式必须用 {} 包裹:单行表达式体也必须用花括号包裹,否则编译报错。
  • 拉姆达只能作为参数传递:不能赋值给变量(详见文档轻语言网站:轻语言语法速查)。
  • 未定义 表示空对象(null),未定义 表示未初始化的变量(undefined)。
  • 逻辑值字面量:使用 / ,不是 true / false

学习要点总结

知识点关键代码适用场景
变量声明变量 X = 0局部变量
带类型声明变量 按钮1 为 按钮页面级组件/类变量
函数定义函数 名(参数) ... 返回 值 结束 函数复用逻辑
数组定义变量 数组 = [1,2,3]有序数据集合
数组取值数组[0]按索引取值
数组长度取数组成员数(数组)获取成员数
对象定义变量 用户 = {名称:"张三"}键值对数据
对象取值用户.名称 / 用户["名称"]取属性值
遍历对象变量循环 + 取对象成员名遍历属性
拉姆达(参数) => { 语句 }回调函数

相关文档

  • 文档轻语言网站:循环语句体结构 —— 变量循环遍历对象/数组
  • 文档轻语言网站:轻语言语法速查 —— 函数定义、作用域、拉姆达限制
  • 文档前端(JavaScript)函数_数组 —— 取数组成员数添加成员删除成员
  • 文档前端(JavaScript)函数_对象 —— 取对象成员数取对象成员名删除对象属性
  • 文档前端(JavaScript)函数_JSON —— JSON编码/JSON解析
  • 文档综合演示:XML 定义待办事项列表演示 —— 对象数组与列表渲染实战
  • 文档综合演示:手机移动端记事本网页开发 —— 对象数组与本地存储
  • 文档综合演示:网页留言板开发 —— 对象数组增删改查

轻语言网站:循环语句体结构

文档概述

顺序结构的程序语句只能被执行一次;如果要想使同样的操作执行多次,就需要使用循环语句。在轻语言中有 3 种主要的循环语句、每个循环语句都有与之对应的唯一结束标志:"结束循环"、用以当不符合条件时结束并退出循环。

学习目标

阅读本文档后,你应当能够掌握以下内容:

  • 三种循环语句:判断循环变量循环计次循环 的语法与适用场景
  • 变量循环 的边界语义:左闭右开 [起始值, 目标值)
  • 判断循环 的死循环风险与避免方法
  • 计次循环 的总次数与计次变量
  • 退出跳过 循环控制关键字的区别
  • 三种循环统一使用 结束循环 作为结束标记

三种循环对比

循环类型关键词适用场景退出条件等效 JS
判断循环判断循环不确定循环次数,只根据条件是否满足决定条件为假时退出while(条件) {}
变量循环变量循环明确知道起始值、目标值、步长变量小于目标值时循环,达到目标值退出for(i=0; i<目标值; i+=步长)
计次循环计次循环明确知道需要循环多少次达到指定次数后退出for(i=0; i<次数; i++) {}

判断循环

判断循环是最基本的循环结构语句、只要传入的逻辑值、或逻辑表达式满足条件为真、程序将会进入循环体、并一直重复执行语句块中的代码;判断循环语句使用关键字:判断循环 定义,其语句结构为:

判断循环(条件)
    ' 待执行的语句代码

结束循环

示例:

变量 计次 为 整数型 = 0
判断循环(计次 < 10)
    ' 循环执行代码、使变量的值加1
    计次 = 计次 + 1
结束循环
调试输出(计次) ' 将输出 10

上述代码解释:

  • 当变量 计次 的值小于10时、则进入循环体内、循环执行代码块内的代码。每次执行完循环代码、让变量计次的值加1;当计次达到(不小于)10时、不符合条件则不再进入循环体内、程序将跳到结束循环标志、退出循环。

注意:使用判断循环时、确保逻辑值有条件返回假、否则将会导致程序陷入死循环无法退出。

变量循环

变量循环;顾名思义是以变量为开始点、进行循环的结构语句体;因为该语句指定了初始值及目标值、因此在实际开发过程中使用的比较多。该循环使用关键字 "变量循环" 定义。其语句结构为:

变量循环(初始变量 = 初始值, 目标值, 递增值)
    ' 待循环的代码

结束循环

语句释义:

  • 参数一:初始值、指定从什么值开始循环
  • 参数二:目标值、当初始变量小于目标值时继续循环,达到(不小于)目标值时退出循环
  • 参数三:递增值、每次执行循环代码后初始变量增加的值

示例:

变量循环(计次 = 0, 10, 2) 
    ' 循环打印输出"计次"的值
    调试输出("计次" + 计次)
结束循环

上述代码解释:

  • 初始变量为0、目标值为10、每次循环后初始变量加2、当初始变量小于10时继续循环,达到(不小于)10时退出
  • 等效于 for(计次=0; 计次<10; 计次=计次+2)
  • 边界语义为左闭右开区间 [0, 10):包含 0,不包含 10
  • 循环执行 5 次(计次 = 0, 2, 4, 6, 8)

计次循环

计次循环、是以次数限制循环的语句、多用于在处理循环时指定次数的场景。用关键字"计次循环"定义、其循环结构语句为:

计次循环(总循环次数, 计次变量)
    ' 循环执行的代码

结束循环

语句解释:

  • 参数一:总循环次数、指定要循环的总次数
  • 参数二:计次变量、循环递增计次的变量、每次递增加1

示例:

变量 计次 为 整数型 = 0
计次循环(10,计次)
    ' 待循环执行的代码、循环输出 计次 变量的值
    调试输出("计次:" + 计次)
结束循环

上述代码解释:

  • 循环 10 次、计次变量从 0 开始、每次计次变量加 1 、当循环 10 次后退出循环
  • 计次变量最终值为 9(最后一次循环),循环结束后值为 10

退出循环

如果在执行循环语句过程中、要在中途结束并退出循环(不再执行后续的循环);可以使用关键字 "退出" 提前结束循环。例如在下方代码中;当计次等于 5 时、则提前退出并结束循环。

示例:

变量 计次 为 整数型 = 0
判断循环(计次 < 10)
    ' 当执行第5次循环的时候、提前结束并退出循环
    ' 退出循环后、将不再执行后续的循环
    如果(计次 == 5)
        退出
    否则
        ' 执行语句
    结束 如果
    计次 = 计次 + 1
结束循环

跳过循环

如果在执行循环语句过程中、想跳过某一次循环(但仍需要继续执行后续的循环);可以使用关键字 "跳过" 不执行本次循环语句。例如在下方代码语句中;当计次等于5的时候、则跳过该次循环、但仍然会继续执行后续循环。

示例:

变量循环(索引 = 0,10,1)
    ' 当 索引 等于 5 的时候、程序将跳过本次循环,不再执行本次循环后面的代码
    ' 但下一次循环仍会继续
    如果(索引 == 5)
        跳过
    结束 如果
    调试输出("索引 = " + 索引)
结束循环

使用跳过循环时,需注意只有在调用 "跳过" 关键字后面的代码才不会执行、如果在"跳过" 关键字之前的代码;仍会被执行。

循环控制关键字对比

关键字作用后续行为
退出立即退出整个循环不再执行后续任何循环
跳过跳过本次循环剩余代码继续下一次循环

💡 区别退出 是"结束整个循环",跳过 是"不执行本次循环的剩余代码,但继续下一次循环"。调用 跳过 之前的代码仍然会执行。

注意事项

  • 三种循环统一用 结束循环:无论使用 判断循环变量循环计次循环,结束标记都是 结束循环(不是 结束 判断循环结束 变量循环)。
  • 判断循环防死循环:必须确保条件最终会变为假,否则会陷入死循环。
  • 变量循环边界变量循环(i=0, 10, 1) 是左闭右开 [0, 10),循环 10 次(i = 0~9),不包含 10。
  • 计次循环从 0 开始计次循环(10, 计次) 中计次变量从 0 开始,循环 10 次后计次变量值为 10。
  • 退出跳过 区别退出 结束整个循环,跳过 仅跳过本次循环剩余代码。
  • 跳过 后续代码不执行跳过 关键字之后的代码本次循环不再执行,但下一次循环继续。
  • 循环嵌套:循环可嵌套使用,每层循环必须有对应的 结束循环

学习要点总结

知识点关键代码适用场景
判断循环判断循环(条件) ... 结束循环不确定次数
变量循环变量循环(i=0, 目标值, 步长) ... 结束循环已知起止与步长
计次循环计次循环(次数, 计次) ... 结束循环已知次数
循环结束结束循环三种循环通用
退出循环退出中途结束整个循环
跳过循环跳过跳过本次循环

相关文档

  • 文档轻语言网站:轻语言语法速查 —— 速查表中的循环对比
  • 文档轻语言网站:变量与数组与对象的定义 —— 变量声明、数组遍历
  • 文档轻语言网站:自定义设计列表内容 —— 列表渲染中的循环用法
  • 文档综合演示:贪吃蛇游戏开发演示 —— 游戏循环中的判断循环用法
  • 文档综合演示:XML 与使用代码动态创建组件演示 —— 变量循环创建组件
  • 文档综合演示:XML 定义待办事项列表演示 —— 列表渲染与遍历
  • 文档综合演示:手机移动端记事本网页开发 —— 记事本数据遍历

轻语言网站工程项目结构

文档概述

轻语言网站程序采用标准前端三大件(HTML/CSS/JS)+ 自主设计的中文 WEB 框架设计而成,以轻语言作为第一编程语言,并同时支持可视化界面设计。本章介绍一个标准的轻语言网站程序项目的目录结构、各文件扩展名的含义、以及必备的成对关系(.spl.spldg.usc.uscdg)。

学习目标

阅读本文档后,你应当能够掌握以下内容:

  • 轻语言网站项目的标准目录结构
  • 各文件扩展名的含义与编译输出目标(.spl/.spldg/.jsx/.js/.sph/.usc/.uscdg
  • 必须成对出现的文件类型及其原因
  • App.spl 作为入口文件的位置与作用
  • 程序集资源 目录的作用
  • .vsln 项目索引文件与 _build 编译输出目录

项目目录结构

标准的轻语言网站程序项目结构文件夹目录为:

  • 程序集 存放页面布局文件、页面逻辑、公用模块代码、脚本、自定义组件、CSS 样式表等文件。

    • .spl 实现页面逻辑交互的文件,采用轻语言语法规则编写代码,例如:登录页面.spl

    • .spldg 页面布局设计文件,文件内容采用 XML 格式编写,例如:登录页面.spldg

    • .jsx 使用轻语言语法编写的中文 JS 脚本文件,编译时转换为标准 JS 脚本文件。

    • .js 原生 JS 代码脚本文件、使用 JavaScript 语言编写代码。

    • .sph 后端服务器运行的脚本文件,编译时转换为标准的 PHP 代码文件。

    • .usc 用户自定义组件逻辑交互文件。

    • .uscdg 用户自定义组件的界面设计布局文件。

  • 资源 存放静态资源文件,例如:图片、文本、视频、音频等等

  • App.spl 在浏览器中打开网站时的入口文件

  • *.vsln 项目索引文件

  • _build 项目编译输出目录,新建项目时不存在,仅在编译时创建生成。

文件扩展名速查表

扩展名类型编译输出成对要求参考文档
.spl页面逻辑文件标准 JS.spldg 成对文档轻语言网站:界面XML定义规范
.spldg页面布局设计(XML)标准 HTML.spl 成对文档轻语言网站:界面XML定义规范
.jsx中文 JS 脚本标准 JS独立文档综合演示:公用模块全局变量函数使用演示
.js原生 JS 脚本不编译独立文档轻语言网站:与原生JS混合开发
.sph后端脚本文件标准 PHP独立文档轻语言网站:服务端脚本程序API接口
.usc自定义组件逻辑标准 JS.uscdg 成对文档自定义组件
.uscdg自定义组件布局(XML)标准 HTML.usc 成对文档自定义组件

💡 命名记忆dg 是 design 的缩写,表示该文件是对应逻辑文件的"界面设计文件"。例如 .spldg.spl 的设计文件,.uscdg.usc 的设计文件。

App.spl

该文件为网站的启动入口文件、当网站每次重新打开、或被访问的时候、都会先执行该文件、开发者可以在该文件中添加初始化相关代码。

事件 网站被访问()
    切换页面("首页")
结束 事件

💡 详细的入口文件用法请参考文档轻语言网站:程序入口文件

特别注意

1. .spl.spldg 必须成对

  • .spl.spldg 在项目中必须同时成对出现,例如:登录页面.spl登录页面.spldg
  • 两个文件的名称必须相同(不含扩展名)
  • 若只存在其一,IDE 与编译器将无法正确处理

2. .usc.uscdg 必须成对

  • .usc.uscdg 在项目中必须同时成对出现,例如:计时器.usc计时器.uscdg
  • 同样要求两个文件的名称相同

3. 静态资源路径前缀

  • 静态资源文件(图片、音视频等)必须放在 资源(static)目录中
  • 代码引用时需带上 ./static/ 前缀,详见文档轻语言网站:静态资源文件的使用

4. 入口文件 App.spl 唯一

  • App.spl 是整个网站的入口文件,文件名固定不可更改
  • 其中必须包含 网站被访问 事件,详见文档轻语言网站:程序入口文件

5. 编译输出目录 _build

  • _build 目录仅在编译时创建,不要手动修改
  • 项目部署时通常部署 _build 目录下的输出文件

学习要点总结

知识点关键内容适用场景
程序集目录存放所有源代码项目源码组织
资源目录存放静态资源图片/音视频
入口文件App.spl网站启动
项目索引.vslnIDE 打开项目
编译输出_build部署目录
页面文件.spl + .spldg 成对页面开发
自定义组件.usc + .uscdg 成对组件复用
后端脚本.sph服务端 API
公用脚本.jsx跨页面复用
原生脚本.js直接使用 JS

相关文档

  • 文档轻语言网站:程序入口文件 —— App.spl 入口文件详解
  • 文档轻语言网站:界面XML定义规范 —— .spldg/.uscdg XML 写法
  • 文档轻语言网站:静态资源文件的使用 —— 资源目录用法
  • 文档轻语言网站:服务端脚本程序API接口 —— .sph 后端脚本写法
  • 文档综合演示:公用模块全局变量函数使用演示 —— .jsx 公用模块用法
  • 文档轻语言网站:与原生JS混合开发 —— .js 原生脚本用法
  • 文档轻语言网站:轻语言语法速查 —— .spl 语法规则
  • 文档自定义组件 —— .usc/.uscdg 自定义组件开发

轻语言网站程序入口文件

文档概述

程序入口文件为项目中的 App.spl 文件。当网站第一次打开或每次重新被打开(包括刷新)时,浏览器都会先执行该文件,并回调 网站被访问 事件。开发者可以在该文件中做一些程序的初始化工作,或根据用户设备类型切换到指定页面(手机端/桌面端)。

入口文件是整个网站的「路由起点」,是 PC/移动端适配、初始页面路由的常用位置。

学习目标

阅读本文档后,你应当能够掌握以下内容:

  • 入口文件 App.spl 的作用与执行时机
  • 必须存在的 网站被访问 事件及其回调时机
  • 使用 切换页面(页面名称) 跳转到指定页面
  • 使用 取用户代理头信息() 判断设备类型(Android/Windows/iOS 等)
  • 使用 寻找文本(源, 目标) 检测子字符串是否存在
  • 通过 UA 字符串实现 PC/移动端自适应路由

涉及函数与关键字

关键字: 事件 ... 结束 事件变量如果 ... 否则 如果 ... 结束 如果

入口事件:

  • 网站被访问() —— 必须存在,不能删除。每次网站被访问(含刷新)时回调

路由函数:

  • 切换页面(页面名称) —— 跳转到指定名称的页面(页面名对应 .spldg/.spl 文件名)
  • 切换页面(页面名称, 参数) —— 跳转并传参(详见下方"相关文档")

UA 探测函数:

  • 取用户代理头信息() —— 获取浏览器 User-Agent 字符串
  • 寻找文本(源文本, 目标文本) —— 查找子文本位置,未找到返回 -1,找到返回索引(从 0 开始)

默认入口文件代码

事件 网站被访问()
    切换页面("首页")
结束 事件
  • 网站被访问 事件是必须存在的,不能删除
  • 当浏览器通过域名访问网站时,浏览器将回调该事件
  • 你可在该入口中初始化网站所需数据或切换到指定网站页面

进阶:根据设备类型自动切换页面

通过读取浏览器的 User-Agent,可以判断用户设备类型,从而将移动端用户跳转到移动端页面,桌面端用户跳转到桌面端页面。

代码示例:

事件 网站被访问()
    变量 userAgent = 取用户代理头信息()
    如果(寻找文本(userAgent,"Android") != -1)
        切换页面("安卓手机页")
    否则 如果(寻找文本(userAgent,"Windows") != -1)
        切换页面("桌面端页")
    结束 如果
结束 事件

关键代码解读

1. 网站被访问 是入口回调

事件 网站被访问()
    切换页面("首页")
结束 事件
  • 该事件在 App.spl必须存在,删除会导致网站无法启动
  • 浏览器每次打开网站或刷新时都会触发该回调
  • 该事件是网站的统一「路由起点」

2. UA 字符串判断设备类型

变量 userAgent = 取用户代理头信息()
如果(寻找文本(userAgent,"Android") != -1)
    切换页面("安卓手机页")
否则 如果(寻找文本(userAgent,"Windows") != -1)
    切换页面("桌面端页")
结束 如果
  • 取用户代理头信息() 返回浏览器的 UA 字符串
  • 寻找文本(源, 目标) 返回目标文本的位置索引,未找到返回 -1,找到返回 >=0 的索引
  • 因此 寻找文本(...) != -1 等价于"包含子字符串"
  • 常见 UA 关键字:
    • Android(安卓手机)
    • iPhone(苹果手机)
    • iPad(苹果平板)
    • Windows(Windows 桌面)
    • Macintosh(Mac 桌面)
    • Linux(Linux 桌面)

3. 切换页面

切换页面("首页")
  • 参数为页面名称,对应 .spldg/.spl 文件名(不含扩展名)
  • 若目标页面不存在会报错
  • 也支持带参数跳转:切换页面("首页", 参数对象),目标页面通过 取请求参数() 取出(详见相关文档)

注意事项

  • 网站被访问 事件不可删除:入口文件 App.spl 中必须存在该事件,否则网站无法正常启动。
  • 入口文件名固定:入口文件名必须为 App.spl,不可改名。
  • UA 判断顺序:UA 探测应将移动端关键字优先判断(如先判断 AndroidiPhone),再判断桌面端,避免移动设备 UA 中含兼容性字段误判。
  • UA 不可靠:UA 可被浏览器或用户篡改,关键判断不能完全依赖 UA;如需要严格判断可结合屏幕宽度等综合判断。
  • 每次刷新都会触发:刷新页面也会再次执行 网站被访问,因此该事件中适合做幂等的初始化操作。
  • 寻找文本 返回 -1 表示未找到:判断子字符串存在用 != -1,不要用 > 0(索引可能为 0)。
  • 目标页面必须存在切换页面(页面名) 中页面名必须对应实际的 .spldg/.spl 文件,否则报错。

学习要点总结

知识点关键代码适用场景
入口文件App.spl网站启动入口
必需事件事件 网站被访问()网站被访问回调
页面路由切换页面("首页")跳转到指定页面
UA 探测取用户代理头信息()设备类型判断
字符串查找寻找文本(源, 目标) != -1判断包含子串
设备路由UA + 切换页面PC/移动端适配

相关文档

  • 文档轻语言网站:工程项目结构 —— 项目目录与 App.spl 的位置
  • 文档轻语言网站:界面XML定义规范 —— .spldg 页面文件写法
  • 文档轻语言网站:循环语句体结构 —— 流程控制语法
  • 文档轻语言网站:轻语言语法速查 —— 事件、条件判断语法
  • 文档前端(JavaScript)函数_字符串 —— 寻找文本 等字符串函数
  • 文档前端(JavaScript)函数_浏览器 —— 取用户代理头信息 等 UA 相关函数
  • 文档综合演示:手机移动端记事本网页开发 —— 移动端页面(类型="wap")的开发示例
  • 文档综合演示:网页留言板开发 —— 多页面切换与参数传递示例
  • 文档综合演示:XML 与使用代码动态创建组件演示 —— 切换页面与取请求参数的用法

轻语言(Qing)XML 界面定义规范

文档概述

轻语言(Qing)框架支持两种 UI 创建方式:

  1. 纯代码方式:在 .spl 文件中使用 创建 [类名]() 动态创建界面
  2. XML 定义方式:在 .spldg 文件中用 XML 描述界面结构,在 .spl 中通过组件名称引用

XML 定义方式适合界面结构固定、可视化设计的场景,让 UI 与逻辑分离。

学习目标

阅读本文档后,你应当能够掌握以下内容:

  • .spldg XML 文件的基本结构(<页面> 根节点 + 布局容器)
  • PC 端页面与移动端页面(类型="wap")的差异
  • 通用组件 XML 写法:<组件标签 名称="组件名" 属性="值" />
  • 组件的 名称 属性在 .spl 代码中的引用方式
  • XML 属性与代码属性/方法的对应关系
  • 宽高/坐标必须用纯数字、字体大小等需带 px 单位的规则
  • .spldg.spl 必须成对存在且文件名相同

XML 文件基本结构

根节点:<页面>

每个 .spldg 文件必须以 <页面> 为根节点,定义页面级属性。

PC电脑网站页面:

<页面 标题="页面标题" 宽度="500" 高度="300">
    <!-- 页面内容 -->
</页面>

手机移动端页面:

<页面 标题="页面标题" 宽度="500" 高度="300" 类型="wap">
    <!-- 页面内容 -->
</页面>

PC电脑网站页面不需要指定类型,手机移动端页面必须设置页面类型属性,属性值必须为:wap

页面属性说明:

属性类型说明
标题文本型页面标题,显示在浏览器标签栏
宽度数值型页面宽度(像素)
高度数值型页面高度(像素)
类型文本型页面类型、默认省略该属性则表示页面类型为PC电脑端网页,如果设置该属性并设置其值为“wap”则表示该页面为手机移动端类型。

布局容器:<绝对布局> / <弹性布局>

页面内的第一层必须是布局容器,用于组织子组件,除非特别说明,默认根布局只能为:绝对布局。

<页面 标题="首页" 宽度="500" 高度="300">
    <绝对布局 名称="根布局" 宽度="100%" 高度="100%">
        <!-- 子组件 -->
    </绝对布局>
</页面>

布局属性说明:

属性说明
名称组件名称,在 .spl 代码中通过此名称引用(必须唯一)
左边 / 顶边位置(绝对布局中有效)
宽度 / 高度尺寸,属性值只能为纯数字
背景颜色设置布局的背景颜色

注意:所有布局、尺寸类属性(左边、顶边、宽度、高度)都必须用纯数字,不能出现 "自适应"、"auto"、"wrap_content" 这类文本值。


组件 XML 写法

通用规则

所有组件在 XML 中的写法为:

<组件标签 名称="组件名" 属性1="值1" 属性2="值2" />
  • 组件标签:对应组件类名(如 按钮标签编辑框
  • 名称属性必须,用于在 .spl 代码中引用该组件
  • 其他属性:对应组件的属性名,值使用字符串或数值

常用组件示例

1. 标签(Label)

<标签 名称="标题标签" 左边="20" 顶边="20" 宽度="200" 高度="40" 
      文本="欢迎使用" 字体大小="24" 文本颜色="#333" />

2. 按钮(Button)

<按钮 名称="登录按钮" 左边="20" 顶边="100" 宽度="120" 高度="40" 
      文本="登录" 背景颜色="#1890ff" 文本颜色="#ffffff" />

3. 编辑框(TextBox)

<编辑框 名称="用户名框" 左边="20" 顶边="60" 宽度="200" 高度="32" 
         提示文本="请输入用户名" />

4. 密码框

<编辑框 名称="密码框" 左边="20" 顶边="100" 宽度="200" 高度="32" 
         提示文本="请输入密码" 类型="password" />

5. 图片框(ImageBox)

<图片框 名称="头像" 左边="20" 顶边="20" 宽度="60" 高度="60" 
         图片="static/avatar.jpg" 图片显示模式="cover" />

6. 弹性布局(FlexLayout)

<弹性布局 名称="主容器" 宽度="100%" 高度="100%" 
          方向="column" 主轴对齐="center" 侧轴对齐="center">
    <!-- 子组件 -->
</弹性布局>

.spl 代码中引用 XML 定义的组件

在 XML 中定义了 名称 属性的组件,可以在 .spl 代码中直接通过名称访问其属性和方法。

示例:完整的登录界面

界面文件:登录页面.spldg

<?xml version="1.0" encoding="utf-8"?>
<页面 标题="用户登录" 宽度="667" 高度="424" 背景颜色="#f5f5f5">
  <绝对布局 名称="根布局">
    <弹性布局 名称="弹性布局_登录框" 左边="80" 顶边="42" 高度="265" 宽度="500" 方向="column" 子项间距="20px" 侧轴对齐="center">
      <标签 名称="标签_1" 文本="登录账号" 字体粗细="bold" 字体大小="30px" />
      <表单输入框 名称="表单输入框_用户名" 标题="用户名" 提示文本="请输入用户名" />
      <表单输入框 名称="表单输入框_密码" 标题="密码" 提示文本="请输入密码" 输入类型="password" />
      <按钮 名称="按钮_登录" 文本="登录" 背景颜色="#1890ff" 文本颜色="#ffffff" 边框圆角="4" 高度="40" 宽度="120" />
      <标签 名称="标签_小字备注" 文本="登录小字备注信息" 文本颜色="#5E5B59" />
    </弹性布局>
  </绝对布局>
</页面>

逻辑文件:登录页面.spl

'* ******************************************************************************
'* 版权说明:Copyright(C) All Rights Reserved VcnStudio
'* 程序版本:V1.0
'* 文件描述:登录页面逻辑
'* 修改日志:
'* ******************************************************************************

' 页面变量,整个页面都能使用
变量 页面变量 = "用户登录页面"

' ========== 页面加载事件 ==========
事件 页面加载完毕()
    ' 页面加载后,可以做一些初始化操作
    调试输出("登录页面已加载")
    ' 例如:设置表单宽度占满登录框布局
    置组件宽度("100%",表单输入框_用户名,表单输入框_密码,按钮_登录)
    ' 将整个登录框水平垂直居中到页面中间
    置组件居中(弹性布局_登录框)
    ' 使用原生css样式值设置“小字备注”标签靠左显示
    标签_小字备注.置内联样式("align-self","flex-start")
    ' 如果想让登录框靠上一点,可以取出登录框的实际高度减去一些值
    弹性布局_登录框.顶边 = 弹性布局_登录框.取渲染顶边() - 100
结束 事件

' ========== 登录按钮点击事件 ==========
事件 按钮_登录.被单击(源对象,事件源)
    变量 用户名 = 表单输入框_用户名.内容
    变量 密码 = 表单输入框_密码.内容
    如果(用户名 == "" 或 密码 == "")
        弹出提示("用户名或密码不能为空!")
        返回
    结束 如果
    ' 发送登录请求
    变量 待提交数据 = "username=" + 用户名 + "&password=" + 密码
    请求接口("Api1", "登录账号", (结果,标记) => {
        变量 响应 = JSON解析(结果)
        如果(响应.code == 0)
            保存配置("token", 响应.token)
            切换页面("首页")
        否则
            弹出提示("登录失败:" + 响应.msg)
        结束 如果
    },待提交数据)
结束 事件

XML 属性与代码属性的对应关系

XML 属性代码中对应的属性/方法示例
名称组件实例名称用户名框.内容
左边 / 顶边.左边 / .顶边登录按钮.左边 = 20
宽度 / 高度.宽度 / .高度标签1.宽度 = 200
文本.文本标签1.文本 = "新内容"
背景颜色.背景颜色按钮1.背景颜色 = "#1890ff"
文本颜色.文本颜色标签1.文本颜色 = "#333"
字体大小.字体大小标签1.字体大小 = "16px"
提示文本.提示文本编辑框1.提示文本 = "请输入"
类型.类型编辑框1.类型 = "password"
可视.可视标签1.可视 = 假
禁用.禁用按钮1.禁用 = 真
边框圆角.边框圆角按钮1.边框圆角 = "4px"
内容水平对齐方式.内容水平对齐方式标签1.内容水平对齐方式 = "center"

注意事项

  • .spldg.spl 必须成对:界面文件和逻辑文件的名称必须相同且必须同时存在。例如:登录页面.spl、登录页面.spldg 必须同时存在;其中 .spldg 是 spl design 的缩写,意为"逻辑文件的界面设计文件"。
  • 尺寸与坐标用纯数字:宽度、高度、左边、顶边、右边、底边等赋值时使用整数值(不带单位)。
  • 字体大小等需带 px 单位:圆角、字体大小等都必须带默认单位 px,例如:按钮1.字体大小 = "30px"
  • 名称 属性必须唯一:每个组件在 XML 中的 名称 属性必须唯一,用于在 .spl 中引用。
  • PC 与移动端差异:PC 端页面无需 类型 属性;移动端页面必须设置 类型="wap"
  • 根布局只能为绝对布局:除非特别说明,默认页面根布局只能为 绝对布局

AI使用指南

当用户询问关于界面布局的问题时,你需要:

  1. 判断用户使用的是纯代码方式还是 XML 定义方式

  2. 如果用户想用 XML 定义界面

    • 提供 .spldg 文件的结构和组件 XML 写法

    • 组件名称必须唯一,用于在 .spl 中引用

    • 事件绑定在 .spl 中使用 事件 组件名.事件名

  3. 如果用户想用纯代码方式

    • 使用 创建 类名() 创建实例

    • 设置属性、添加事件、添加到布局

相关文档

  • 文档轻语言网站:工程项目结构 —— .spldg/.spl 成对要求
  • 文档轻语言网站:轻语言语法速查 —— 事件定义语法、组件属性
  • 文档轻语言网站:变量与数组与对象的定义 —— 变量声明
  • 文档布局类组件_绝对布局 —— 绝对布局属性
  • 文档布局类组件_弹性布局 —— 弹性布局属性
  • 文档文本类组件_标签 —— 标签属性
  • 文档按钮类组件_按钮 —— 按钮属性
  • 文档输入类组件_编辑框 —— 编辑框属性
  • 文档图像类组件_图片框 —— 图片框属性
  • 文档前端(JavaScript)函数_布局 —— 置组件宽度/置组件居中
  • 文档综合演示:XML 定义待办事项列表演示 —— XML 界面定义实战
  • 文档综合演示:XML 与使用代码动态创建组件演示 —— 代码创建组件实战
  • 文档综合演示:网页留言板开发 —— 登录界面与表单提交实战
  • 文档综合演示:手机移动端记事本网页开发 —— 移动端 类型="wap" 实战

轻语言网站:与原生JS混合开发

文档概述

在轻语言网页开发中,其界面逻辑代码文件(.spl)、与 .jsx 文件代码可以与原生 JS 代码或引用外部 js 文件混合开发,也可以直接使用原生 JS 函数、即浏览器支持的任意 API 函数。

学习目标

阅读本文档后,你应当能够掌握以下内容:

  • 使用 引用 "URL" 引入外部 JS 文件(CDN 或项目内 ./static/
  • 直接调用原生 JS 内置函数:alert()console.log()
  • 使用 document.createElement 创建原生 DOM 元素并加入布局
  • 使用 创建 Date() 创建原生 JS 对象
  • 调用引入的 JS 库中的函数(如 jQuery 的 $.get
  • 同源策略与跨域(CORS)限制
  • 通过 根布局.添加组件(原生元素) 将原生 DOM 加入轻语言布局

涉及关键字与函数

关键字: 引用变量事件 ... 结束 事件创建

引用语句:

  • 引用 "网络URL" —— 引入 CDN 上的 JS 文件
  • 引用 "./static/路径" —— 引入项目内 static 目录的 JS 文件

原生 JS API:

  • alert(文本) —— 弹出提示框
  • console.log(内容) —— 控制台输出
  • document.createElement(标签名) —— 创建 DOM 元素
  • 创建 Date() —— 创建原生 Date 对象
  • $.get(地址, 回调) —— jQuery 的 GET 请求

布局方法:

  • 布局.添加组件(原生元素) —— 将原生 DOM 元素添加到轻语言布局

使用原生JS文件

代码示例:

' 添加并引用网络地址的 jquery
引用 "https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"

' 添加并引用项目资源文件夹中的外部js库
' 注意:需要添加 "./static/" 资源文件夹的路径前缀,添加网络CDN地址不需要
引用 "./static/js/lunar.min.js"

事件 页面加载完毕()
	
结束 事件

事件 按钮1.被单击(源对象,事件源)
	变量 局_Solar = Solar.fromDate(创建 Date())
    调试输出(局_Solar)
    ' 转阴历
    变量 局_阴历 = 局_Solar.getLunar()
    调试输出(局_阴历.toString())
    调试输出(局_阴历.toFullString())
结束 事件

事件 按钮2.被单击(源对象,事件源)
    ' 注意:这里由于同源策略的安全限制,请求地址只能为同一个IP或域名的地址
    ' 如果直接访问非本源地址,会报跨域错误 Access-Control-Allow-Origin
    $.get("http://www.vcnstudio.com/",(请求结果)=>{
        调试输出(请求结果)
    })
结束 事件

引用外部 JS 要点

  • CDN 地址引用 "https://..." 直接引入网络 JS 文件
  • 项目内 JS引用 "./static/..." 必须带 ./static/ 前缀
  • 引用位置引用 语句写在文件顶部(事件外)
  • 调用库函数:引用后可直接使用库中的全局对象,如 Solar.fromDate()$.get()
  • 跨域限制:使用 $.get 等网络请求受同源策略限制

使用JS原生函数

代码示例:

事件 按钮3.被单击(源对象,事件源)
    ' 轻舟网站开发支持直接与原生JS代码混合开发,以及直接使用原生JS函数
    ' 例如:
    ' 网页开发中常见的内置函数,console.log()、alert() 等等
    alert("我是原生Js函数调用的信息框")
    console.log("我是原生js函数调用的控制台输出信息")
结束 事件

事件 按钮4.被单击(源对象,事件源)
    ' 使用纯JS代码创建网页元素
    变量 mBtn = document.createElement("button")
    ' 通过 style 属性设置元素样式
    mBtn.style.width = "200px"
    mBtn.style.height = "100px"
    mBtn.style.backgroundColor = "lightblue"
    mBtn.style.border = "1px solid black"
    mBtn.style.textAlign = "center"
    mBtn.style.lineHeight = "100px"
    mBtn.style.position = "absolute"
    mBtn.style.top = "300px"
    mBtn.style.left = "300px"
    ' 注册组件被单击事件
    mBtn.addEventListener("click",()=>{
        mBtn.textContent = "你点击了这个 div!"
        ' 改变背景颜色
        mBtn.style.backgroundColor = "lightgreen" 
    })
    ' 设置元素文本(这里我们创建的是一个按钮)
    mBtn.textContent = "这是一个使用JS创建的按钮"
    ' 将组件添加到页面根布局中
    根布局.添加组件(mBtn)
结束 事件

原生 JS 函数使用要点

  • 内置函数直接调用alert()console.log()document.createElement()
  • 创建原生对象创建 Date() 创建原生 JS 对象(创建 关键字替代 new
  • DOM 操作:可直接操作 styleaddEventListenertextContent 等原生属性
  • 混入布局:通过 布局.添加组件(原生元素) 将原生 DOM 元素加入轻语言布局中
  • 事件注册:使用原生 addEventListener("click", 回调) 注册事件

注意事项

  • 引用位置引用 语句必须写在文件顶部(所有事件/函数之外)。
  • 项目内 JS 需带前缀:引用 static 目录的 JS 文件必须带 ./static/ 前缀;CDN 地址不需要。
  • 同源策略:使用 $.get 等原生网络请求时,请求地址只能为同源(同 IP/域名)地址,跨域会报 Access-Control-Allow-Origin 错误。
  • 创建 替代 new:创建原生 JS 对象时使用 创建 类名(),而非 new 类名()
  • DOM 元素加入布局:原生 document.createElement 创建的元素通过 布局.添加组件(元素) 加入轻语言布局。
  • 库函数依赖引用:使用库中函数前必须先 引用 对应的 JS 文件,否则会报"未定义"错误。
  • 跨域解决方案:如需跨域请求,服务端需配置 CORS 响应头,或使用 JSONP、代理等方式。

学习要点总结

知识点关键代码适用场景
引用 CDN引用 "https://..."引入网络 JS
引用项目 JS引用 "./static/..."引入项目内 JS
内置函数alert() / console.log()原生 API
创建原生对象创建 Date()替代 new
创建 DOMdocument.createElement(...)原生元素
DOM 加入布局根布局.添加组件(元素)混合开发
事件注册addEventListener("click", 回调)原生事件
jQuery 请求$.get(地址, 回调)网络请求
跨域限制同源策略 / CORS安全限制

相关文档

  • 文档轻语言网站:静态资源文件的使用 —— ./static/ 资源引用
  • 文档轻语言网站:发送网络请求与接口请求 —— 轻语言原生网络请求
  • 文档轻语言网站:轻语言语法速查 —— 创建 关键字与对象创建
  • 文档轻语言网站:变量与数组与对象的定义 —— 变量声明
  • 文档轻语言网站:工程项目结构 —— .jsx.js 文件的位置
  • 文档综合演示:公用模块全局变量函数使用演示 —— .jsx 公用模块用法
  • 文档综合演示:贪吃蛇游戏开发演示 —— 原生 JS 与轻语言混合开发实战

轻语言网站:发送网络请求与接口请求

文档概述

网络操作是现代网站程序开发中不可或缺的一部分,通过网络操作可以实现在前端对后端数据的链接,使程序更强大、功能更丰富。

在轻语言网站开发中,同样也支持网络操作,即在页面中与后端通信。

学习目标

阅读本文档后,你应当能够掌握以下内容:

  • 发送GET请求 的用法:单个请求与批量请求
  • 发送POST数据 的用法:单个请求与批量请求
  • 请求接口 函数:仅支持请求当前项目中的 .sph 后端脚本
  • 通过子函数 + 标记(标记)实现批量请求的统一回调
  • 拉姆达表达式接收请求结果的写法
  • 跨域(CORS)限制与同源策略
  • 部署到 PHP 环境才能看到效果的注意事项

涉及函数

函数作用参数说明
发送GET请求(地址, 回调)单个 GET 请求地址、回调(拉姆达或子函数名)
发送GET请求(地址, 子函数名, 标记)批量 GET 请求地址、子函数名、标记
发送POST数据(地址, 数据, 回调)单个 POST 请求地址、数据、回调
发送POST数据(地址, 数据, 子函数名, "", 标记)批量 POST 请求地址、数据、子函数名、空串、标记
请求接口(脚本名, 函数名, 回调)请求项目内 .sph(GET)脚本名、函数名、回调
请求接口(脚本名, 函数名, 回调, 数据)请求项目内 .sph(POST)脚本名、函数名、回调、数据

回调函数签名: (请求结果, 标记) => { ... }函数 子函数名(请求结果, 标记)

函数:发送GET请求

代码示例:

事件 按钮1.被单击(源对象,事件源)
    ' 单个请求可以直接使用 拉姆达表达式 接收请求结果
    变量 目标地址 = "http://localhost/dny/Api.php?a=测试输出"
    发送GET请求(目标地址,(请求结果,标记)=>{
        编辑框1.内容 = "单次GET请求:" + 请求结果
    })
结束 事件

事件 按钮3.被单击(源对象,事件源)
    ' 同时发送多个请求、可采用子函数接收请求结果,并通过标记区分
    变量 目标主机地址 = "http://localhost/dny/Api.php?a="
    发送GET请求(目标主机地址 + "Test2",接收GET请求子函数,"Test2")
    发送GET请求(目标主机地址 + "Test3",接收GET请求子函数,"Test3")
结束 事件

' 将请求集中到一个子函数中处理,通过标记区分
' 这个函数需要手动创建,函数名可以任意起名,但参数必须为:请求结果,标记
函数 接收GET请求子函数(请求结果,标记)
    编辑框1.追加文本行("批量GET请求标记:" + 标记 + ",请求结果:" + 请求结果)
结束 函数

GET 请求要点

  • 单个请求:使用拉姆达表达式 (请求结果,标记) => { ... } 接收结果
  • 批量请求:使用子函数名 + 标记,统一在子函数中通过标记区分来源
  • 回调参数:固定为 (请求结果, 标记),即使不用也不能省略参数位置
  • 标记用途:批量请求时区分不同请求的来源

函数:发送POST数据

代码示例:

事件 按钮2.被单击(源对象,事件源)
    变量 目标地址 = "http://localhost/dny/Api.php?a=Post1"
    发送POST数据(目标地址,"key=VcnStudio666",(请求结果,标记)=>{
        编辑框1.内容 = "POST1:" + 请求结果
    })
结束 事件

事件 按钮4.被单击(源对象,事件源)
    变量 目标主机地址 = "http://localhost/dny/Api.php?a="
    发送POST数据(目标主机地址 + "Post1","key=123",接收POST请求子函数,"","Post1")
    发送POST数据(目标主机地址 + "Post2","sign=123456",接收POST请求子函数,"","Post2")
结束 事件

' 与接收GET请求的回调一样,其实可以直接回调函数指向GET请求子函数接收
' 但是为了便于区分,因此POST采用单独的子函数处理回调
函数 接收POST请求子函数(请求结果,标记)
    编辑框1.追加文本行("批量POST请求标记" + 标记 + ",请求结果:" + 请求结果)
结束 函数

POST 请求要点

  • 数据格式:键值对字符串,如 "key=VcnStudio666""key=123&sign=abc"
  • 批量请求发送POST数据(地址, 数据, 子函数名, "", 标记),第 4 个参数为空串占位
  • 回调与 GET 一致:参数固定为 (请求结果, 标记)

函数:请求接口

"请求接口"函数仅支持请求当前项目中使用轻语言编写的后端脚本文件,不支持请求外部网站。

代码示例:

请求接口测试页面.spl

事件 按钮5.被单击(源对象,事件源)
    ' 请求接口 函数是对 GET与POST 请求的一个封装
    ' 仅支持直接访问当前程序中编写的后端接口中的函数,例如:分别访问GET与POST
    ' 发送GET请求
    请求接口("Api","Test1",(请求结果,标记)=>{
        编辑框1.追加文本行("通过接口请求发送GET请求:" + 请求结果)
    })
    ' 发送POST请求
    请求接口("Api","Post1",(请求结果,标记)=>{
        编辑框1.追加文本行("通过接口请求发送POST请求:" + 请求结果)
    },"key=123")
结束 事件

Api.sph

' ****************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 文件描述:服务端脚本文件、最终将会编译成 PHP 源代码,
'      可在该文件中操作数据库增删改查、读写服务器中的文件。
' 修改日志:
' ****************************************************************************
' 向客户端发送服务器的响应报头(Response Header)
置响应头("Content-Type: text/html; charset=utf-8")
置响应头("Content-Language: zh-CN")

' 引用轻语言封装的PHP核心库,注:如果要删除该引用请确保当前文件中未使用轻语言封装的函数
引用 "library/qing.core.php"

' 调用主函数:"文件被访问"、即当在任何前端中访问该文件时,地址中不带任何参数名,都将会先调用该函数
文件被访问()

' 入口函数,函数名可自定义命名,主要作用:
' 当本文件被访问时,获取其前端传来的请求参数值,根据请求参数值调用当前文件中的函数
函数 文件被访问()
    ' 通过URL中的键参获取要执行的函数,这里我们默认规定键名为"a",例如:
    ' 前端请求地址为:http://xxx.com/本文件名.php?a=测试输出
    ' 其"a"后面的值"测试输出"即为我们要执行的函数,使用"取请求值"函数将其取出后,然后执行。
    变量 待执行函数名 = 取请求值("a")
    如果(为空(待执行函数名))
        输出 "待执行函数不能为空"
    否则
        ' 增加安全验证,只允许执行我们定义的函数
        变量 可被执行的函数列表 = [ "Test1", "Post1" ]
        如果(取成员是否存在(可被执行的函数列表,待执行函数名) == 真)
            输出 执行函数(待执行函数名)
        否则
            输出 "请求执行非法的函数"
        结束 如果
    结束 如果
结束 函数

' 在前端通过发送GET、POST请求、或使用"请求接口"函数调用该函数,或直接在浏览器中访问下面地址
' 地址:http://xxx.com/Api.php?a=Test1
函数 Test1()
    输出 "你发送的请求接收成功;这是反馈信息!"
结束 函数

' 向前端输出当前格式化后的时间信息
' 地址:http://xxx.com/Api.php?a=Post1
函数 获取时间()
    输出 "收到的POST参数:" + 取请求值("key")
结束 函数

请求接口 要点

  • 仅限项目内请求接口 只能请求当前项目中用轻语言编写的 .sph 文件
  • 参数1(脚本名):对应 .sph 文件名(不带扩展名),如 "Api"
  • 参数2(函数名):要调用的后端函数名(会被赋值给 URL 的 a 参数)
  • GET 请求请求接口("Api", "Test1", 回调)
  • POST 请求请求接口("Api", "Post1", 回调, "key=123")
  • 回調签名(请求结果, 标记) => { ... }

三种请求方式对比

函数跨域限制请求目标适用场景
发送GET请求受同源策略限制任意 URL请求外部 GET 接口
发送POST数据受同源策略限制任意 URL请求外部 POST 接口
请求接口不受跨域限制(同源)仅项目内 .sph请求本项目后端

注意事项

  • 需部署到 PHP 环境:在页面中发送网络请求,需要将编译输出的程序部署到支持 PHP 环境的本地 WEB 环境或上传到服务器中,然后打开网页才能看到效果。
  • 同源策略与跨域发送GET请求/发送POST数据 受浏览器同源策略限制,请求非同源地址会报 Access-Control-Allow-Origin 错误。若需跨域,服务端需配置 CORS 响应头。
  • 请求接口 无跨域问题:由于 请求接口 请求的是当前项目内的后端脚本,属于同源请求,不存在跨域问题。
  • 批量请求的回调签名:子函数的参数必须为 (请求结果, 标记),即使不使用标记也必须保留参数位置。
  • POST 数据格式:键值对字符串 "key=value",多个参数用 & 连接:"key1=value1&key2=value2"
  • 异步请求:所有请求均为异步,通过回调接收结果,不能直接在请求后立即使用结果。
  • 拉姆达回调:单次请求可用拉姆达表达式接收;批量请求建议用子函数统一处理。

学习要点总结

知识点关键代码适用场景
单次 GET发送GET请求(地址, (结果,标记) => {...})单个 GET 请求
批量 GET发送GET请求(地址, 子函数名, 标记)多个 GET 请求统一处理
单次 POST发送POST数据(地址, 数据, (结果,标记) => {...})单个 POST 请求
批量 POST发送POST数据(地址, 数据, 子函数名, "", 标记)多个 POST 请求统一处理
项目内接口请求接口("脚本名", "函数名", 回调)请求 .sph(GET)
项目内 POST请求接口("脚本名", "函数名", 回调, 数据)请求 .sph(POST)
回调签名(请求结果, 标记)接收结果
跨域限制同源策略 / CORS外部请求需配置 CORS

相关文档

  • 文档轻语言网站:服务端脚本程序API接口 —— .sph 后端脚本写法
  • 文档轻语言网站:与原生JS混合开发 —— 使用 $.get 等 jQuery 网络请求
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式语法
  • 文档前端(JavaScript)函数_网络请求 —— 网络请求函数详解
  • 文档综合演示:网页留言板开发 —— 前后端联调实战
  • 文档综合演示:MySQL数据库操作 —— 后端接口操作数据库
  • 文档综合演示:WebSocket使用演示 —— WebSocket 实时通信

轻语言网站:静态资源文件的使用

文档概述

网站程序中的所有图片、文本或其它资源文件都必须存放在项目根目录中的 static 文件夹中(即「资源」目录)。在页面代码中使用时,需带上 ./static/ 前缀。本章介绍图片、字体、音频、视频、SVG、图标、JSON/文本等常见资源文件的使用方法。

学习目标

阅读本文档后,你应当能够掌握以下内容:

  • 静态资源目录的位置与 ./static/ 路径前缀
  • 图片资源的赋值方式:图片框.图片 = "./static/logo.jpg"
  • 自定义字体文件的引入:添加字体文件 + 字体名引用
  • 音频播放与浏览器自动播放策略限制
  • 视频播放与尺寸设置
  • SVG 图片的两种引入方式:置SVG代码加载SVG文件
  • 图标(favicon.ico)的放置位置
  • 读取 JSON 与文本文件内容:读JSON文件/读文本文件
  • 浏览器同源策略与本地服务器环境的必要性

涉及组件

组件名称作用参考文档
图片框图片框1显示图片文档图像类组件_图片框
标签标签1显示自定义字体文本文档文本类组件_标签
音频播放器音频播放器1播放音频文档媒体类组件_音频播放器
视频播放器视频播放器1播放视频文档媒体类组件_视频播放器
SVG 图像框SVG图像框1/SVG图像框2显示 SVG文档图像类组件_SVG图像框

涉及函数与关键字

关键字: 事件 ... 结束 事件变量

资源引用方式:

  • 相对路径前缀 ./static/ —— 项目内静态资源
  • 网络地址(http:///https://) —— 外部 CDN 或远程资源

字体函数:

  • 添加字体文件(字体名, 路径, 回调) —— 注册自定义字体,加载完成回调

文件读取函数:

  • 读JSON文件(路径, 回调, 是否解析) —— 读取 JSON 文件,回调返回对象或文本
  • 读文本文件(路径, 回调) —— 读取文本文件,回调返回文本内容

音频视频属性:

  • 音频地址 / 视频地址 —— 设置媒体源
  • 视频宽度 / 视频高度 —— 设置视频显示尺寸
  • 自动播放 / 开始播放() —— 音频播放控制(受浏览器策略限制)

SVG 方法:

  • 置SVG代码(SVG代码文本) —— 直接设置 SVG 源码
  • 加载SVG文件(路径) —— 从文件加载 SVG

网站开发常见的资源文件

  • 字体文件:用于引入自定义字体,常见格式有 .ttf.woff.woff2 等。
  • 音频文件:用于网页中的音效、背景音乐等,常见格式有 .mp3.wav.ogg 等。
  • 视频文件:用于网页中的视频内容,常见格式有 .mp4.webm.ogg 等。
  • 图标文件:用于网页中的各种图标,常见格式有 .ico.svg 等,也可以使用图标字体库如 Font Awesome。
  • 数据文件:用于存储网页需要的数据,常见格式有 .json.xml.csv 等。
  • PDF 文件:用于在网页中嵌入或链接 PDF 文档。
  • SVG 文件:用于矢量图形,可以直接嵌入 HTML 或作为单独文件引用。

代码使用示例

' 1.图片资源文件的使用
图片框1.图片 = "./static/logo.jpg"

' 2.自定义字体文件的使用
添加字体文件("myfont","./static/fonts/custom.font.ttf",()=>{
    标签1.字体 = "myfont"
})

' 3.播放音频文件
音频播放器1.音频地址 = "../static/music2.mp3"
' 自动播放限制:现代浏览器(Chrome、Firefox、Safari 等)都实现了自动播放策略,但要求用户必须先与页面交互才能播放媒体。
' Promise 拒绝:开始播放函数 返回一个 Promise,当播放被阻止时,这个 Promise 会被拒绝并抛出 NotAllowedError。
' 安全策略:这是浏览器的安全机制,防止网站在用户不知情的情况下播放音频或视频。
' 因此下方两句代码在大部分浏览器中不会生效、必须让用户点击才能播放
'音频播放器1.自动播放 = 真
'音频播放器1.开始播放()

' 4、播放视频文件、由于本地没有找到合适的小素材资源文件作演示,这里使用菜鸟教程里面的一个视频地址
视频播放器1.视频地址 = "https://www.runoob.com/try/demo_source/movie.mp4"
' 视频宽度和元素宽度要手动设置保持一致
视频播放器1.视频宽度 = 320
视频播放器1.视频高度 = 240

' 5.图标文件、图标文件比较简单,只需要在编译输出的项目根目录中
' 放置一个名称为:favicon.ico 的图标文件即可,不需要做其它处理

' 6.置SVG图片
SVG图像框1.置SVG代码("<svg width=\"100\" height=\"100\" viewBox=\"0 0 100 100\"><circle cx=\"50\" cy=\"50\" r=\"40\" fill=\"blue\" /></svg>")
SVG图像框2.加载SVG文件("./static/timer.svg")

读取JSON或文本文件内容

事件 按钮1.被单击(源对象,事件源)
    ' 读取JSON数据文件,并解析
    ' 注意:不能直接在浏览器中打开html页面,需要有服务器环境
    调试输出("读取JSON文件:")
    读JSON文件("./static/jsondata.json",(JSON对象)=>{
        调试输出(JSON对象)
    },真)
结束 事件

事件 按钮2.被单击(源对象,事件源)
    读文本文件("./static/data.txt",(文本内容)=>{
        调试输出(文本内容)
    })
结束 事件

注意:

除了图片、音视频资源与脚本文件之外,使用其它任何资源文件时,都必须在本地服务器环境中打开页面才有效,直接在浏览器中打开 .html 文件将无效。

关键代码解读

1. 图片资源引用

图片框1.图片 = "./static/logo.jpg"
  • 必须带 ./static/ 前缀(项目内资源)
  • 也可使用网络地址:图片框1.图片 = "https://..."
  • .spldg XML 中设置图片属性写法:图片="./static/avatar.jpg"

2. 自定义字体加载

添加字体文件("myfont","./static/fonts/custom.font.ttf",()=>{
    标签1.字体 = "myfont"
})
  • 添加字体文件 异步加载字体文件
  • 参数:字体名(自定义)、路径、加载完成回调
  • 字体加载是异步的,必须在回调中才能使用该字体
  • 支持格式:.ttf.woff.woff2

3. 音频播放与浏览器自动播放限制

音频播放器1.音频地址 = "../static/music2.mp3"
'音频播放器1.自动播放 = 真       ' 大部分浏览器不生效
'音频播放器1.开始播放()           ' 大部分浏览器不生效
  • 现代浏览器(Chrome、Firefox、Safari)都实施了自动播放策略
  • **必须用户先与页面交互(点击等)**才能播放媒体
  • 开始播放() 返回 Promise,被阻止时会抛 NotAllowedError
  • 这是浏览器的安全机制,防止网站在用户不知情的情况下播放音视频
  • 解决方案:在按钮点击事件中调用 开始播放()

4. 视频播放

视频播放器1.视频地址 = "https://www.runoob.com/try/demo_source/movie.mp4"
视频播放器1.视频宽度 = 320
视频播放器1.视频高度 = 240
  • 视频地址可为本地 ./static/ 路径或网络地址
  • 视频宽高需手动设置,与组件尺寸保持一致
  • 跨域视频需服务端配置 CORS

5. 网站图标 favicon

项目根目录(编译输出目录)放置:favicon.ico
  • 网站图标无需代码处理
  • 只需在编译输出目录根中放置一个名为 favicon.ico 的文件
  • 浏览器会自动请求该文件作为标签页图标

6. SVG 图片两种引入方式

' 方式一:直接写 SVG 源码
SVG图像框1.置SVG代码("<svg width=\"100\" height=\"100\" viewBox=\"0 0 100 100\"><circle cx=\"50\" cy=\"50\" r=\"40\" fill=\"blue\" /></svg>")

' 方式二:从文件加载
SVG图像框2.加载SVG文件("./static/timer.svg")
  • 置SVG代码 直接传入 SVG 源码字符串,适合动态生成或小段 SVG
  • 加载SVG文件./static/ 加载 .svg 文件,适合复杂图形
  • 两种方式任选其一

7. 读取 JSON 与文本文件

读JSON文件("./static/jsondata.json",(JSON对象)=>{
    调试输出(JSON对象)
},真)

读文本文件("./static/data.txt",(文本内容)=>{
    调试输出(文本内容)
})
  • 均为异步读取,通过回调接收内容
  • 读JSON文件 第三个参数 表示自动解析为对象; 表示返回原始文本
  • 必须在服务器环境中打开页面:浏览器同源策略限制下,file:// 协议无法 AJAX 读取本地文件

注意事项

  • 资源目录固定为 static:所有静态资源必须放在 static 目录下,引用时带 ./static/ 前缀。
  • 网络地址不需要前缀:引用 CDN 或远程资源时直接使用完整 URL(http:///https://)。
  • 音频自动播放受限:现代浏览器禁止无用户交互的自动播放,应在用户点击事件中调用 开始播放()
  • JSON/文本文件需服务器环境:直接双击打开 .html 文件(file://)无法 AJAX 读取文件,必须部署到本地 WEB 环境或服务器。
  • 字体加载是异步的添加字体文件 在回调中才能使用该字体,回调前使用会回退到默认字体。
  • 视频尺寸需手动设视频宽度/视频高度 应与视频播放器组件尺寸保持一致,否则可能拉伸变形。
  • favicon 无需代码:仅需在编译输出目录根放一个 favicon.ico,浏览器自动请求。
  • SVG 字符串转义置SVG代码 中 SVG 源码字符串内的双引号需用 \" 转义。
  • 跨域资源需 CORS:引用外部域名资源时,目标服务器需配置 Access-Control-Allow-Origin

学习要点总结

知识点关键代码适用场景
资源路径前缀./static/项目内资源引用
网络资源https://...CDN/远程资源
图片赋值图片框.图片 = "..."显示图片
自定义字体添加字体文件(名,路径,回调)引入字体
字体引用标签.字体 = "字体名"应用字体
音频地址音频播放器.音频地址 = "..."音频源
视频地址视频播放器.视频地址 = "..."视频源
视频尺寸视频宽度/视频高度视频显示尺寸
SVG 源码置SVG代码("...")动态 SVG
SVG 文件加载SVG文件("...")静态 SVG
读取 JSON读JSON文件(路径,回调,真)加载 JSON 数据
读取文本读文本文件(路径,回调)加载文本内容
网站图标favicon.ico 放根目录标签页图标

相关文档

  • 文档图像类组件_图片框 —— 图片框属性
  • 文档图像类组件_SVG图像框 —— SVG 图像框方法
  • 文档媒体类组件_音频播放器 —— 音频播放控制
  • 文档媒体类组件_视频播放器 —— 视频播放控制
  • 文档文本类组件_标签 —— 标签字体属性
  • 文档前端(JavaScript)函数_字体 —— 添加字体文件 详解
  • 文档前端(JavaScript)函数_文件读取 —— 读JSON文件/读文本文件
  • 文档轻语言网站:工程项目结构 —— static 目录位置与项目结构
  • 文档轻语言网站:与原生JS混合开发 —— 引用外部 .js 与 CDN 资源
  • 文档轻语言网站:界面XML定义规范 —— XML 中引用图片资源
  • 文档综合演示:网页留言板开发 —— 项目结构与资源引用实战

轻语言网站:自定义设计列表内容

文档概述

在轻语言网页开发中,用户可以完全通过中文语法自定义任何列表类型的内容,列表内容的展示在网页开发中非常重要,如果把自定义列表内容学会了,制作出漂亮的网页内容将会变得非常容易。

本节分别讲解列表框宫格框两种容器的自定义渲染方法。两者都遵循「数据集合 + 渲染回调」的分离式渲染模型:先用 添加项目 填充数据,再用 置请求加载项目回调 定义每项的展示视图,最后调用 渲染() 触发显示。

学习目标

阅读本文档后,你应当能够掌握以下内容:

  • 列表框的「纯文本数据 + 单标签渲染」模式
  • 宫格框的「对象数据 + 复合布局渲染」模式
  • 渲染回调的参数:(数据集合, 索引),通过 数据集合[索引] 取当前项数据
  • 在渲染回调中 创建 组件、设置样式、注册点击事件
  • 嵌套回调中的变量捕获(如内层 置被单击回调 引用外层 索引
  • 弹性布局的创建与方向设置:创建 弹性布局() + 方向 = "column"
  • 宫格框的横向对齐方式:space-between 等弹性对齐值

涉及组件

组件名称作用参考文档
列表框列表框1纵向列表容器,展示纯文本项文档列表类组件_列表框
宫格框宫格框2网格/宫格容器,展示图文项文档列表类组件_宫格框
标签代码中 创建 标签()列表项的展示视图文档文本类组件_标签
弹性布局代码中 创建 弹性布局()宫格项的复合根布局文档布局类组件_弹性布局
图片框代码中 创建 图片框()宫格项的图片展示文档图像类组件_图片框

📌 列表项的展示视图并非预置组件,而是在 置请求加载项目回调 中通过 创建 动态生成的。这是轻语言列表渲染的核心模式——数据与视图分离,由回调决定每项如何展示。

涉及函数与关键字

以下为本节代码中出现的轻语言关键字与内置函数:

关键字: 变量事件 ... 结束 事件函数 ... 结束 函数变量循环 ... 结束循环创建返回

列表框/宫格框通用方法:

  • 添加项目(数据) —— 向数据集合追加一条数据(可为字符串或对象)
  • 置请求加载项目回调(回调) —— 设置渲染回调,框架按索引逐项调用取展示视图
  • 渲染() —— 触发按当前数据集合重新渲染

渲染回调参数:

  • 数据集合 —— 全部数据集合(数组),通过 数据集合[索引] 取当前项
  • 索引 —— 当前正在渲染的项索引(从 0 开始)

组件创建:

  • 创建 标签() —— 实例化标签
  • 创建 弹性布局() —— 实例化弹性布局
  • 创建 图片框() —— 实例化图片框

视图通用方法/属性:

  • 置被单击回调(回调) —— 设置被单击回调
  • 添加组件(组件) —— 向容器追加子组件
  • 字体大小内边距文本颜色边框边框圆角宽度高度 —— 样式属性
  • 方向 = "column" —— 弹性布局方向(column 纵向,row 横向)
  • 横向对齐方式 = "space-between" —— 宫格框子项横向分布方式

全局函数:

  • 弹出提示(文本) —— 浏览器弹出轻提示
  • 调试输出(内容) —— 控制台输出

自定义列表内容

列表内容表示内容按照一条一条的排列,下方为一个自定义纯文本显示的列表演示代码。

代码示例:

事件 页面加载完毕()
    渲染纯文本列表框()
结束 事件

' 注意:已在页面设计文件.spldg中添加了“列表框1”组件。
函数 渲染纯文本列表框()
    变量循环(i = 0,10,1)
        列表框1.添加项目("纯文本项目" + i)
    结束循环
    ' 监听浏览器渲染页面时,请求加载项目内容
    ' 这里的项目内容即为列表中的每个项目内容(包含对内容的排版布局)
    ' 在这个事件中,我们可以自定义创建需要展示内容的组件,然后将内容显示到组件中
    列表框1.置请求加载项目回调((数据集合,索引) =>{
        ' 创建一个标签组件、用于显示文本内容
        变量 局_标签 = 创建 标签()
        ' 自定义设置标签的外观
        局_标签.字体大小 = "20px"
        局_标签.内边距 = "10px"
        局_标签.文本颜色 = "#009956"
        ' 监听标签被单击事件
        局_标签.置被单击回调((源对象,事件源) =>{
            弹出提示("项目" + 索引 + "被单击")
        })
        ' 这里需要注意:
        ' 这里的参数 数据集合 为上一步我们添加的项目数据
        ' 参数索引是浏览器返回给我们,告诉我们需要渲染第几个数据
        局_标签.文本 = 数据集合[索引]
        ' 将标签对象返回给浏览器,浏览器将该标签添加到列表中
        返回 局_标签
    })
    ' 渲染并显示列表
    列表框1.渲染()
结束 函数

自定义宫格内容

宫格内容类似表格、宫格方式展示,下方为一个渲染图片与文本的宫格内容展示演示代码。

代码示例:

事件 页面加载完毕()
    渲染图文宫格框()
结束 事件

' 注意:已在页面设计文件.spldg中添加了“宫格框2”组件。
函数 渲染图文宫格框()
    宫格框2.横向对齐方式 = "space-between"
    宫格框2.边框 = "1px #cc1 solid"
    宫格框2.边框圆角 = "2px"
    宫格框2.内边距 = "10px"
    变量循环(i = 0,30,1)
        变量 项目对象 = { }
        项目对象.图片 = "./static/head.jpg"
        项目对象.标题 = "项目" + i
        宫格框2.添加项目(项目对象)
    结束循环
    宫格框2.置请求加载项目回调((数据集合,索引)=>{
        变量 局_根布局 = 创建 弹性布局()
        局_根布局.方向 = "column"
        '局_根布局.边框 = "1px #cc1 solid"
        变量 局_图片框 = 创建 图片框()
        局_图片框.宽度 = "180px"
        局_图片框.高度 = "120px"
        局_图片框.边框 = "1px #ccc solid"
        局_图片框.边框圆角 = "4px"
        局_图片框.图片 = 数据集合[索引].图片
        变量 局_标题标签 = 创建 标签()
        局_标题标签.文本 = 数据集合[索引].标题
        ' 将图片、标题添加到根布局
        局_根布局.添加组件(局_图片框)
        局_根布局.添加组件(局_标题标签)
        ' 注册根布局点击事件
        局_根布局.置被单击回调(()=>{
            弹出提示("图文宫格项目:" + 索引 + "被单击")
            调试输出(数据集合[索引])
        })
        返回 局_根布局
    })
    宫格框2.渲染()
结束 函数

关键代码解读

1. 「数据 + 渲染回调」分离式渲染模型

两个示例都遵循同一模型:

' ① 填充数据
变量循环(i = 0,10,1)
    列表框1.添加项目("纯文本项目" + i)
结束循环
' ② 定义渲染回调(每渲染一项调用一次)
列表框1.置请求加载项目回调((数据集合,索引) =>{
    变量 局_标签 = 创建 标签()
    局_标签.文本 = 数据集合[索引]
    返回 局_标签
})
' ③ 触发渲染
列表框1.渲染()

要点:

  • 添加项目 只是向数据集合追加记录,不会立即产生 DOM
  • 必须调用 渲染() 后,框架才会遍历数据集合,按索引回调取每一项的视图
  • 回调返回的视图由容器自动添加到 DOM,开发者无需手动 添加组件
  • 数据可为字符串(列表框示例)或对象(宫格框示例),回调中按 数据集合[索引] 取出

2. 渲染回调的两个参数

列表框1.置请求加载项目回调((数据集合,索引) =>{
    局_标签.文本 = 数据集合[索引]
})
  • 数据集合:全部数据的数组引用,通过 数据集合[索引] 取当前项
  • 索引:当前正在渲染的项序号(从 0 开始)
  • 列表框示例中 数据集合[索引] 是字符串;宫格框示例中 数据集合[索引].图片 是对象属性

3. 嵌套回调中的变量捕获

列表框1.置请求加载项目回调((数据集合,索引) =>{
    变量 局_标签 = 创建 标签()
    局_标签.置被单击回调((源对象,事件源) =>{
        弹出提示("项目" + 索引 + "被单击")
    })
    局_标签.文本 = 数据集合[索引]
    返回 局_标签
})
  • 内层 置被单击回调 引用了外层回调的参数 索引
  • 用户点击标签时,外层渲染回调早已返回,索引 是否保持当时的值取决于闭包捕获语义
  • 官方示例普遍采用这种写法,说明轻语言的拉姆达对回调参数按调用时的值捕获(类似 JavaScript let 语义)
  • 每次渲染回调调用时,索引 都是独立的值,因此每个标签点击都能取到正确序号

4. 宫格框的复合项渲染

宫格框2.置请求加载项目回调((数据集合,索引)=>{
    变量 局_根布局 = 创建 弹性布局()
    局_根布局.方向 = "column"
    变量 局_图片框 = 创建 图片框()
    ' ...设置图片框属性...
    变量 局_标题标签 = 创建 标签()
    局_标题标签.文本 = 数据集合[索引].标题
    局_根布局.添加组件(局_图片框)
    局_根布局.添加组件(局_标题标签)
    返回 局_根布局
})
  • 宫格项的展示视图是一个复合组件:以弹性布局为根,内含图片框 + 标签
  • 创建 弹性布局() 实例化弹性布局,方向 = "column" 设为纵向排列(图片在上、标题在下)
  • 添加组件 把图片框和标签挂到弹性布局下
  • 最后 返回 局_根布局,宫格框会把这个复合视图添加到对应网格中

5. 宫格框的横向对齐方式

宫格框2.横向对齐方式 = "space-between"
  • space-between 让子项在主轴上两端对齐、中间均分
  • 其他常用值:flex-start(左对齐)、center(居中)、space-around(等间距环绕)
  • 实际对应 CSS justify-content 属性

6. 列表框 vs 宫格框的对比

维度列表框宫格框
排列方式纵向单列网格/多列
数据类型字符串或对象通常为对象(多字段)
渲染回调返回通常单个标签常为复合布局(弹性布局+多子组件)
典型场景留言列表、笔记列表图文展示、商品九宫格
渲染模型数据 + 回调 + 渲染()数据 + 回调 + 渲染()(同源)

注意事项

  • 数据与视图分离添加项目 不产生 DOM,必须调用 渲染() 才会触发回调生成视图。
  • 循环边界语义变量循环(i = 0, 10, 1) 等效于 for(i=0; i<10; i++),即 i 小于目标值时循环、达到目标值时退出,左闭右开区间 [0, 10),循环执行 10 次(i=0~9)。本节示例 变量循环(i = 0,10,1) 添加 10 项数据,变量循环(i = 0,30,1) 添加 30 项数据。
  • 渲染回调返回值:回调必须 返回 一个视图组件,容器才能将其加入 DOM。若返回 则该项不显示。
  • 嵌套闭包捕获:内层 置被单击回调 引用外层 索引 时,依赖拉姆达按值捕获语义。官方示例普遍采用此写法,生成代码时可参照;若遇异常应改用参数绑定。
  • 复合视图根布局:宫格项的展示视图若为复合结构,应以一个容器(如弹性布局)作为根,把子组件挂到根下后返回根,不要返回多个组件。
  • 方向 属性:弹性布局 方向 = "column" 为纵向,"row" 为横向。默认值因组件而异,建议显式设置。
  • 图片路径:示例中 "./static/head.jpg" 为相对路径,实际项目中图片需放在 static 目录下。
  • 弹出提示 字符变体:本节代码中 弹出提示 在不同文档中可能有字符显示差异(如 出提示`),实际为同一函数。

学习要点总结

知识点关键代码适用场景
数据填充添加项目(数据)列表框、宫格框
渲染回调置请求加载项目回调((数据集合,索引)=>{...})自定义列表项
触发渲染渲染()数据变化后刷新
回调参数数据集合[索引]取当前项数据
动态创建标签创建 标签()列表项展示
动态创建弹性布局创建 弹性布局()复合项根布局
弹性布局方向方向 = "column"纵向排列子组件
复合视图组装根布局.添加组件(子组件)宫格图文项
嵌套回调置被单击回调(()=>{...引用外层索引...})项点击事件
横向对齐横向对齐方式 = "space-between"宫格分布
回调返回值返回 局_标签提供展示视图

相关文档

  • 文档列表类组件_列表框 —— 列表框的完整属性与方法
  • 文档列表类组件_宫格框 —— 宫格框的完整属性与方法
  • 文档布局类组件_弹性布局 —— 弹性布局的创建、方向、对齐
  • 文档文本类组件_标签 —— 标签的属性与方法
  • 文档图像类组件_图片框 —— 图片框的属性
  • 文档框架基础类_容器视图 —— 容器通用方法(添加组件等)
  • 文档框架基础类_视图 —— 视图通用方法(置被单击回调等)
  • 文档轻语言网站:循环语句体结构 —— 变量循环计次循环 的完整说明
  • 文档轻语言网站:轻语言语法速查 —— 关键字、运算符、拉姆达表达式
  • 文档综合演示:网页留言板开发 —— 列表框数据驱动渲染的完整示例
  • 文档综合演示:手机移动端记事本网页开发 —— 列表框渲染笔记项
  • 文档综合演示:XML 定义待办事项列表演示 —— XML 定义列表的另一种方式
  • 文档综合演示:XML 与使用代码动态创建组件演示 —— 创建 动态实例化组件的更多场景

轻语言网站:服务端脚本程序API接口

文档概述

本章讲解如何在轻语言网页程序中编写后端脚本文件(.sph),轻语言网站程序中的后端脚本文件采用轻语言语法编写,编译时输出为标准 PHP 文件,可在该文件中操作数据库增删改查、读写服务器中的文件。

学习目标

阅读本文档后,你应当能够掌握以下内容:

  • .sph 后端脚本文件的基本结构与执行流程
  • 文件被访问() 入口函数的请求路由机制
  • 取请求值("a") 取出 URL 参数并动态执行对应函数
  • 安全验证:通过函数白名单防止非法调用
  • 输出 函数向客户端返回数据
  • 模块化引用:引用 "模块名".sph 之间复用代码
  • 字符串连接 + 的限制(至少一边为字面字符串)
  • 置响应头 设置响应报头
  • 引用 "library/qing.core.php" 引入核心库

涉及关键字与函数

关键字: 引用函数 ... 结束 函数变量如果 ... 否则 ... 结束 如果返回输出

后端专用函数:

函数作用示例
置响应头(报头)设置响应报头置响应头("Content-Type: text/html; charset=utf-8")
取请求值(键名)取出 GET/POST 参数取请求值("a")
为空(值)判断是否为空为空(待执行函数名)
执行函数(函数名)动态执行函数执行函数(待执行函数名)
输出(内容)向客户端输出内容输出 "反馈信息"
取成员是否存在(数组,值)判断数组是否包含值取成员是否存在(列表,函数名)
取现行时间戳()获取当前时间戳取现行时间戳()
格式化时间(格式,时间戳)格式化时间格式化时间("Y-m-d",取现行时间戳())
读文件内容(路径)读取服务器文件读文件内容("/static/ceshi.txt")

语法格式

采用面向过程编写代码,所有语句从上到下依次执行。

示例:Api1.sph

' ****************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 文件描述:服务端脚本文件、最终将会编译成 PHP 源代码,
'      可在该文件中操作数据库增删改查、读写服务器中的文件。
' 修改日志:
' ****************************************************************************
' 向客户端发送服务器的响应报头(Response Header)
置响应头("Content-Type: text/html; charset=utf-8")
置响应头("Content-Language: zh-CN")

' 引用轻语言封装的PHP核心库,注:如果要删除该引用请确保当前文件中未使用轻语言封装的函数
引用 "library/qing.core.php"

' 调用主函数:"文件被访问"、即当在任何前端中访问该文件时,地址中不带任何参数名,都将会先调用该函数
文件被访问()

' 入口函数,函数名可自定义命名,主要作用:
' 当本文件被访问时,获取其前端传来的请求参数值,根据请求参数值调用当前文件中的函数
函数 文件被访问()
    ' 通过URL中的键参获取要执行的函数,这里我们默认规定键名为"a",例如:
    ' 前端请求地址为:http://xxx.com/本文件名.php?a=测试输出
    ' 其"a"后面的值"测试输出"即为我们要执行的函数,使用"取请求值"函数将其取出后,然后执行。
    变量 待执行函数名 = 取请求值("a")
    如果(为空(待执行函数名))
        输出 "待执行函数不能为空"
    否则
        ' 增加安全验证,只允许执行我们定义的函数
        变量 可被执行的函数列表 = [ "测试输出", "获取时间" ,"读TXT文件内容"]
        如果(取成员是否存在(可被执行的函数列表,待执行函数名) == 真)
            输出 执行函数(待执行函数名)
        否则
            输出 "请求执行非法的函数"
        结束 如果
    结束 如果
结束 函数

' 在前端通过发送GET、POST请求、或使用"请求接口"函数调用该函数,或直接在浏览器中访问下面地址
' 地址:http://xxx.com/Api.php?a=测试输出
函数 测试输出()
    输出 "你发送的请求接收成功;这是反馈信息!"
结束 函数

' 向前端输出当前格式化后的时间信息
' 地址:http://xxx.com/Api.php?a=获取时间
函数 获取时间()
    输出 "当前时间:" + 格式化时间("Y-m-d",取现行时间戳())
结束 函数

' 向前端输出服务器中指定位置的".txt"文本文件
' 地址:http://xxx.com/Api.php?a=读TXT文件内容
函数 读TXT文件内容()
    输出 "ceshi.txt 内容:" + 读文件内容("/static/ceshi.txt")
结束 函数

' 内部函数,未添加到 可被执行的函数列表 中,因此前端请求时不会执行该函数
函数 内部私有函数()
    返回 "这是内部函数,URL不可访问"
结束 函数

关键代码解读

1. .sph 文件执行流程

置响应头("Content-Type: text/html; charset=utf-8")    ' 1. 设置响应头
引用 "library/qing.core.php"                          ' 2. 引入核心库
文件被访问()                                            ' 3. 调用入口函数(从上到下执行)
  • 文件从上到下顺序执行
  • 先设置响应头、引入核心库,再调用入口函数
  • 入口函数名可自定义,但需在文件顶层调用一次

2. 请求路由:通过 URL 的 a 参数分发

变量 待执行函数名 = 取请求值("a")
如果(为空(待执行函数名))
    输出 "待执行函数不能为空"
否则
    变量 可被执行的函数列表 = [ "测试输出", "获取时间" ,"读TXT文件内容"]
    如果(取成员是否存在(可被执行的函数列表,待执行函数名) == 真)
        输出 执行函数(待执行函数名)
    否则
        输出 "请求执行非法的函数"
    结束 如果
结束 如果
  • 约定 URL 中的 a 参数值为要调用的函数名
  • 例如 ?a=测试输出 将调用 测试输出() 函数
  • 必须使用白名单校验:仅允许执行预定义的函数列表,防止非法调用

3. 安全机制:函数白名单

变量 可被执行的函数列表 = [ "测试输出", "获取时间" ,"读TXT文件内容"]
如果(取成员是否存在(可被执行的函数列表,待执行函数名) == 真)
    输出 执行函数(待执行函数名)
否则
    输出 "请求执行非法的函数"
结束 如果
  • 所有允许通过 URL 调用的函数必须加入白名单数组
  • 未在白名单中的函数(如 内部私有函数)无法通过 URL 访问
  • 取成员是否存在(数组, 值) 判断值是否在数组中

4. 输出与返回

函数 测试输出()
    输出 "你发送的请求接收成功;这是反馈信息!"
结束 函数
  • 输出 内容 将内容作为响应体返回给客户端
  • 返回 值 仅在函数内返回值,不直接输出到客户端
  • 通常入口函数中使用 输出 执行函数(函数名) 将函数返回值输出

变量

与前端定义变量语法完全一致。

代码示例:

' 定义字符串文本变量
变量 页面变量 = "变量定义测试"

' 定义整数变量
变量 X,Y = 0

函数

与前端定义函数的语法完全一致。

代码示例:

' 无参数、无返回值的函数
函数 无返回值函数()
    调试输出("无返回值的函数被执行")
结束 函数

' 有返回值的函数、不需要定义返回类型,只需要在函数中返回值即可,
' 函数中的参数也不需要定义任何数据类型,所有参数默认可接收所有数据类型
函数 有返回值的函数(参数一,参数二)
    返回 参数一 + 参数二
结束 函数

模块化引用、代码复用

轻语言编写的后端脚本文件,最终编译输出为标准单个 .php 脚本文件,因此在轻语言中每个 .sph 可以被独立运行,也可以被引用到其它 .sph 文件中使用。

模块文件示例:Module1.sph

' ****************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 文件描述:后端脚本复用封装的函数。
' 修改日志:
' ****************************************************************************
' 注释标记当前文件为模块,提供给IDE做语法分析时自动完成智能提示,不参与编译判断
' @模块 = 真

函数 Module1_取当前格式化时间()
    返回 "当前时间:" + 格式化时间("Y-m-d",取现行时间戳())
结束 函数

函数 Module1_计算加法(参数1,参数2)
    返回 参数1 * 参数2
结束 函数

接口文件示例:App1.sph

' ****************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 文件描述:测试模块函数的服务端脚本文件、最终将会编译成 PHP 源代码
' 修改日志:
' ****************************************************************************

' 向客户端发送服务器的响应报头(Response Header)
置响应头("Content-Type: text/html; charset=utf-8")
置响应头("Content-Language: zh-CN")

' 引用轻语言封装的PHP核心库,注:如果要删除该引用请确保当前文件中未使用轻语言封装的函数
引用 "library/qing.core.php"

' 引用项目中的模块脚本文件
引用 "Module1"

' 调用主函数:"文件被访问"、即当在任何前端中访问该文件时,地址中不带任何参数名,都将会先调用该函数
文件被访问()

' 入口函数,函数名可自定义命名,主要作用:
' 当本文件被访问时,获取其前端传来的请求参数值,根据请求参数值调用当前文件中的函数
函数 文件被访问()
    ' 通过URL中的键参获取要执行的函数,这里我们默认规定键名为"a",例如:
    ' 前端请求地址为:http://xxx.com/本文件名.php?a=测试输出
    ' 例如:http://xxx.com/Api1.php?a=取当前格式化时间
    ' 其"a"后面的值"测试输出"即为我们要执行的函数,使用"取请求值"函数将其取出后,然后执行。
    变量 待执行函数名 = 取请求值("a")
    如果(为空(待执行函数名))
        输出 "待执行函数不能为空"
    否则
        如果(待执行函数名 == "取当前格式化时间")
            输出 Module1_取当前格式化时间()
        否则 如果(待执行函数名 == "计算加法")
            如果(为空(取请求值(key1)) 或 为空(取请求值(key2)))
                输出 "目标计算参数获取失败,请确认提交请求时是否传入了key1、key2参数值"
            否则
                输出 Module1_计算加法(10,20)
            结束 如果
        结束 如果
    结束 如果
结束 函数

模块化要点

  • 使用 引用 "模块名" 引入其它 .sph 文件
  • 模块文件建议添加 ' @模块 = 真 注释标记,便于 IDE 识别
  • 模块中的函数通过 模块名_函数名() 的方式调用(约定)
  • 模块函数不会通过 URL 直接访问,需在入口中显式调用

注意事项

  • 字符串连接 + 的限制:原生 PHP 中以 . 连接字符串,在轻语言中可用 + 连接,但必须满足 + 两边至少有一个 Token 为静态字符串常量值(即用双引号括起来的值)。
变量 测试1 = "姓名:" + "张三"  ' 正确合法
变量 年龄 = 23
变量 测试2 = "年龄:" + 年龄  ' 正确合法
变量 前缀= "【签名】"
变量 测试3 = 前缀 + "这是一段字符串,年龄:"  + 年龄  ' 正确合法

变量 水果1 = "苹果"
变量 水果2 = "香蕉"
变量 水果3 = 水果1 + 水果2 ' 错误:两边都不是字面字符串
  • 白名单必须校验:通过 URL 调用的函数必须在白名单中,防止非法调用。
  • 文件被访问 函数名可自定义:入口函数名可以任意命名,但需在文件顶层显式调用。
  • 输出返回 区别输出 直接将内容作为响应返回给客户端;返回 仅在函数内返回值。
  • 核心库引用引用 "library/qing.core.php" 提供轻语言封装的 PHP 函数,若删除需确保未使用这些函数。
  • 模块文件路径引用 "Module1" 不要带扩展名,编译器自动查找 .sph
  • 响应头位置置响应头 必须在任何 输出 之前调用,否则无效。
  • 输出顺序:由于是顺序执行,入口函数调用必须在所有定义之后。

学习要点总结

知识点关键代码适用场景
后端脚本.sph 文件服务端 API
入口函数文件被访问()请求路由
取请求参数取请求值("a")获取 URL 参数
函数白名单取成员是否存在(列表, 名)安全校验
动态执行执行函数(函数名)调用对应函数
输出响应输出 内容返回数据给客户端
设置响应头置响应头(...)Content-Type 等
引用核心库引用 "library/qing.core.php"使用封装函数
引用模块引用 "Module1"代码复用
字符串连接"前缀" + 变量至少一边为字面字符串

相关文档

  • 文档轻语言网站:发送网络请求与接口请求 —— 前端如何请求 .sph 接口
  • 文档轻语言网站:工程项目结构 —— .sph 文件在项目中的位置
  • 文档轻语言网站:轻语言语法速查 —— 函数定义、变量声明语法
  • 文档轻语言网站:变量与数组与对象的定义 —— 变量与函数定义
  • 文档后端(PHP)函数_请求 —— 取请求值 等请求函数
  • 文档后端(PHP)函数_响应 —— 输出/置响应头 等响应函数
  • 文档后端(PHP)函数_时间 —— 取现行时间戳/格式化时间
  • 文档后端(PHP)函数_文件 —— 读文件内容 等文件操作
  • 文档后端(PHP)函数_数组 —— 取成员是否存在 等数组函数
  • 文档综合演示:MySQL数据库操作 —— 后端脚本操作数据库实战
  • 文档综合演示:网页留言板开发 —— 前后端联调实战

前端(JavaScript)函数_储存类

文档概述

轻语言网站开发中的储存类操作函数、基于浏览器 localStorage 封装用于本地数据存储,包含数据读写、数据删除、存储空间管理等功能,每个网站最大存储空间为5M,超过5M的数据将无法保存,常用于用户偏好设置、数据缓存、离线存储等场景。

  • 持久化存储保存配置 / 读取配置 基于 localStorage,关闭浏览器后数据仍然保留
  • 会话存储保存临时数据 / 取临时保存数据 基于 sessionStorage,关闭浏览器标签页后数据自动清除
  • 存储容量:单个域名下最大 5MB,适合存储用户偏好、缓存数据、表单草稿等小体量数据

💡 存储复杂对象:localStorage 只能存储字符串,因此存储对象/数组时需先用 JSON编码 序列化为字符串,读取时再用 JSON解析 还原为对象。

函数:保存配置(键名,值)

存储指定键值对到本地存储中。代码示例:保存配置("用户名", "张三")

' 存储简单的字符串数据
保存配置("用户名", "张三")

' 存储复杂对象(需先用 JSON编码 序列化为 JSON 字符串)
变量 用户信息 = {
	"姓名": "李四",
	"年龄": 25,
	"邮箱": "lisi@example.com"
}
保存配置("用户信息", JSON编码(用户信息))

' 存储数字和布尔值
保存配置("访问次数", 10)
保存配置("是否登录", 真)

函数:读取配置(键名)

从本地存储中获取指定键对应的值。代码示例:变量 用户名 = 读取配置("用户名")

' 获取简单数据
变量 用户名 = 读取配置("用户名")

' 获取并解析复杂对象
变量 用户信息JSON = 读取配置("用户信息")
如果(用户信息JSON != 空)
	变量 用户信息 = JSON解析(用户信息JSON)
	调试输出("用户姓名: " + 用户信息.姓名)
结束 如果

' 获取数字和布尔值(需要类型转换)
变量 访问次数 = 到整数(读取配置("访问次数"))
变量 是否登录 = (读取配置("是否登录") == "真")

函数:删除配置(键名)

从本地存储中移除指定键及其对应的值。代码示例:删除配置("用户名")

' 删除特定的缓存项
删除配置("用户名")

' 删除复杂对象缓存
删除配置("用户信息")

' 在用户退出时清理个人信息
按钮_退出登录.置被单击回调((源对象, 事件) => {
	删除配置("用户名")
	删除配置("用户信息")
	删除配置("访问次数")
	删除配置("是否登录")
	切换页面("登录页")
})

函数:清空配置()

清空所有存储在本地存储中的数据。代码示例:清空配置()

' 清空所有本地存储数据
清空配置()

' 在需要重置应用时使用
按钮_重置应用.置被单击回调((源对象, 事件) => {
	清空配置()
	弹出提示("应用已重置,请重新登录")
	切换页面("登录页")
})

函数:取配置记录数()

返回存储对象中包含多少条配置数据。代码示例:变量 配置数 = 取配置记录数()

' 获取配置项的数量
变量 配置数 = 取配置记录数()
调试输出("当前共有 " + 配置数 + " 项配置")

' 根据缓存数量决定处理逻辑
如果(取配置记录数() > 0)
	调试输出("存在配置数据,可以进行恢复")
否则
	调试输出("无配置数据,需要初始化")
结束 如果

函数:保存临时数据(键名,值)

存储指定键值对到会话存储中。代码示例:保存临时数据("表单数据", 表单内容)

' 存储临时表单数据
变量 表单内容 = {
	"姓名": 姓名输入框.内容,
	"电话": 电话输入框.内容
}
保存临时数据("表单数据", JSON编码(表单内容))

' 存储页面间临时传递的数据
保存临时数据("来源页面", "用户列表页")

' 存储购物车临时信息
保存临时数据("购物车商品数", 购物车.取商品数())

函数:取临时保存数据(键名)

从会话存储中获取指定键对应的值。代码示例:变量 表单数据 = 取临时保存数据("表单数据")

' 获取临时表单数据
变量 表单数据JSON = 取临时保存数据("表单数据")
如果(表单数据JSON != 空)
	变量 表单数据 = JSON解析(表单数据JSON)
	姓名输入框.内容 = 表单数据.姓名
	电话输入框.内容 = 表单数据.电话
结束 如果

' 获取页面间传递的临时数据
变量 来源页面 = 取临时保存数据("来源页面")
如果(来源页面 == "用户列表页")
	返回按钮.显示模式 = 显示_块
结束 如果

函数:删除临时数据(键名)

从会话存储中移除指定键及其对应的值。代码示例:删除临时数据("表单数据")

' 删除临时表单数据
删除临时数据("表单数据")

' 提交表单后清除临时数据
提交按钮.置被单击回调((源对象, 事件) => {
	' 执行提交操作
	提交表单()

	' 清除临时存储的表单数据
	删除临时数据("表单数据")
	弹出提示("提交成功")
})

函数:清空临时数据()

清空所有存储在会话存储中的数据。代码示例:清空临时数据()

' 清空所有会话存储数据
清空临时数据()

' 用户注销时清除会话数据
注销按钮.置被单击回调((源对象, 事件) => {
	清空临时数据()
	切换页面("登录页")
})

函数:取临时数据记录数()

返回临时存储对象中包含多少条数据。代码示例:变量 临时数据数 = 取临时数据记录数()

' 获取临时数据项的数量
变量 临时数据数 = 取临时数据记录数()
调试输出("当前会话共有 " + 临时数据数 + " 项临时数据")

' 检查是否有临时数据
如果(临时数据数 > 0)
	调试输出("检测到临时数据,正在恢复...")
	恢复临时数据()
结束 如果

学习要点

知识点代码示例说明
持久化存储保存配置("用户名", "张三")基于 localStorage,浏览器关闭后数据仍保留,适合用户偏好、登录状态等
会话存储保存临时数据("表单数据", 内容)基于 sessionStorage,标签页关闭后自动清除,适合表单草稿、页面间传值
对象序列化保存配置("用户信息", JSON编码(用户信息))localStorage 只能存字符串,存储对象/数组必须先用 JSON编码 转换
对象反序列化变量 用户 = JSON解析(读取配置("用户信息"))读取后用 JSON解析 还原为对象,再访问其属性
空值判断如果(读取配置("key") != 空)键不存在时返回 ,需先判空再使用,避免对空值调用方法报错
数值类型转换变量 次数 = 到整数(读取配置("访问次数"))读取出来的数字是字符串型,需用 到整数/到小数 转换后参与数学运算
批量清理清空配置() / 清空临时数据()退出登录时清空全部数据,避免隐私泄露
记录数查询取配置记录数() / 取临时数据记录数()获取存储中的键值对总数,用于判断是否有数据可恢复

相关文档

  • 文档前端(JavaScript)函数_数据转换类 —— JSON编码JSON解析到整数到文本 等类型转换函数
  • 文档前端(JavaScript)函数_数据操作类 —— 数据深拷贝、合并、遍历等操作
  • 文档轻语言网站:变量与数组与对象的定义 —— 变量声明、对象与数组的基本语法
  • 文档综合演示:手机移动端记事本网页开发 —— 记事本数据持久化存储实战
  • 文档综合演示:公用模块全局变量函数使用演示 —— 跨页面共享数据与配置存储实战

前端(JavaScript)函数_历史类

文档概述

轻语言网站开发中的历史类操作函数、用于管理浏览器历史记录,包含页面历史记录操作、前进后退控制、历史状态管理等功能,常用于单页应用路由、历史记录管理、页面状态恢复等场景。

  • 历史记录查询取历史记录数 返回历史列表中的网址数量,用于判断是否有上一页可返回
  • 前进后退后退页面 / 前进页面 等价于浏览器左上角的后退/前进按钮,无对应页面时操作无效
  • 指定跳转加载指定历史页面 支持数字参数(相对位置)或字符串参数(URL 匹配)

💡 历史记录注意后退页面/前进页面 是异步操作,且依赖历史记录存在。新标签页打开的页面历史记录为 1,无法后退。加载指定历史页面(-1) 等价于 后退页面加载指定历史页面(1) 等价于 前进页面

函数:取历史记录数()

返回历史列表中的网址数。

' 获取历史记录数量
变量 记录数 = 取历史记录数()
调试输出("历史记录数: " + 记录数)

' 判断是否有上一页可返回
如果(记录数 > 1)
	返回按钮.显示模式 = 显示_块
调试输出("可以返回上一页")
否则
	返回按钮.显示模式 = 显示_隐藏
调试输出("无历史记录可返回")
结束 如果

' 页面加载时根据历史记录控制返回按钮显示
页面.置被创建回调(() => {
	如果(取历史记录数() > 1)
		返回按钮.显示模式 = 显示_块
	否则
		返回按钮.显示模式 = 显示_隐藏
	结束 如果
})

函数:后退页面()

返回到上一个页面;如果上个页面存在的话。

' 返回上一页
后退页面()

' 点击返回按钮返回上一页
返回按钮.置被单击回调(() => {
	后退页面()
})

' 表单取消时返回
取消按钮.置被单击回调(() => {
	后退页面()
})

' 带历史记录判断的安全后退
返回按钮.置被单击回调(() => {
	如果(取历史记录数() > 1)
		后退页面()
	否则
		切换页面("首页")  ' 无历史记录则跳首页
	结束 如果
})

函数:前进页面()

前进到历史记录中的位于当前页面的下一个页面。

' 前进到下一页
前进页面()

' 点击前进按钮
前进按钮.置被单击回调(() => {
	前进页面()
})

' 监听前进后退状态更新按钮
页面.置被显示回调(() => {
	如果(取历史记录数() > 1)
		前进按钮.可用 = 真
	后退按钮.可用 = 真
	否则
		前进按钮.可用 = 假
	结束 如果
})

函数:加载指定历史页面(值)

加载历史列表中的某个具体的页面,该参数值可以是数字,(-1上一个页面,1前进一个页面),或一个字符串,字符串必须是局部或完整的URL,该函数会去匹配字符串的第一个URL。

' 后退2页(跳过中间页面)
加载指定历史页面(-2)

' 前进1页
加载指定历史页面(1)

' 刷新当前页(相当于0)
加载指定历史页面(0)

' 通过URL匹配跳转(匹配历史记录中的URL)
加载指定历史页面("about.html")

' 通过完整URL跳转
加载指定历史页面("https://www.example.com/news")

' 返回首页(相对位置跳转)
首页按钮.置被单击回调(() => {
	加载指定历史页面("index.html")
})

学习要点

知识点代码示例说明
历史记录数取历史记录数()返回历史列表长度,>1 表示有上一页可返回
后退操作后退页面()返回上一页,等价于 加载指定历史页面(-1);无历史记录时无效
前进操作前进页面()前进到下一页,等价于 加载指定历史页面(1);需先有后退操作才能前进
相对跳转加载指定历史页面(-2)数字参数:负数后退N页、正数前进N页、0刷新当前页
URL匹配跳转加载指定历史页面("about.html")字符串参数:匹配历史记录中第一个含此URL的页面
异步特性后退页面() 后需配合 置被显示回调历史操作是异步的,页面切换后用 置被显示回调 监听并更新UI
显示控制显示模式 = 显示_块 / 显示_隐藏控制元素显示/隐藏,常用于根据历史记录显示返回按钮

相关文档

  • 文档前端(JavaScript)函数_URL地址操作类 —— 取URL完整地址重载页面 等URL操作
  • 文档前端(JavaScript)函数_浏览器操作类 —— 切换页面弹出提示 浏览器控制函数
  • 文档前端(JavaScript)函数_窗口操作 —— 打开窗口关闭窗口 窗口管理函数
  • 文档前端(JavaScript)函数_储存类 —— 保存配置 存储页面状态用于恢复
  • 文档前端(JavaScript)函数_文档操作 —— 查找元素ByID 等DOM操作函数

前端(JavaScript)函数_字符串操作

文档概述

轻语言网站开发中的字符串相关操作函数、用于处理文本和字符串内容,包含获取随机字符串、判断文本是否包含目标文本、取文本长度、翻转文本、替换文本内容等功能,常用于在编码中处理字符串、文本内容相关场景。

  • 文本查找寻找文本(正序)、倒找文本(逆序) 返回索引;取包含文本 返回布尔值;未找到均返回 -1
  • 文本截取取文本左边/取文本右边/取文本中间(按位置长度)、取指定文本左边/取指定文本右边/取指定文本中间(按标记文本)、取字符(单字符)
  • 文本替换子文本替换(替换首个)、子文本替换全部(替换全部)、格式化文本({0}占位符)
  • 文本清洗删首尾空/删首空/删尾空/删全部空(去空白)、到全角/到半角(全半角转换)
  • 文本分析取文本长度(字符数)、取文本字节长度(UTF-8字节数)、取文本行数翻转文本到小写/到大写取相等

💡 字符长度与字节长度取文本长度 返回字符数(中文1字=1),取文本字节长度 返回 UTF-8 字节数(中文1字=3字节)。数据库字段长度限制、网络传输长度限制通常按字节计算,验证时需用 取文本字节长度

函数:为空(值 为 泛型)

获取并判断指定文本变量或字符串、或对象是否为空值。

' 检查字符串是否为空
变量 文本1 = ""
变量 文本2 = "  "
变量 文本3 = "hello"
调试输出(为空(文本1))  ' 真
调试输出(为空(文本2))  ' 真(纯空格也算空)
调试输出(为空(文本3))  ' 假
' 检查对象是否为空
' 注:轻语言的空值关键字为 空,等价于原生 JS 的 null
变量 空对象 = 空
调试输出(为空(空对象))  ' 真

函数:取随机字符串(长度 为 整数型)

取出指定位数长度的随机字符串(由小写字母加数字组成),注意:长度必须大于0。

' 生成8位随机字符串(常用于验证码、临时密码)
变量 随机串 = 取随机字符串(8)
调试输出("随机字符串: " + 随机串)  ' 如:a3f9x2k1
' 生成16位随机字符串(用于token)
变量 令牌 = 取随机字符串(16)
调试输出("令牌: " + 令牌)
' 生成4位验证码
变量 验证码 = 取随机字符串(4)
调试输出("验证码: " + 验证码)

函数:取包含文本(源文本 为 文本型,目标文本 为 文本型)

获取指定源文本中是否包含目标文本;如果包含则返回真、否则返回假。

' 检查邮箱是否包含@符号
变量 邮箱 = "user@example.com"
如果(取包含文本(邮箱, "@"))
	调试输出("邮箱格式包含@符号")
否则
	调试输出("邮箱格式不正确")
结束 如果
' 检查文本中是否包含敏感词
变量 评论内容 = "这个产品非常好用"
如果(取包含文本(评论内容, "垃圾"))
	调试输出("评论包含敏感词")
否则
	调试输出("评论内容正常")
结束 如果

函数:取文本长度(内容 为 文本型)

获取文本字符数量,例如:一段文本由5个汉字组成,则返回5。

' 获取中英文混合文本的字符数
变量 文本 = "Hello世界"
调试输出("字符数: " + 取文本长度(文本))  ' 7
' 验证用户输入长度
变量 用户名 = "张三"
如果(取文本长度(用户名) < 2)
	弹出提示("用户名至少需要2个字符")
结束 如果
' 获取空文本的长度
调试输出(取文本长度(""))  ' 0
' 注:传入 空(轻语言空值关键字,等价于原生 JS 的 null)时返回 0
调试输出(取文本长度(空))  ' 0

函数:取文本字节长度(文本内容)

获取文本字节长度,默认使用UTF8编码计算,保证跨设备一致性。

' 计算中英文混合文本的字节长度(UTF-8编码下中文占3字节)
变量 英文 = "abc"
变量 中文 = "你好"
调试输出("英文字节: " + 取文本字节长度(英文))  ' 3
调试输出("中文字节: " + 取文本字节长度(中文))  ' 6
' 验证数据库字段长度限制
变量 用户输入 = "这是用户输入的内容"
如果(取文本字节长度(用户输入) > 255)
	弹出提示("输入内容超出255字节限制")
结束 如果

函数:翻转文本(文本内容 为 文本型)

将文本从右到左反转后返回。

' 反转字符串
变量 原文本 = "Hello World"
变量 反转后 = 翻转文本(原文本)
调试输出(反转后)  ' dlroW olleH
' 反转中文文本
变量 中文 = "你好世界"
调试输出(翻转文本(中文))  ' 界世好你
' 判断回文
变量 词 = "上海自来水来自海上"
如果(词 == 翻转文本(词))
	调试输出("是回文")
结束 如果

函数:寻找文本(欲被搜寻文本 为 文本型,欲寻找文本 为 文本型,开始位置 为 整数型)

从指定文本中寻找欲寻找的文本,可以设定起始位置,如果未找到返回-1;如果找到后返回从左至右以0为开始的索引位置。

' 查找关键词在文本中的位置
变量 文本 = "Hello World, Hello JavaScript"
变量 位置 = 寻找文本(文本, "Hello")
调试输出("首次出现位置: " + 位置)  ' 0
' 从指定位置开始查找
变量 位置2 = 寻找文本(文本, "Hello", 1)
调试输出("第二次出现位置: " + 位置2)  ' 13
' 查找不存在的内容
变量 位置3 = 寻找文本(文本, "Python")
调试输出("查找结果: " + 位置3)  ' -1

函数:倒找文本(欲被搜寻文本 为 文本型,欲寻找文本 为 文本型,开始位置 为 整数型)

在指定文本中从右到左寻找文本;返回找到的文本的位置;如果未找到返回-1、注意参数三开始位置是指从右向左的方向;例如:文本总长度为10、要从右向左找开始位置则为10或大于文本长度即可。

' 从右向左查找关键词最后出现的位置
变量 文本 = "apple banana apple orange"
变量 位置 = 倒找文本(文本, "apple")
调试输出("最后出现位置: " + 位置)  ' 13
' 查找文件扩展名(最后一个.的位置)
变量 文件名 = "archive.tar.gz"
变量 点位置 = 倒找文本(文件名, ".")
变量 扩展名 = 取文本右边(文件名, 取文本长度(文件名) - 点位置 - 1)
调试输出("扩展名: " + 扩展名)  ' gz

函数:到小写(文本内容 为 文本型)

将字符串的字母全部转成小写;返回转换后的字符串。

' 将大写字母转为小写
变量 文本 = "HELLO World"
调试输出(到小写(文本))  ' hello world
' 统一用户输入格式用于比较
变量 用户输入 = "YES"
如果(到小写(用户输入) == "yes")
	调试输出("用户确认了操作")
结束 如果
' 处理邮箱地址
变量 邮箱 = "User@Example.COM"
调试输出(到小写(邮箱))  ' user@example.com

函数:取相等(文本1 为 文本型,文本2 为 文本型)

获取并判断当前两个字符串或文本变量是否相等。

' 比较两个字符串是否相等
变量 密码1 = "123456"
变量 密码2 = "123456"
变量 密码3 = "654321"
调试输出(取相等(密码1, 密码2))  ' 真
调试输出(取相等(密码1, 密码3))  ' 假
' 验证码校验
变量 正确验证码 = "ABCD"
变量 用户输入 = "ABCD"
如果(取相等(正确验证码, 用户输入))
	弹出提示("验证码正确")
否则
	弹出提示("验证码错误")
结束 如果

函数:到大写(文本内容 为 文本型)

将字符串的字母全部转成大写;返回转换后的字符串。

' 将小写字母转为大写
变量 文本 = "hello world"
调试输出(到大写(文本))  ' HELLO WORLD
' 统一代码格式
变量 国家代码 = "cn"
调试输出(到大写(国家代码))  ' CN
' 生成订单编号
变量 订单前缀 = "ord"
变量 订单号 = 到大写(订单前缀) + "-" + 取随机字符串(8)
调试输出("订单号: " + 订单号)  ' ORD-a3f9x2k1

函数:取文本左边(文本内容 为 文本型,长度 为 整数型)

从字符串左边开始;取出指定长度的字符;返回取出的字符串。

' 取出文本前几个字符
变量 文本 = "Hello World"
调试输出(取文本左边(文本, 5))  ' Hello
' 截取姓名的姓氏(中文)
变量 姓名 = "张三丰"
调试输出("姓氏: " + 取文本左边(姓名, 1))  ' 张
' 截取日期前缀
变量 日期时间 = "2024-01-15 10:30:00"
变量 日期 = 取文本左边(日期时间, 10)
调试输出("日期: " + 日期)  ' 2024-01-15

函数:取文本右边(文本内容 为 文本型,长度 为 整数型)

从字符串右边开始;取出指定长度的字符;返回取出的字符串。

' 取出文本最后几个字符
变量 文本 = "Hello World"
调试输出(取文本右边(文本, 5))  ' World
' 获取文件扩展名
变量 文件名 = "photo.jpg"
变量 扩展名 = 取文本右边(文件名, 3)
调试输出("扩展名: " + 扩展名)  ' jpg
' 获取手机号后四位
变量 手机号 = "13812345678"
变量 后四位 = 取文本右边(手机号, 4)
调试输出("后四位: " + 后四位)  ' 5678

函数:取文本中间(待操作文本 为 文本型,开始位置 为 整数型,结束位置 为 整数型)

取出指定开始,结束位置的文本。

' 从指定位置截取文本片段
变量 文本 = "Hello World"
调试输出(取文本中间(文本, 0, 5))  ' Hello
调试输出(取文本中间(文本, 6, 11))  ' World
' 提取身份证中的出生日期
变量 身份证 = "110105199001011234"
变量 出生日期 = 取文本中间(身份证, 6, 14)
调试输出("出生日期: " + 出生日期)  ' 19900101
' 从URL中提取域名部分
变量 网址 = "https://www.example.com/path"
变量 开始 = 寻找文本(网址, "://") + 3
变量 结束 = 寻找文本(网址, "/", 开始)
调试输出("域名: " + 取文本中间(网址, 开始, 结束))  ' www.example.com

函数:取指定文本右边(文本内容 为 文本型,左边文本 为 文本型)

取出指定文本的右边;例如:取指定文本右边("123456","4");结果为56。

' 取出指定标记后的内容
变量 文本 = "姓名:张三"
调试输出(取指定文本右边(文本, ":"))  ' 张三
' 提取URL参数值
变量 网址 = "https://example.com?id=12345"
变量 参数值 = 取指定文本右边(网址, "id=")
调试输出("ID: " + 参数值)  ' 12345
' 提取文件路径中的文件名
变量 路径 = "/home/user/document.txt"
变量 文件名 = 取指定文本右边(路径, "/")
调试输出("文件名: " + 文件名)  ' document.txt

函数:取指定文本左边(文本内容 为 文本型,右边文本 为 文本型)

取出指定文本的左边;例如:取指定文本左边("123456","4");结果为123。

' 取出指定标记前的内容
变量 文本 = "张三:男"
调试输出(取指定文本左边(文本, ":"))  ' 张三
' 提取文件名(不含扩展名)
变量 文件名 = "photo.jpg"
变量 名称 = 取指定文本左边(文件名, ".")
调试输出("文件名: " + 名称)  ' photo
' 提取邮箱用户名部分
变量 邮箱 = "user@example.com"
变量 用户名 = 取指定文本左边(邮箱, "@")
调试输出("用户名: " + 用户名)  ' user

函数:取指定文本中间(内容 为 文本型,左侧文本 为 文本型,右侧文本 为 文本型)

取出字符串中指定的文本的中间字符串;例如:取指定文本中间("123456","4","6") 结果为5。

' 提取两个标记之间的内容
变量 HTML = "<title>我的网页</title>"
变量 标题 = 取指定文本中间(HTML, "<title>", "</title>")
调试输出("标题: " + 标题)  ' 我的网页
' 提取括号中的内容
变量 文本 = "函数(参数1,参数2)结束"
变量 参数 = 取指定文本中间(文本, "(", ")")
调试输出("参数: " + 参数)  ' 参数1,参数2
' 提取JSON字符串中的值
变量 JSON文本 = "{\"name\":\"张三\",\"age\":25}"
变量 姓名 = 取指定文本中间(JSON文本, "\"name\":\"", "\"")
调试输出("姓名: " + 姓名)  ' 张三

函数:取指定文本中间批量(文本内容 为 文本型,左边文本 为 文本型,右边文本 为 文本型)

取出字符串中;所有的指定文本的中间文本;并返回数组,例如:见文本操作例程。

' 批量提取HTML标签中的内容
变量 HTML = "<li>苹果</li><li>香蕉</li><li>橙子</li>"
变量 水果列表 = 取指定文本中间批量(HTML, "<li>", "</li>")
调试输出("水果数量: " + 取数组成员数(水果列表))  ' 3
调试输出("第一个: " + 水果列表[0])  ' 苹果
' 批量提取所有链接地址
变量 内容 = "链接:<a href=\"url1\">链接1</a> 和 <a href=\"url2\">链接2</a>"
变量 链接列表 = 取指定文本中间批量(内容, "href=\"", "\"")
变量循环(i = 0, 取数组成员数(链接列表), 1)
	调试输出("链接: " + 链接列表[i])
结束循环

函数:删首尾空(文本内容 为 文本型)

删除字符串的首尾空白字符(包括空格、制表符、换行、回车以及其它 Unicode 空白字符),返回删除后的文本。

' 清理用户输入的首尾空格
变量 用户输入 = "  Hello World  "
调试输出(删首尾空(用户输入))  ' Hello World
' 清理含换行符的文本
变量 多行文本 = "\n  内容  \r\n"
调试输出(删首尾空(多行文本))  ' 内容
' 表单数据清洗
变量 用户名 = "  zhangsan  "
如果(删首尾空(用户名) == "")
	弹出提示("用户名不能为空")
结束 如果

函数:删首空(文本内容 为 文本型)

删除字符串开始位置的空格。

' 仅删除开头的空格,保留结尾空格
变量 文本 = "  Hello World  "
变量 结果 = 删首空(文本)
调试输出("[" + 结果 + "]")  ' [Hello World  ]
' 处理缩进文本
变量 代码 = "    function test() {"
调试输出(删首空(代码))  ' function test() {

函数:删尾空(文本内容 为 文本型)

删除字符串结尾的空格。

' 仅删除结尾的空格,保留开头空格
变量 文本 = "  Hello World  "
变量 结果 = 删尾空(文本)
调试输出("[" + 结果 + "]")  ' [  Hello World]
' 清理文件路径末尾的空格
变量 路径 = "/home/user/   "
调试输出(删尾空(路径))  ' /home/user/

函数:子文本替换(待操作文本 为 文本型,欲替换文本 为 文本型,用作替换的文本 为 文本型)

将文本中指定字符串替换成另一个字符串;返回替换后的字符串;注意:该替换只会替换寻找到的第一个字符串;如果需要替换全部可使用“子文本替换全部”。

' 替换第一个匹配的文本
变量 文本 = "今天是星期一,明天也是星期一"
变量 结果 = 子文本替换(文本, "星期一", "星期二")
调试输出(结果)  ' 今天是星期二,明天也是星期一
' 替换敏感词
变量 评论 = "这个垃圾产品太垃圾了"
变量 过滤后 = 子文本替换(评论, "垃圾", "***")
调试输出(过滤后)  ' 这个***产品太垃圾了
' 替换占位符
变量 模板 = "欢迎您,{name}!"
变量 内容 = 子文本替换(模板, "{name}", "张三")
调试输出(内容)  ' 欢迎您,张三!

函数:子文本替换全部(待操作文本 为 文本型,欲替换文本 为 文本型,用作替换的文本 为 文本型)

文本中指定字符串全部替换成另一个字符串;返回替换后的字符串。

' 替换所有匹配的文本
变量 文本 = "今天是星期一,明天也是星期一"
变量 结果 = 子文本替换全部(文本, "星期一", "星期二")
调试输出(结果)  ' 今天是星期二,明天也是星期二
' 全局过滤敏感词
变量 评论 = "这个垃圾产品太垃圾了"
变量 过滤后 = 子文本替换全部(评论, "垃圾", "***")
调试输出(过滤后)  ' 这个***产品太***了
' 替换所有空格为下划线
变量 文件名 = "my document file.txt"
变量 新文件名 = 子文本替换全部(文件名, " ", "_")
调试输出(新文件名)  ' my_document_file.txt

函数:分割文本(待操作文本 为 文本型,分割符 为 文本型,启用正则模式 为 逻辑型)

按指定分隔符分割文本字符串;返回分割后的文本数组,参数三:启用正则模式 可省略,如果设置为真,则分割符将以正则形式作为分隔符,此时:“.”,“|”等符号将以正则方式参与文本的分割。

' 按逗号分割文本
变量 文本 = "苹果,香蕉,橙子,葡萄"
变量 水果数组 = 分割文本(文本, ",")
调试输出("数量: " + 取数组成员数(水果数组))  ' 4
调试输出("第一个: " + 水果数组[0])  ' 苹果
' 使用正则模式分割(按任意空白字符分割)
变量 句子 = "Hello   World   JavaScript"
变量 单词 = 分割文本(句子, "\\s+", 真)
调试输出("单词数: " + 取数组成员数(单词))  ' 3
' 分割CSV数据
变量 CSV行 = "张三,25,男,北京"
变量 字段 = 分割文本(CSV行, ",")
调试输出("姓名: " + 字段[0] + ",年龄: " + 字段[1])

函数:格式化文本(模板内容 为 文本型,值 为 文本型)

将指定字符串与值通过占位符格式化显示、例如:格式化文本("今天星期{0}、一起去看花!",1)、执行该函数后、将会返回:今天星期1、一起去看花!注意:如果字符串中含有单引号、单引号必须写为两个、另一个单引号作为转义功能;例如在处理数据库命令时:"name=‘’{0}‘’,age=23" ;原本的单引号需使用两个。

' 使用占位符格式化文本
变量 结果1 = 格式化文本("今天星期{0}、一起去看花!", 1)
调试输出(结果1)  ' 今天星期1、一起去看花!
' 格式化欢迎信息
变量 用户名 = "张三"
变量 结果2 = 格式化文本("欢迎您,{0}!您是第{1}位访客。", 用户名, 100)
调试输出(结果2)  ' 欢迎您,张三!您是第100位访客。
' 格式化日期信息
变量 年 = 2024
变量 月 = 1
变量 日 = 15
变量 日期 = 格式化文本("{0}年{1}月{2}日", 年, 月, 日)
调试输出(日期)  ' 2024年1月15日

函数:取字符(文本内容 为 文本型,位置 为 整数型)

获取指定文本内容中指定位置处的单个字符,位置从0开始。

' 获取指定位置的单个字符
变量 文本 = "Hello"
调试输出(取字符(文本, 0))  ' H
调试输出(取字符(文本, 1))  ' e
调试输出(取字符(文本, 4))  ' o
' 遍历字符串中的每个字符
变量 中文 = "你好世界"
变量循环(i = 0, 取文本长度(中文), 1)
	调试输出("第" + (i+1) + "个字符: " + 取字符(中文, i))
结束循环
' 获取身份证最后一位(校验码)
变量 身份证 = "110105199001011234"
变量 校验码 = 取字符(身份证, 取文本长度(身份证) - 1)
调试输出("校验码: " + 校验码)  ' 4

函数:删全部空(待操作文本)

删除字符串中所有的空格。代码示例:变量 结果文本 = 删全部空(待操作文本)

' 格式化手机号码
变量 格式化号码 = "138 1234 5678"
变量 纯号码 = 删全部空(格式化号码)
调试输出("纯号码: " + 纯号码)  ' 13812345678
' 处理身份证号码输入
变量 身份证输入 = "110 101 1990 0101 1234"
变量 纯身份证 = 删全部空(身份证输入)
如果(取文本长度(纯身份证) == 18)
	调试输出("身份证号码格式正确: " + 纯身份证)
结束 如果

函数:取文本行数(待操作文本)

计算字符串中有多少行。代码示例:变量 行数 = 取文本行数(待操作文本)

' 计算多行文本的行数
变量 多行文本 = "第一行\n第二行\n第三行\n第四行"
变量 行数 = 取文本行数(多行文本)
调试输出("文本共有 " + 行数 + " 行")  ' 4
' 处理用户评论
变量 用户评论 = "这是一条评论\n这是第二行\n这是第三行"
变量 评论行数 = 取文本行数(用户评论)
如果(评论行数 > 10)
	调试输出("评论过长,请精简到10行以内")
否则
	调试输出("评论符合要求,共 " + 评论行数 + " 行")
结束 如果

函数:到全角(待操作文本)

将指定字符串内容从半角转成全角,返回转换后的全角内容。

' 将半角字母数字转为全角
变量 半角文本 = "ABC123"
变量 全角文本 = 到全角(半角文本)
调试输出(全角文本)  ' ABC123
' 将半角标点转为全角
变量 标点 = "Hello, World!"
调试输出(到全角(标点))  ' Hello, World!
' 用于中文排版对齐
变量 数据 = "价格:100元"
调试输出(到全角(数据))  ' 价格:100元

函数:到半角(待操作文本)

将指定字符串内容从全角转成半角,返回转换后的半角内容。

' 将全角字母数字转为半角
变量 全角文本 = "ABC123"
变量 半角文本 = 到半角(全角文本)
调试输出(半角文本)  ' ABC123
' 将全角标点转为半角
变量 标点 = "Hello,World!"
调试输出(到半角(标点))  ' Hello,World!
' 清理用户输入的全角字符
变量 用户输入 = "13812345678"
变量 标准手机号 = 到半角(用户输入)
调试输出("手机号: " + 标准手机号)  ' 13812345678

学习要点

知识点代码示例说明
空值判断为空(文本)空字符串、纯空格、(null)均返回真;用于表单非空校验
空值关键字变量 空对象 = 空轻语言空值关键字为 ,等价于原生 JS 的 null
字符数 vs 字节数取文本长度("你好") →2 / 取文本字节长度("你好") →6字符数按字符计算,字节数按 UTF-8 编码(中文3字节);数据库长度限制按字节
查找方向寻找文本 / 倒找文本正序从头找、逆序从尾找,均返回索引,未找到返回 -1
包含判断取包含文本(文本, "@")返回 真/假;不返回位置,只判断是否包含
位置截取 vs 标记截取取文本左边(文本, 5) / 取指定文本左边(文本, ":")前者按长度位置截取,后者按标记文本定位截取;标记版适合提取键值对
替换范围子文本替换 / 子文本替换全部前者只替换首个匹配,后者替换全部;注意区别避免漏替换
占位符格式化格式化文本("欢迎{0}!", 用户名){0}{1} 作占位符,按参数顺序替换;单引号需写两个转义
空白处理删首尾空 / 删全部空前者只去首尾空白,后者删除所有空格;表单输入清洗通常用 删首尾空
大小写转换到小写(文本) / 到大写(文本)大小写不敏感比较时统一转为小写再比较
全半角转换到全角 / 到半角全角用于中文排版对齐,半角用于数据存储、标准输入;手机号、身份证需转半角

相关文档

  • 文档前端(JavaScript)函数_正则表达类 —— 正则匹配正则替换 等高级文本处理函数
  • 文档前端(JavaScript)函数_数据转换类 —— 到文本到大写URL编码 等转换函数
  • 文档前端(JavaScript)函数_数组操作 —— 分割文本 返回数组的遍历处理
  • 文档前端(JavaScript)函数_储存类 —— 配合 取文本长度 做数据校验后存储
  • 文档轻语言网站:变量与数组与对象的定义 —— 变量声明与基础语法

前端(JavaScript)函数_URL地址操作类

文档概述

轻语言网站开发中的URL地址操作函数、用于处理浏览器地址栏的URL信息,包含获取URL参数、设置URL、解析地址信息、处理查询字符串等功能,常用于页面路由、参数传递、URL解析等场景。

  • URL结构分解协议://主机名:端口/路径名?查询部分#锚部分,可分别用 取URL协议/取URL主机名/取URL端口/取URL路径名/取URL查询部分/取URL地址锚 获取
  • 页面控制重载页面 用于刷新当前页面,常用于数据更新后强制刷新

💡 URL 解析对照:以 https://www.example.com:8080/news/list?id=10&cat=tech#article 为例,取URL协议→"https:"、取URL主机名→"www.example.com"、取URL端口→"8080"、取URL路径名→"/news/list"、取URL查询部分→"?id=10&cat=tech"、取URL地址锚→"#article"。

函数:取URL地址锚()

获取当前 URL 的锚部分(从 # 号开始的部分)。

' 获取页面锚点(常用于单页应用路由)
变量 锚 = 取URL地址锚()
调试输出("锚部分: " + 锚)  ' 如:#article

' 根据锚点加载对应内容
变量 锚点 = 取URL地址锚()
如果(锚点 == "#用户列表")
	加载用户列表()
否则 如果(锚点 == "#商品列表")
	加载商品列表()
结束 如果

函数:取URL主机名及端口()

获取当前 URL 的主机名和端口。

变量 主机及端口 = 取URL主机名及端口()
调试输出("主机及端口: " + 主机及端口)  ' 如:www.example.com:8080

' 区分开发环境与生产环境
变量 当前主机 = 取URL主机名及端口()
如果(当前主机 == "localhost:8080")
	调试输出("当前为开发环境")
否则
	调试输出("当前为生产环境")
结束 如果

函数:取URL主机名()

获取当前 URL 的主机名。

变量 主机名 = 取URL主机名()
调试输出("主机名: " + 主机名)  ' 如:www.example.com

' 根据域名切换配置
变量 域名 = 取URL主机名()
如果(域名 == "api.test.com")
	调试输出("使用测试API")
否则 如果(域名 == "api.prod.com")
	调试输出("使用生产API")
结束 如果

函数:取URL完整地址()

获取当前完整的 URL。

变量 完整地址 = 取URL完整地址()
调试输出("完整URL: " + 完整地址)

' 分享当前页面地址
变量 当前页面 = 取URL完整地址()
复制文本(当前页面)
弹出提示("页面地址已复制,可分享给好友")

函数:取URL路径名()

获取当前 URL 的路径名。

变量 路径名 = 取URL路径名()
调试输出("路径名: " + 路径名)  ' 如:/news/list

' 根据路径高亮导航菜单
变量 路径 = 取URL路径名()
如果(寻找文本(路径, "news") != -1)
	新闻菜单.添加样式("active")
结束 如果

函数:取URL端口()

获取当前 URL 服务器使用的端口号。

变量 端口 = 取URL端口()
调试输出("端口: " + 端口)  ' 如:8080

' 根据端口判断环境
变量 当前端口 = 取URL端口()
如果(当前端口 == "443" 或 当前端口 == "")
	调试输出("使用HTTPS默认端口")
结束 如果

函数:取URL协议()

获取当前 URL 的协议。

变量 协议 = 取URL协议()
调试输出("协议: " + 协议)  ' 如:https:

' 强制HTTPS跳转
变量 当前协议 = 取URL协议()
如果(当前协议 == "http:")
	切换页面("https://" + 取URL主机名() + 取URL路径名())
结束 如果

函数:取URL查询部分()

获取当前 URL 的查询部分(从 ? 号开始的部分)。

变量 查询部分 = 取URL查询部分()
调试输出("查询部分: " + 查询部分)  ' 如:?id=10&cat=tech

' 提取查询参数值需配合 字符串操作 函数
变量 查询 = 取URL查询部分()
变量 起始 = 寻找文本(查询, "id=") + 3
变量 结束 = 寻找文本(查询, "&", 起始)
调试输出("id值: " + 取文本中间(查询, 起始, 结束))

函数:重载页面()

重新加载当前页面。

' 重新加载当前页面
重载页面()

' 点击刷新按钮时重新加载
刷新按钮.置被单击回调(() => {
	重载页面()
})

' 数据更新后提示并刷新
保存按钮.置被单击回调(() => {
	弹出提示("保存成功,正在刷新")
	重载页面()
})

学习要点

知识点代码示例说明
完整地址获取取URL完整地址()获取完整 URL,用于分享、复制
路径名判断取URL路径名()获取路径部分,用于导航高亮、页面判断
查询字符串取URL查询部分()返回 ? 后内容,需配合 寻找文本/取文本中间 提取参数
锚点路由取URL地址锚()返回 # 后内容,单页应用常用锚点做前端路由
协议判断取URL协议()返回如 "https:",用于强制 HTTPS 跳转
主机名区分取URL主机名()根据域名切换开发/生产环境配置
页面刷新重载页面()重新加载当前页面,清空临时数据,常用于数据更新后
URL解析组合协议+主机名+路径+查询+锚完整URL由各部分组成,可分别获取再拼接

相关文档

  • 文档前端(JavaScript)函数_字符串操作 —— 寻找文本取文本中间 等用于解析URL查询字符串
  • 文档前端(JavaScript)函数_历史类 —— 前进页面后退页面 浏览历史控制
  • 文档前端(JavaScript)函数_浏览器操作类 —— 切换页面弹出提示 浏览器操作函数
  • 文档前端(JavaScript)函数_数据转换类 —— URL编码URL解码 网址编码函数
  • 文档前端(JavaScript)函数_储存类 —— 保存配置 存储当前URL参数

前端(JavaScript)函数_对象操作

文档概述

轻语言网站开发中的对象操作函数、基于 JavaScript 对象操作 Object 类封装,包含对象属性获取、对象成员操作、对象比较、对象转换等功能,常用于数据处理、对象管理、JSON操作等场景。

  • 对象遍历取对象成员数 + 取对象成员名 组合可遍历对象的所有属性,类似 Object.keys().length
  • 成员检测取对象是否包含 等价于 Object.prototype.hasOwnProperty(),判断对象自身是否含有指定属性
  • 对象序列化:配合 JSON编码 / JSON解析 可实现对象的字符串化与还原,用于存储、传输

💡 对象与数组区别:对象使用 {} 定义、以"键值对"形式存储数据,通过 对象.属性对象["属性"] 访问;数组使用 [] 定义、以"索引"形式存储数据,通过 取数组成员(数组, 索引) 访问。

函数:取对象成员数(目标对象)

获取指定对象中的成员数量。代码示例:变量 成员数 = 取对象成员数(目标对象)

' 获取用户对象的属性数量
变量 用户 = {
	"姓名": "张三",
	"年龄": 25,
	"职业": "工程师"
}
变量 成员数 = 取对象成员数(用户)
调试输出("用户对象有 " + 成员数 + " 个属性")

' 检查配置对象是否包含预期数量的属性
变量 配置 = {
	"主题": "dark",
	"语言": "zh-CN",
	"通知": 真
}
如果(取对象成员数(配置) < 3)
	调试输出("配置不完整")
结束 如果

函数:取对象成员名(目标对象,索引)

获取指定对象中指定索引位置处的成员属性名。代码示例:变量 属性名 = 取对象成员名(目标对象, 0)

' 遍历对象的所有属性名
变量 商品 = {
	"名称": "手机",
	"价格": 2999,
	"品牌": "XX品牌"
}
变量 属性总数 = 取对象成员数(商品)
变量循环(i = 0, 属性总数, 1)
	变量 属性名 = 取对象成员名(商品, i)
	调试输出("第 " + (i+1) + " 个属性名: " + 属性名)
结束循环

' 获取第一个属性名
变量 第一个属性 = 取对象成员名(商品, 0)
调试输出("第一个属性: " + 第一个属性)  ' 名称

函数:取对象是否包含(目标对象,成员名)

获取指定对象中是否包含指定成员;包含返回真、否则返回假。代码示例:变量 是否包含 = 取对象是否包含(目标对象, "属性名")

' 检查用户对象是否包含特定属性
变量 用户信息 = {
	"用户名": "user123",
	"邮箱": "user@example.com",
	"注册时间": "2023-01-01"
}
如果(取对象是否包含(用户信息, "手机号"))
	调试输出("用户已绑定手机号")
否则
	调试输出("用户未绑定手机号")
结束 如果

' 检查必需字段是否存在
变量 必需字段 = ["用户名", "邮箱", "密码"]
变量循环(i = 0, 取数组成员数(必需字段), 1)
	变量 字段 = 取数组成员(必需字段, i)
	如果(!取对象是否包含(用户信息, 字段))
		调试输出("缺少必需字段: " + 字段)
	结束 如果
结束循环

函数:取对象是否为空(目标对象)

判断指定对象是否为空。代码示例:变量 是否为空 = 取对象是否为空(目标对象)

' 检查响应数据是否为空
变量 响应数据 = { }
如果(取对象是否为空(响应数据))
	调试输出("未获取到有效数据")
否则
	调试输出("数据获取成功")
结束 如果

' 检查用户输入数据
变量 用户输入 = {
	"姓名": "",
	"电话": ""
}
如果(取对象是否为空(用户输入))
	调试输出("用户未输入任何信息")
否则
	调试输出("用户已输入信息")
结束 如果

函数:删除对象属性(目标对象,属性名称)

删除指定对象中的指定属性。代码示例:删除对象属性(目标对象, "属性名")

' 从用户信息中删除敏感信息
变量 用户信息 = {
	"用户名": "user123",
	"密码": "secret123",
	"邮箱": "user@example.com",
	"余额": 1000
}
' 删除密码等敏感信息
删除对象属性(用户信息, "密码")
删除对象属性(用户信息, "余额")
调试输出("安全的用户信息: " + JSON编码(用户信息))

' 动态删除对象属性
变量 配置 = {
	"开发模式": 真,
	"调试信息": "详细",
	"生产环境": 假
}
如果(!配置.生产环境)
	删除对象属性(配置, "调试信息")
结束 如果

学习要点

知识点代码示例说明
成员数统计取对象成员数(用户)获取对象属性总数,等价于 Object.keys(obj).length
成员名遍历取对象成员名(商品, i)按索引取属性名,配合 变量循环 可遍历对象所有属性
属性存在判断取对象是否包含(用户, "手机号")等价于 hasOwnProperty,只判断对象自身属性,不查原型链
空对象判断取对象是否为空({})判断对象是否为空对象 {},与 判断不同( 是 null/未定义)
动态删除属性删除对象属性(用户, "密码")删除对象指定属性,等价于 delete obj.key
对象序列化JSON编码(用户信息)将对象转为 JSON 字符串,用于存储或网络传输
对象属性访问用户.姓名 / 用户["姓名"]原生 JS 对象属性访问语法,轻语言支持直接使用
数组遍历配合取数组成员(必需字段, i)遍历数组元素时用 取数组成员,不能用 数组[i](轻语言数组语法)

相关文档

  • 文档前端(JavaScript)函数_数据转换类 —— JSON编码JSON解析 对象序列化函数
  • 文档前端(JavaScript)函数_数组操作 —— 取数组成员取数组成员数 数组操作函数
  • 文档前端(JavaScript)函数_字符串操作 —— 取文本长度寻找文本 等文本处理函数
  • 文档轻语言网站:变量与数组与对象的定义 —— 变量、对象、数组的基本语法
  • 文档综合演示:公用模块全局变量函数使用演示 —— 全局对象与公用模块实战

前端(JavaScript)函数_屏幕操作类

文档概述

轻语言网站开发中的屏幕操作函数、用于获取和操作屏幕显示信息,包含屏幕分辨率、屏幕尺寸、滚动位置、视口尺寸等屏幕相关功能,常用于响应式设计、全屏操作、屏幕适配等场景。

  • 屏幕尺寸取屏幕宽度/取屏幕高度 返回屏幕总尺寸;取屏幕可用宽度/取屏幕可用高度 返回去除任务栏后的可用尺寸
  • 色彩信息取屏幕颜色深度/取屏幕像素深度 返回色彩位数(通常为24位或32位)

💡 屏幕尺寸 vs 窗口尺寸取屏幕宽度/取屏幕高度 返回物理屏幕总尺寸(含任务栏);取屏幕可用宽度/取屏幕可用高度 返回去除系统任务栏后的可用区域。两者常用于响应式布局判断与全屏适配。

函数:取屏幕可用高度()

返回屏幕的高度(不包括Windows任务栏)。

变量 可用高度 = 取屏幕可用高度()
调试输出("可用高度: " + 可用高度 + "px")

' 根据可用高度设置弹窗最大高度
变量 最大高度 = 取屏幕可用高度() - 100
弹窗.高度 = 最大高度

函数:取屏幕可用宽度()

返回屏幕的宽度(不包括Windows任务栏)。

变量 可用宽度 = 取屏幕可用宽度()
调试输出("可用宽度: " + 可用宽度 + "px")

' 居中显示窗口
变量 窗口宽度 = 800
变量 窗口左边距 = (取屏幕可用宽度() - 窗口宽度) / 2
主窗口.左边距 = 窗口左边距

函数:取屏幕高度()

返回屏幕的总高度。

变量 屏幕高度 = 取屏幕高度()
调试输出("屏幕高度: " + 屏幕高度 + "px")

' 判断屏幕方向(横屏/竖屏)
如果(取屏幕宽度() > 取屏幕高度())
	调试输出("横屏模式")
否则
	调试输出("竖屏模式")
结束 如果

函数:取屏幕宽度()

返回屏幕的总宽度。

变量 屏幕宽度 = 取屏幕宽度()
调试输出("屏幕宽度: " + 屏幕宽度 + "px")

' 响应式布局判断
变量 宽度 = 取屏幕宽度()
如果(宽度 >= 1920)
	调试输出("大屏设备")
否则 如果(宽度 >= 1366)
	调试输出("中屏设备")
否则
	调试输出("小屏设备")
结束 如果

函数:取屏幕颜色深度()

返回目标设备或缓冲器上的调色板的比特深度。

变量 颜色深度 = 取屏幕颜色深度()
调试输出("颜色深度: " + 颜色深度 + "位")

' 检测低色位设备
如果(颜色深度 < 24)
	调试输出("低色位设备,建议使用简化色彩")
结束 如果

函数:取屏幕像素深度()

返回屏幕的颜色分辨率(每象素的位数)。

变量 像素深度 = 取屏幕像素深度()
调试输出("像素深度: " + 像素深度 + "位")

' 高色位设备可使用更丰富的色彩
如果(像素深度 >= 32)
	调试输出("支持高色彩显示")
结束 如果

学习要点

知识点代码示例说明
屏幕总尺寸取屏幕宽度() / 取屏幕高度()返回物理屏幕总尺寸(含任务栏),用于响应式判断
可用尺寸取屏幕可用宽度() / 取屏幕可用高度()去除系统任务栏后的可用区域,用于精确居中、弹窗定位
屏幕方向判断如果(取屏幕宽度() > 取屏幕高度())宽>高为横屏,反之为竖屏;移动端常用
响应式断点如果(宽度 >= 1920)根据屏幕宽度划分大/中/小屏,切换布局
色彩深度取屏幕颜色深度() / 取屏幕像素深度()通常为24或32位,低色位设备需简化色彩
居中计算左边距 = (取屏幕可用宽度() - 窗口宽度) / 2窗口居中的标准计算方式

相关文档

  • 文档前端(JavaScript)函数_窗口操作 —— 打开窗口关闭窗口、窗口尺寸控制
  • 文档前端(JavaScript)函数_浏览器操作类 —— 切换页面弹出提示 浏览器操作
  • 文档前端(JavaScript)函数_URL地址操作类 —— 重载页面 等URL操作
  • 文档前端(JavaScript)函数_文档操作 —— 查找元素ByID 等DOM操作
  • 文档前端(JavaScript)函数_储存类 —— 保存配置 存储用户屏幕偏好设置

前端(JavaScript)函数_数学运算

文档概述

轻语言网站开发中的数学运算相关操作函数、用于执行数值计算和数学处理,包含四舍五入、取随机整数、取余数、数值转换等数学运算功能,常用于数值计算、随机数生成、数学公式计算等场景。

  • 基础运算取绝对值取次方取平方根取余数取最大值/取最小值 实现常用数学计算
  • 取整方式向上取整(ceil)、向下取整(floor)、四舍五入取整(round)、取整数部分(trunc)四种取整方式各有差异
  • 三角函数取正弦/取余弦/取正切 及其反函数 取反正弦/取反余弦/取反正切,角度与弧度互转用 弧度 * 180 / Math.PI
  • 对数指数取指数(e^x)、取自然对数(ln)、取对数By底为10(log10)、取对数By底为2(log2)
  • 随机数取随机小数(0~1)、取随机整数(最小值, 最大值)(指定区间整数)

💡 角度与弧度转换:轻语言三角函数使用弧度制。角度转弧度:角度 * Math.PI / 180;弧度转角度:弧度 * 180 / Math.PI。其中 Math.PI 为原生 JS 圆周率常量,轻语言支持直接使用。

函数:取绝对值(值)

返回参数值的绝对值。代码示例:变量 绝对值 = 取绝对值(值)

' 计算两点间距离时使用绝对值
变量 温度差 = 取绝对值(今日温度 - 昨日温度)
调试输出("温差: " + 温度差 + " 度")
' 处理负数输入
变量 用户输入 = -5
变量 正数 = 取绝对值(用户输入)
调试输出("绝对值: " + 正数)  ' 输出: 5

函数:取次方(X,Y)

计算 X 的 Y 次方。代码示例:变量 结果 = 取次方(X, Y)

' 计算面积和体积
变量 边长 = 5
变量 正方形面积 = 取次方(边长, 2)  ' 5^2 = 25
变量 立方体体积 = 取次方(边长, 3)  ' 5^3 = 125
调试输出("正方形面积: " + 正方形面积)
调试输出("立方体体积: " + 立方体体积)
' 计算平方根(相当于1/2次方)
变量 数值 = 16
变量 平方根 = 取次方(数值, 0.5)  ' 16^(1/2) = 4
调试输出("平方根: " + 平方根)

函数:取反正弦(值)

返回一个数的反正弦值,结果为 -π/2 到 π/2 弧度之间。代码示例:变量 角度 = 取反正弦(值)

' 计算三角形的角度
变量 对边 = 3
变量 斜边 = 5
变量 正弦值 = 对边 / 斜边  ' 0.6
变量 弧度 = 取反正弦(正弦值)
' 注:Math.PI 为原生 JS 常量(圆周率π),轻语言支持直接使用
变量 角度 = 弧度 * 180 / Math.PI
调试输出("角度: " + 角度 + " 度")  ' 约 36.87 度

函数:取反余弦(值)

返回一个数的反余弦值,结果为 0 到 π 弧度之间。代码示例:变量 角度 = 取反余弦(值)

' 计算三角形的角度
变量 邻边 = 4
变量 斜边 = 5
变量 余弦值 = 邻边 / 斜边  ' 0.8
变量 弧度 = 取反余弦(余弦值)
' 注:Math.PI 为原生 JS 常量(圆周率π),轻语言支持直接使用
变量 角度 = 弧度 * 180 / Math.PI
调试输出("角度: " + 角度 + " 度")  ' 约 53.13 度

函数:取反正切(值)

返回一个数的反正切值,结果为 -π/2 到 π/2 弧度之间。代码示例:变量 角度 = 取反正切(值)

' 计算直线的倾斜角
变量 对边 = 3
变量 邻边 = 4
变量 正切值 = 对边 / 邻边  ' 0.75
变量 弧度 = 取反正切(正切值)
' 注:Math.PI 为原生 JS 常量(圆周率π),轻语言支持直接使用
变量 角度 = 弧度 * 180 / Math.PI
调试输出("倾斜角: " + 角度 + " 度")  ' 约 36.87 度

函数:取角度反正切(Y, X)

返回从 x 轴到点 (x, y) 之间的角度的反正切值。代码示例:变量 角度 = 取角度反正切(Y, X)

' 计算点相对于原点的角度
变量 X坐标 = 1
变量 Y坐标 = 1
变量 弧度 = 取角度反正切(Y坐标, X坐标)
' 注:Math.PI 为原生 JS 常量(圆周率π),轻语言支持直接使用
变量 角度 = 弧度 * 180 / Math.PI
调试输出("角度: " + 角度 + " 度")  ' 45 度
' 处理各个象限的情况
变量 角度1 = 取角度反正切(1, -1) * 180 / Math.PI  ' 第二象限
变量 角度2 = 取角度反正切(-1, -1) * 180 / Math.PI  ' 第三象限
变量 角度3 = 取角度反正切(-1, 1) * 180 / Math.PI  ' 第四象限

函数:向上取整(值)

返回大于或等于给定数字的最小整数。代码示例:变量 整数 = 向上取整(值)

' 计算需要的包装箱数量
变量 商品总数 = 123
变量 每箱容量 = 10
变量 需要箱子数 = 向上取整(商品总数 / 每箱容量)
调试输出("需要箱子数: " + 需要箱子数)  ' 13 个箱子
' 处理价格计算
变量 价格 = 99.01
变量 整数价格 = 向上取整(价格)
调试输出("整数价格: " + 整数价格)  ' 100

函数:取余弦(值)

返回一个数的余弦值,值的范围在 -1 到 1 之间。代码示例:变量 余弦值 = 取余弦(值)

' 计算波形运动的位置
变量 时间 = 1
' 注:Math.PI 为原生 JS 常量(圆周率π),轻语言支持直接使用
变量 频率 = 2 * Math.PI  ' 每秒一个周期
变量 相位 = 0
变量 幅度 = 10
变量 位置 = 幅度 * 取余弦(频率 * 时间 + 相位)
调试输出("位置: " + 位置)
' 计算三角形的邻边长度
变量 斜边 = 5
变量 角度 = 30 * Math.PI / 180  ' 转换为弧度
变量 邻边 = 斜边 * 取余弦(角度)
调试输出("邻边长度: " + 邻边)

函数:取双曲余弦(值)

返回一个数的双曲余弦值。代码示例:变量 双曲余弦值 = 取双曲余弦(值)

' 计算悬链线形状
变量 x = 1
变量 悬链线值 = 取双曲余弦(x)
调试输出("悬链线值: " + 悬链线值)
' 数学计算中的应用
变量 参数 = 2
变量 结果 = 取双曲余弦(参数)
调试输出("cosh(" + 参数 + ") = " + 结果)

函数:取指数(值)

返回 E^x,其中 x 是参数,E 是自然对数的底数。代码示例:变量 指数值 = 取指数(值)

' 计算复利增长
变量 本金 = 1000
变量 利率 = 0.05
变量 时间 = 2
变量 最终金额 = 本金 * 取指数(利率 * 时间)
调试输出("最终金额: " + 最终金额)
' 自然增长模型
变量 初始值 = 100
变量 增长率 = 0.1
变量 时间 = 5
变量 结果 = 初始值 * 取指数(增长率 * 时间)
调试输出("增长结果: " + 结果)

函数:向下取整(值)

返回小于或等于给定数字的最大整数。代码示例:变量 整数 = 向下取整(值)

' 计算折扣后的价格
变量 原价 = 99.99
变量 折扣价 = 向下取整(原价)
调试输出("折扣价: " + 折扣价)  ' 99
' 分页计算
变量 总记录数 = 123
变量 每页记录数 = 10
变量 总页数 = 向下取整(总记录数 / 每页记录数)
调试输出("总页数: " + 总页数)  ' 12

函数:取最大值(值1, 值2, ...)

返回一组数值中的最大值。代码示例:变量 最大值 = 取最大值(值1, 值2, ...)

' 找出最高分数
变量 分数1 = 85
变量 分数2 = 92
变量 分数3 = 78
变量 最高分 = 取最大值(分数1, 分数2, 分数3)
调试输出("最高分: " + 最高分)  ' 92
' 确保数值不超过上限
变量 值 = 150
变量 上限 = 100
变量 结果 = 取最大值(值, 上限)
调试输出("限制后结果: " + 结果)  ' 100

函数:取最小值(值1, 值2, ...)

返回一组数值中的最小值。代码示例:变量 最小值 = 取最小值(值1, 值2, ...)

' 找出最低温度
变量 温度1 = 15
变量 温度2 = 12
变量 温度3 = 18
变量 最低温度 = 取最小值(温度1, 温度2, 温度3)
调试输出("最低温度: " + 最低温度)  ' 12
' 确保数值不低于下限
变量 值 = -5
变量 下限 = 0
变量 结果 = 取最小值(值, 下限)
调试输出("限制后结果: " + 结果)  ' 0

函数:四舍五入取整(值)

返回一个数字四舍五入后最接近的整数。代码示例:变量 整数 = 四舍五入取整(值)

' 计算平均分
变量 总分 = 87.6
变量 平均分 = 四舍五入取整(总分)
调试输出("平均分: " + 平均分)  ' 88
' 处理货币计算
变量 金额 = 123.456
变量 整数金额 = 四舍五入取整(金额)
调试输出("整数金额: " + 整数金额)  ' 123

函数:取正弦(值)

返回一个数的正弦值,值的范围在 -1 到 1 之间。代码示例:变量 正弦值 = 取正弦(值)

' 计算波形运动的位置
变量 时间 = 1
' 注:Math.PI 为原生 JS 常量(圆周率π),轻语言支持直接使用
变量 频率 = 2 * Math.PI  ' 每秒一个周期
变量 相位 = 0
变量 幅度 = 10
变量 位置 = 幅度 * 取正弦(频率 * 时间 + 相位)
调试输出("位置: " + 位置)
' 计算三角形的对边长度
变量 斜边 = 5
变量 角度 = 30 * Math.PI / 180  ' 转换为弧度
变量 对边 = 斜边 * 取正弦(角度)
调试输出("对边长度: " + 对边)

函数:取双曲正弦(值)

返回一个数的双曲正弦值。代码示例:变量 双曲正弦值 = 取双曲正弦(值)

' 数学计算中的应用
变量 参数 = 1
变量 结果 = 取双曲正弦(参数)
调试输出("sinh(" + 参数 + ") = " + 结果)
' 物理公式计算
变量 x = 2
变量 sinh_x = 取双曲正弦(x)
调试输出("sinh(" + x + ") = " + sinh_x)

函数:取平方根(值)

返回一个数的平方根。代码示例:变量 平方根 = 取平方根(值)

' 计算直角三角形的斜边
变量 直角边1 = 3
变量 直角边2 = 4
变量 斜边 = 取平方根(取次方(直角边1, 2) + 取次方(直角边2, 2))
调试输出("斜边长度: " + 斜边)  ' 5
' 计算标准差
变量 方差 = 16
变量 标准差 = 取平方根(方差)
调试输出("标准差: " + 标准差)  ' 4

函数:取正切(值)

返回一个数的正切值。代码示例:变量 正切值 = 取正切(值)

' 计算坡度
' 注:Math.PI 为原生 JS 常量(圆周率π),轻语言支持直接使用
变量 角度 = 30 * Math.PI / 180  ' 30度转换为弧度
变量 坡度 = 取正切(角度)
调试输出("坡度: " + 坡度)
' 计算直角三角形的对边与邻边比值
变量 对边 = 3
变量 邻边 = 4
变量 正切值 = 对边 / 邻边
调试输出("正切值: " + 正切值)  ' 0.75

函数:取双曲正切(值)

返回一个数的双曲正切值。代码示例:变量 双曲正切值 = 取双曲正切(值)

' 数学计算中的应用
变量 参数 = 1
变量 结果 = 取双曲正切(参数)
调试输出("tanh(" + 参数 + ") = " + 结果)
' 机器学习激活函数
变量 x = 0.5
变量 tanh_x = 取双曲正切(x)
调试输出("tanh(" + x + ") = " + tanh_x)

函数:取自然对数(值)

返回一个数的自然对数(以 e 为底)。代码示例:变量 对数值 = 取自然对数(值)

' 计算复利时间
变量 最终金额 = 2000
变量 本金 = 1000
变量 利率 = 0.05
变量 时间 = (取自然对数(最终金额 / 本金)) / 利率
调试输出("所需时间: " + 时间 + " 年")
' 数学计算
' 注:Math.E 为原生 JS 常量(自然常数 e),轻语言支持直接使用
变量 数值 = Math.E  ' 自然常数 e
变量 ln_e = 取自然对数(数值)
调试输出("ln(e) = " + ln_e)  ' 1

函数:取对数By底为10(值)

返回一个数以 10 为底的对数。代码示例:变量 对数值 = 取对数By底为10(值)

' 计算声音强度等级(分贝)
变量 实际强度 = 1000
变量 基准强度 = 1
变量 分贝 = 10 * 取对数By底为10(实际强度 / 基准强度)
调试输出("声音强度: " + 分贝 + " dB")
' 科学计算
变量 数值 = 1000
变量 log10值 = 取对数By底为10(数值)
调试输出("log10(" + 数值 + ") = " + log10值)  ' 3

函数:取对数By底为2(值)

返回一个数以 2 为底的对数。代码示例:变量 对数值 = 取对数By底为2(值)

' 计算二进制位数
变量 数值 = 256
变量 位数 = 取对数By底为2(数值) + 1
调试输出(数值 + " 需要 " + 位数 + " 位二进制表示")
' 算法复杂度计算
变量 元素数量 = 1024
变量 时间复杂度 = 取对数By底为2(元素数量)
调试输出("时间复杂度: O(" + 时间复杂度 + ")")

函数:取整数部分(值)

返回一个数的整数部分,去除小数部分。代码示例:变量 整数 = 取整数部分(值)

' 提取整数部分
变量 浮点数 = -3.7
变量 整数部分 = 取整数部分(浮点数)
调试输出("整数部分: " + 整数部分)  ' -3
' 与 floor 和 ceil 的区别
变量 正数 = 3.7
变量 负数 = -3.7
调试输出("trunc(" + 正数 + ") = " + 取整数部分(正数))  ' 3
调试输出("trunc(" + 负数 + ") = " + 取整数部分(负数))  ' -3

函数:取随机小数()

返回一个大于或等于 0 且小于 1 的随机小数。代码示例:变量 随机数 = 取随机小数()

' 生成0到1之间的随机数
变量 随机小数 = 取随机小数()
调试输出("随机小数: " + 随机小数)
' 生成指定范围的随机数
变量 最小值 = 10
变量 最大值 = 20
变量 范围随机数 = 最小值 + 取随机小数() * (最大值 - 最小值)
调试输出("范围随机数: " + 范围随机数)

函数:表达式计算(表达式)

将给定的表达式计算得出结果。代码示例:变量 结果 = 表达式计算(表达式)

' 计算数学表达式
变量 表达式 = "2 + 3 * 4"
变量 结果 = 表达式计算(表达式)
调试输出(表达式 + " = " + 结果)  ' 14
' 动态计算
' 注:表达式内 Math.pow/Math.sqrt 为原生 JS 函数,需用原生 JS 语法
变量 公式 = "Math.pow(2, 3) + Math.sqrt(16)"
变量 计算结果 = 表达式计算(公式)
调试输出(公式 + " = " + 计算结果)  ' 12

函数:取随机整数(最小值,最大值)

获取指定区间的随机整数。代码示例:变量 随机整数 = 取随机整数(最小值, 最大值)

' 生成指定范围的随机整数
变量 随机数 = 取随机整数(1, 100)
调试输出("1到100之间的随机数: " + 随机数)
' 模拟骰子投掷
变量 骰子点数 = 取随机整数(1, 6)
调试输出("骰子点数: " + 骰子点数)

函数:四舍五入(值,保留)

对浮点数进行四舍五入操作,保留指定位小数。代码示例:变量 结果 = 四舍五入(值, 保留)

' 保留两位小数
变量 价格 = 123.456
变量 保留两位 = 四舍五入(价格, 2)
调试输出("保留两位小数: " + 保留两位)  ' 123.46
' 保留一位小数
变量 数值 = 3.14159
变量 保留一位 = 四舍五入(数值, 1)
调试输出("保留一位小数: " + 保留一位)  ' 3.1

函数:取余数(被除数,除数)

计算两个数相除得到的余数。代码示例:变量 余数 = 取余数(被除数, 除数)

' 判断奇偶数
变量 数字 = 7
变量 余数 = 取余数(数字, 2)
如果(余数 == 0)
	调试输出(数字 + " 是偶数")
否则
	调试输出(数字 + " 是奇数")
结束 如果
' 循环索引计算
变量 数组长度 = 5
变量 当前索引 = 7
变量 实际索引 = 取余数(当前索引, 数组长度)
调试输出("实际索引: " + 实际索引)  ' 2

学习要点

知识点代码示例说明
取整差异向上取整(1.1)→2 / 向下取整(1.9)→1 / 四舍五入取整(1.5)→2 / 取整数部分(1.9)→1ceil进一、floor舍一、round四舍五入、trunc截断小数
角度↔弧度角度 * Math.PI / 180三角函数用弧度;角度转弧度用此公式,反向用 弧度 * 180 / Math.PI
Math.PI常量Math.PI原生 JS 圆周率常量(约3.14159),轻语言支持直接使用
随机数生成取随机整数(1, 100)生成1到100的随机整数;取随机小数() 生成0~1的随机小数
最大最小值取最大值(85, 92, 78)可传任意多个参数,返回最大/最小值;常用于范围限制
幂运算取次方(5, 2)5的2次方=25;取次方(16, 0.5) 等价于求平方根 4
余数判断取余数(数字, 2) == 0判断奇偶数常用;也用于循环索引越界回绕
对数计算取自然对数(值) / 取对数By底为10(值)自然对数ln、常用对数log10、二进对数log2
四舍五入精度四舍五入(3.14159, 2)第二参数指定保留小数位数;四舍五入取整 是无参数版(保留0位)
表达式计算表达式计算("1 + 2 * 3")动态计算字符串表达式结果,适合公式化配置场景

相关文档

  • 文档前端(JavaScript)函数_数据转换类 —— 到整数到小数为非数字 等类型转换函数
  • 文档前端(JavaScript)函数_字符串操作 —— 取文本长度寻找文本 等字符串处理函数
  • 文档前端(JavaScript)函数_数组操作 —— 数组遍历与随机元素访问
  • 文档前端(JavaScript)函数_时间类 —— 时间戳计算与日期数学运算
  • 文档轻语言网站:变量与数组与对象的定义 —— 变量声明与基础语法

前端(JavaScript)函数_数据操作类

文档概述

轻语言网站开发中的数据操作函数、用于处理数据读取和写入操作,包含JSON文件读取、XML文件读取、CSV文件读取、文本文件读取、文件下载等功能,常用于数据加载、文件处理、数据导入等场景。

  • 剪贴板操作复制文本(写入剪贴板) / 取剪贴板文本(读取剪贴板) 实现网页内复制粘贴功能
  • 文件读取(异步)读JSON文件 / 读XML文件 / 读CSV文件 / 读文本文件 均为异步操作,通过回调函数返回结果
  • XML解析解析XML文本 将 XML 字符串转为可操作的 DOM 对象,用 getElementsByTagName 取节点
  • 回调语法:使用箭头函数 (参数) => { ... } 作为回调,原生 JS 语法,轻语言支持直接使用

💡 异步读取注意:文件读取函数是异步执行的,数据只能在回调函数内部使用,不能在回调外访问。如需在外部使用,需用 保存配置 / 全局变量存储,或串联调用下一个操作。

函数:复制文本(待复制文本)

复制指定文本内容到系统剪贴板。代码示例:复制文本("需要复制的内容")

' 复制一段文本到剪贴板
复制文本("这是要复制的内容")
' 复制变量值到剪贴板
变量 用户名 = "张三"
变量 邮箱地址 = "example@example.com"
复制文本(用户名 + " 的邮箱是: " + 邮箱地址)

函数:取剪贴板文本(回调函数)

从系统剪贴板获取文本内容并通过回调函数返回,回调函数返回一个参数:(文本值)。代码示例:取剪贴板文本(回调函数)

' 获取剪贴板内容并在回调函数中处理
取剪贴板文本((文本值)=>{
	调试输出("剪贴板内容: " + 文本值)
})			
' 将剪贴板内容设置到编辑框中
取剪贴板文本((文本值)=>{
	编辑框1.文本 = 文本值
})

函数:解析XML文本(XML文本)

将XML格式的字符串解析为XML文档对象。

' 解析XML字符串
变量 XML字符串 = "<用户><姓名>张三</姓名><年龄>25</年龄></用户>"
变量 XML对象 = 解析XML文本(XML字符串)
' 获取XML中的值
' 注:getElementsByTagName("姓名")[0].textContent 为原生 JS DOM 操作语法,轻语言支持直接使用
变量 姓名 = XML对象.getElementsByTagName("姓名")[0].textContent
变量 年龄 = XML对象.getElementsByTagName("年龄")[0].textContent

函数:读JSON文件(文件路径, 回调函数, 是否解析为JSON对象)

异步读取JSON文件,通过回调函数返回结果,回调函数返回一个参数:(JSON对象或字符串),参数:是否解析为JSON对象、设置为真回调函数返回JSON对象、否则返回JSON字符串,该参数默认为假,可以省略。代码示例:读JSON文件("/data/config.json", 回调函数)

' 读取JSON文件并作为字符串处理
读JSON文件("/static/data/config.json", (数据)=>{
	调试输出("JSON内容: " + 数据)
})
' 读取JSON文件并解析为JSON对象
读JSON文件("/static/data/users.json", (数据)=>{
	' 数据已经是解析后的JSON对象,可直接操作对象中的属性
	调试输出("用户: " + 数据.用户)
	' 假设需要遍历JSON对象
	变量循环(i = 0, 取对象成员数(数据), 1)
		变量 成员名 = 取对象成员名(数据, i)
		调试输出("属性: " + 数据[成员名])
	结束循环
}, 真)

函数:读XML文件(文件路径, 回调函数)

异步读取XML文件,通过回调函数返回XML内容,回调函数返回一个参数:(XML字符串) 。代码示例:读XML文件("/data/config.xml", 回调函数)

' 读取XML文件
' 注:箭头函数 ()=>{} 为原生 JS 回调语法,轻语言支持直接使用
读XML文件("/static/data/config.xml", (XML内容)=>{
	调试输出("XML内容: " + XML内容)
	' 解析XML内容
	变量 XML文档 = 解析XML文本(XML内容)
	' 注:getElementsByTagName 为原生 JS DOM 方法,轻语言支持直接使用;可改用 取数组成员数(XML文档.getElementsByTagName("*"))
	变量 节点数 = 取数组成员数(XML文档.getElementsByTagName("*"))
	调试输出("XML节点数: " + 节点数)
})

函数:读CSV文件(文件路径, 回调函数)

异步读取CSV文件,通过回调函数返回解析后的二维数组。

' 读取并处理CSV文件
读CSV文件("/static/data/users.csv", (数据)=>{
	' 数据是一个二维数组,[行,列]
	调试输出("CSV数据:" + 数据)
	' 遍历数据并输出
	变量循环(i = 0, 取数组成员数(数据), 1)
		变量 行 = 数据[i]
		调试输出("第" + (i+1) + "行数据:")
		变量 列数据 = ""
		变量循环(j = 0, 取数组成员数(行), 1)
			列数据 = 列数据 + 行[j] + ","
		结束循环
		调试输出(列数据)
	结束循环
})

函数:读文本文件(文件路径, 回调函数)

异步读取文本文件,通过回调函数返回文件内容,回调函数返回一个参数:(文本内容) 。

' 读取文本文件内容
读文本文件("/static/docs/readme.txt", (内容)=>{
	调试输出("文件内容:")
	调试输出(内容)
})
' 将文本文件内容显示到指定标签中
读文本文件("/static/docs/license.txt", (内容)=>{
	标签1.文本 = 内容
})

学习要点

知识点代码示例说明
剪贴板写入复制文本("内容")同步操作,直接写入系统剪贴板
剪贴板读取取剪贴板文本((文本值)=>{ ... })异步操作,需通过回调函数获取内容;不能直接返回值
箭头函数回调(数据) => { ... }原生 JS 回调语法,轻语言支持直接使用;异步函数的标配
XML解析解析XML文本(XML字符串)返回 XML DOM 对象,用 getElementsByTagName 取节点
DOM节点访问XML对象.getElementsByTagName("姓名")[0].textContent原生 JS DOM 语法,轻语言支持直接使用;[0] 取首个,.textContent 取文本
异步读取JSON读JSON文件(路径, 回调, 真)第三参数 真=返回对象、假=返回字符串;默认假,可省略
异步读取CSV读CSV文件(路径, 回调)返回二维数组 [行][列],用 取数组成员(数据, i) 访问行
异步嵌套循环变量循环(i, 取数组成员数(数据), 1) 内嵌 变量循环(j, 取数组成员数(行), 1)遍历二维数组的标准写法,注意内外层循环变量不同
对象遍历取对象成员数(数据) + 取对象成员名(数据, i)遍历 JSON 对象的所有属性,用 对象[成员名] 取值

相关文档

  • 文档前端(JavaScript)函数_对象操作 —— 取对象成员数取对象成员名 对象遍历函数
  • 文档前端(JavaScript)函数_数组操作 —— 取数组成员取数组成员数 数组遍历函数
  • 文档前端(JavaScript)函数_数据转换类 —— JSON编码JSON解析 数据序列化函数
  • 文档前端(JavaScript)函数_储存类 —— 异步读取后用 保存配置 持久化存储数据
  • 文档前端(JavaScript)函数_网络操作类 —— 访问接口ByPOST 等网络请求函数

前端(JavaScript)函数_数据转换类

文档概述

轻语言网站开发中的数据转换函数、用于数据类型和格式转换,包含进制转换、金额大小写转换、数据类型转换、编码转换等功能,常用于数据格式化、类型转换、编码处理等场景。

  • 类型转换核心到整数到小数到数值到文本 实现字符串与数值之间的互转,是表单数据处理的基础
  • JSON序列化JSON编码(对象→字符串)与 JSON解析(字符串→对象)成对使用,用于存储、传输复杂数据
  • 进制与编码到十六进制 / 到十进制 用于颜色值、字节数据处理;URL编码 / URL解码 用于网址参数处理
  • 特殊场景到大写金额 用于财务票据;为非数字 用于输入验证;取数据类型 用于运行时类型判断

💡 类型转换注意:从 localStorage 读取的数字是字符串型,参与数学运算前需用 到整数/到小数 转换;JSON解析 要求字符串必须是标准 JSON 格式(键名必须用双引号),否则会抛出错误。

函数:到整数(值)

将指定值(一般为字符串)转换为整数。代码示例:变量 整数 = 到整数(值)

' 将字符串转换为整数
变量 字符串数字 = "123"
变量 整数 = 到整数(字符串数字)
调试输出("转换结果: " + 整数)  ' 123
' 处理带小数的数字字符串
变量 带小数 = "45.67"
变量 整数部分 = 到整数(带小数)
调试输出("整数部分: " + 整数部分)  ' 45
' 处理无效输入
变量 无效输入 = "abc123"
变量 结果 = 到整数(无效输入)
如果(为非数字(结果))
	调试输出("转换失败")
否则
	调试输出("转换结果: " + 结果)
结束 如果

函数:到小数(值)

将指定值(一般为字符串)转换为小数。代码示例:变量 小数 = 到小数(值)

' 将字符串转换为小数
变量 字符串小数 = "123.45"
变量 小数 = 到小数(字符串小数)
调试输出("转换结果: " + 小数)  ' 123.45
' 处理科学计数法
变量 科学计数 = "1.23e2"
变量 转换结果 = 到小数(科学计数)
调试输出("转换结果: " + 转换结果)  ' 123
' 处理混合字符串
变量 混合字符串 = "3.14abc"
变量 部分结果 = 到小数(混合字符串)
调试输出("部分转换: " + 部分结果)  ' 3.14

函数:JSON解析(JSON文本)

解析JSON文本字符串并将其转成JSON对象,注意:JSON文本格式必须为标准格式,非标准格式将会抛出错误。

' 解析用户信息JSON
变量 用户JSON = "{\"姓名\":\"张三\",\"年龄\":25,\"城市\":\"北京\"}"
变量 用户对象 = JSON解析(用户JSON)
' 注:对象.属性 为原生 JS 对象属性访问语法,轻语言支持直接使用
调试输出("用户姓名: " + 用户对象.姓名)
调试输出("用户年龄: " + 用户对象.年龄)
' 解析数组形式的JSON
变量 数组JSON = "[{\"id\":1,\"name\":\"项目1\"},{\"id\":2,\"name\":\"项目2\"}]"
变量 数组对象 = JSON解析(数组JSON)
' 注:数组对象[i].name 为原生 JS 数组与对象访问语法,轻语言支持直接使用
变量循环(i = 0, 取数组成员数(数组对象), 1)
	调试输出("项目" + (i+1) + ": " + 数组对象[i].name)
结束循环

函数:JSON编码(JSON对象)

将JSON对象编码为JSON字符串。

' 将对象转换为JSON字符串
变量 用户信息 = {
	"姓名": "李四",
	"年龄": 30,
	"职业": "程序员"
}
变量 JSON字符串 = JSON编码(用户信息)
调试输出("JSON字符串: " + JSON字符串)
' 转换数组对象
变量 商品列表 = [
	{"名称": "商品1", "价格": 100},
	{"名称": "商品2", "价格": 200}
]
变量 商品JSON = JSON编码(商品列表)
调试输出("商品JSON: " + 商品JSON)

函数:取数据类型(值)

获取数据或变量类型。代码示例:变量 类型 = 取数据类型(值)

' 检查不同数据类型的变量
变量 数字 = 123
变量 字符串 = "hello"
变量 布尔值 = 真
变量 数组 = [1, 2, 3]
变量 对象 = {"name": "test"}
' 注:轻语言的空值关键字为 空,等价于原生 JS 的 null
变量 空值 = 空
变量 未定义
调试输出("数字类型: " + 取数据类型(数字))      ' number
调试输出("字符串类型: " + 取数据类型(字符串))   ' string
调试输出("布尔值类型: " + 取数据类型(布尔值))   ' boolean
调试输出("数组类型: " + 取数据类型(数组))      ' object
调试输出("对象类型: " + 取数据类型(对象))      ' object
' 注:历史遗留问题,null 的 typeof 返回 "object"
调试输出("空值类型: " + 取数据类型(空值))      ' object
调试输出("未定义类型: " + 取数据类型(未定义))   ' undefined
' 区分数组和普通对象
' 注:instanceof Array 为原生 JS 运算符,轻语言支持直接使用
如果(取数据类型(数组) == "object" 且 数组 instanceof Array)
	调试输出("这是一个数组")
结束 如果

函数:为非数字(值)

判断给定值是否为非数字值。代码示例:变量 是否非数字 = 为非数字(值)

' 检查值是否为有效数字
变量 数字字符串 = "123"
变量 非数字字符串 = "abc"
变量 空字符串 = ""
' 注:轻语言的空值关键字为 空,等价于原生 JS 的 null
变量 空值 = 空
如果(!为非数字(到小数(数字字符串)))
	调试输出(数字字符串 + " 是有效数字")
结束 如果
如果(为非数字(到小数(非数字字符串)))
	调试输出(非数字字符串 + " 不是有效数字")
结束 如果
' 处理用户输入验证
变量 用户输入 = 输入框_年龄.文本
如果(为非数字(到整数(用户输入)) 或 到整数(用户输入) <= 0)
	弹出提示("请输入有效的年龄")
否则
	调试输出("有效年龄: " + 到整数(用户输入))
结束 如果

函数:URL编码(值)

把字符串编码为 URI。代码示例:变量 编码值 = URL编码(值)

' 编码包含特殊字符的URL
变量 原始URL = "https://example.com/search?q=hello world&category=技术类"
变量 编码URL = URL编码(原始URL)
调试输出("编码后URL: " + 编码URL)
' 编码中文参数
变量 查询词 = "云计算技术"
变量 编码查询 = URL编码(查询词)
变量 完整URL = "https://example.com/search?q=" + 编码查询
调试输出("完整URL: " + 完整URL)
' 编码URL组件
变量 参数值 = "hello@world.com"
变量 编码参数 = URL编码(参数值)
调试输出("编码参数: " + 编码参数)

函数:URL解码(值)

解码某个编码的 URI。代码示例:变量 解码值 = URL解码(值)

' 解码URL中的特殊字符
变量 编码URL = "https://example.com/search?q=%E4%B8%AD%E6%96%87"
变量 解码URL = URL解码(编码URL)
调试输出("解码后URL: " + 解码URL)
' 解码查询参数
变量 编码参数 = "%E4%BA%91%E8%AE%A1%E7%AE%97%E6%8A%80%E6%9C%AF"
变量 解码参数 = URL解码(编码参数)
调试输出("解码参数: " + 解码参数)  ' 云计算技术
' 处理从浏览器获取的URL参数
' 注:window.location.href 为原生 JS BOM 属性,轻语言支持直接使用
变量 当前URL = window.location.href
变量 解码URL = URL解码(当前URL)
调试输出("当前页面: " + 解码URL)

函数:到数值(值)

将字符串转换为数值型数据。代码示例:变量 数值 = 到数值(值)

' 将字符串转换为数值
变量 字符串数字 = "123.45"
变量 数值 = 到数值(字符串数字)
调试输出("数值: " + 数值)  ' 123.45
' 处理布尔值转换
变量 布尔真 = 真
变量 布尔假 = 假
变量 真值 = 到数值(布尔真)  ' 1
变量 假值 = 到数值(布尔假)  ' 0
调试输出("真值: " + 真值 + ", 假值: " + 假值)
' 处理日期转换
变量 日期 = 创建时间对象("2023-01-01")
变量 时间戳 = 到数值(日期)
调试输出("时间戳: " + 时间戳)

函数:到文本(值)

将变量或某个对象转换为字符串数据值。代码示例:变量 文本 = 到文本(值)

' 将数值转换为字符串
变量 数值 = 123
变量 文本 = 到文本(数值)
调试输出("文本: " + 文本)  ' "123"
' 将布尔值转换为字符串
变量 布尔值 = 真
变量 布尔文本 = 到文本(布尔值)
调试输出("布尔文本: " + 布尔文本)  ' "true"
' 将数组转换为字符串
变量 数组 = [1, 2, 3]
变量 数组文本 = 到文本(数组)
调试输出("数组文本: " + 数组文本)  ' "1,2,3"
' 将对象转换为字符串
变量 对象 = {"name": "张三", "age": 25}
变量 对象文本 = 到文本(对象)
调试输出("对象文本: " + 对象文本)

函数:到十六进制(值)

将变量转换为16进制。代码示例:变量 十六进制文本 = 到十六进制(值)

' 将十进制数转换为十六进制
变量 十进制数 = 255
变量 十六进制 = 到十六进制(十进制数)
调试输出("十六进制: " + 十六进制)  ' "ff"
' 转换RGB颜色值
变量 红 = 255
变量 绿 = 128
变量 蓝 = 64
变量 RGB十六进制 = "#" + 到十六进制(红) + 到十六进制(绿) + 到十六进制(蓝)
调试输出("RGB颜色: " + RGB十六进制)  ' "#ff8040"
' 格式化十六进制输出
变量 数值 = 10
变量 格式化十六进制 = "0x" + 到大写(到十六进制(数值))
调试输出("格式化十六进制: " + 格式化十六进制)  ' "0xA"

函数:到十进制(值)

将16进制字符串转换为十进制数值。代码示例:变量 十进制数 = 到十进制(值)

' 将十六进制字符串转换为十进制
变量 十六进制字符串 = "ff"
变量 十进制数 = 到十进制(十六进制字符串)
调试输出("十进制: " + 十进制数)  ' 255
' 处理带前缀的十六进制
变量 带前缀 = "0xFF"
' 注:slice(2) 为原生 JS 字符串方法,可改用 取文本右边(带前缀, 取文本长度(带前缀) - 2) 或 取文本中间
变量 结果 = 到十进制(取文本右边(带前缀, 取文本长度(带前缀) - 2))
调试输出("十进制结果: " + 结果)  ' 255
' 转换颜色值
变量 颜色值 = "A0"
变量 十进制颜色 = 到十进制(颜色值)
调试输出("颜色分量值: " + 十进制颜色)  ' 160

函数:到大写金额(值)

将数值转成中文大写金额。代码示例:变量 大写金额 = 到大写金额(值)

' 将数值转换为中文大写金额
变量 金额 = 1234.56
变量 大写金额 = 到大写金额(金额)
调试输出("大写金额: " + 大写金额)  ' 壹仟贰佰叁拾肆元伍角陆分
' 处理整数金额
变量 整数金额 = 1000
变量 整数大写 = 到大写金额(整数金额)
调试输出("整数大写: " + 整数大写)  ' 壹仟元整
' 处理小额金额
变量 小额 = 0.56
变量 小额大写 = 到大写金额(小额)
调试输出("小额大写: " + 小额大写)  ' 伍角陆分

学习要点

知识点代码示例说明
字符串转整数到整数("123")字符串转整数,自动截断小数部分;无效输入返回 NaN,可用 为非数字 判断
字符串转小数到小数("45.67")字符串转浮点数,支持科学计数法;混合字符串会提取开头数字部分
对象序列化JSON编码(用户信息)对象/数组转 JSON 字符串,用于存储、传输;键名自动加双引号
对象反序列化JSON解析(用户JSON)JSON 字符串转对象,要求标准格式;单引号键名会报错,需用双引号
空值关键字变量 空值 = 空轻语言的空值关键字为 ,等价于原生 JS 的 null
类型查询取数据类型(数组)返回类型字符串:"number"/"string"/"boolean"/"object"/"undefined"
数组与对象区分数组 instanceof Array取数据类型 对数组和对象都返回 "object",需用 instanceof Array 区分
进制转换到十六进制(255) / 到十进制("ff")十进制↔十六进制互转,常用于颜色值、字节数据处理
URL编码URL编码("中文")将特殊字符、中文编码为 URL 安全格式,避免传输乱码
数字验证为非数字(到整数(输入))表单验证常用,判断输入是否可转为有效数字
原生JS方法替代取文本右边(文本, 取文本长度(文本) - 2)替代 slice(2);轻语言推荐用 取文本右边/取文本中间 处理字符串

相关文档

  • 文档前端(JavaScript)函数_储存类 —— 保存配置 / 读取配置 配合 JSON编码/JSON解析 存储对象
  • 文档前端(JavaScript)函数_字符串操作 —— 取文本长度取文本右边到大写 等字符串函数
  • 文档前端(JavaScript)函数_URL地址操作类 —— 取URL参数值取URL文件名 等网址处理函数
  • 文档前端(JavaScript)函数_对象操作 —— 取对象成员数取对象成员名 等对象遍历函数
  • 文档前端(JavaScript)函数_数组操作 —— 取数组成员取数组成员数 数组遍历函数

前端(JavaScript)函数_数组操作

文档概述

轻语言网站开发中的数组相关操作函数、用于处理数组的创建、修改、查询和转换,包含获取数组长度、取数组元素、删除元素、添加元素、数组排序、数组去重、数组过滤等功能,常用于数据处理、列表管理、批量操作等场景。

  • 元素访问取数组成员(数组, 索引) 取元素,取数组成员数(数组) 取长度,不能用 数组[i] / 数组.length(轻语言数组语法)
  • 增删操作添加成员(末尾) / 添加成员首(开头) / 删除成员(按索引) / 删除成员首(队首) / 删除成员尾(队尾) / 清空数组
  • 数据处理清除重复成员(去重) / 过滤文本数组(筛选) / 数组排序(排序) / 翻转数组(反转) / 重置数组(批量赋值)
  • 查询统计取成员下标(查位置) / 取最大值 / 取最小值 / 取数组相等(比较) / 合并数组

💡 数组与对象区别:数组用 [] 定义、以索引存取(用 取数组成员);对象用 {} 定义、以键值对存取(用 对象.属性)。变量循环(i = 0, 取数组成员数(数组), 1) 是遍历数组的标准写法,注意是左闭右开区间 [0, 长度)

函数:取数组成员(待操作数组,索引)

获取指定数组中,指定索引位置的成员值,数组索引从0开始。

' 获取数组中指定位置的成员
变量 水果 = ["苹果", "香蕉", "橙子"]
调试输出(取数组成员(水果, 0))  ' 苹果
调试输出(取数组成员(水果, 1))  ' 香蕉
调试输出(取数组成员(水果, 2))  ' 橙子
' 遍历数组所有成员
变量 数字 = [10, 20, 30, 40, 50]
变量 总和 = 0
变量循环(i = 0, 取数组成员数(数字), 1)
	总和 = 总和 + 取数组成员(数字, i)
结束循环
调试输出("总和: " + 总和)  ' 150
' 获取最后一个成员
变量 最后一个 = 取数组成员(水果, 取数组成员数(水果) - 1)
调试输出("最后一个: " + 最后一个)  ' 橙子

函数:取数组成员数(待操作数组)

获取指定数组的成员数量。代码示例:变量 数量 = 取数组成员数(待操作数组)

' 获取用户列表的成员数量
变量 用户列表 = ["张三", "李四", "王五"]
变量 用户数 = 取数组成员数(用户列表)
调试输出("用户数量: " + 用户数)  ' 3
' 检查数组是否为空
变量 空数组 = []
如果(取数组成员数(空数组) == 0)
	调试输出("数组为空")
结束 如果
' 处理可能为空(轻语言空值关键字)的数组
变量 未定义数组
变量 成员数 = 取数组成员数(未定义数组)
调试输出("成员数: " + 成员数)  ' 0

函数:置数组成员值(待操作数组,位置,值)

修改数组中指定位置的成员值;数组下标是从0开始的、例如:要将某个整数数组的第2个位置的值修改成10;示例代码:置数组成员值(数组1,1,10)

' 修改数组指定位置的值
变量 数组1 = [1, 2, 3, 4, 5]
置数组成员值(数组1, 1, 10)
调试输出(数组1[1])  ' 10
' 修改多个成员值
变量 分数 = [80, 85, 90, 95]
置数组成员值(分数, 0, 88)
置数组成员值(分数, 3, 92)
调试输出("修改后: " + JSON编码(分数))  ' [88,85,90,92]
' 交换两个成员的位置
变量 数据 = ["A", "B", "C"]
变量 临时 = 取数组成员(数据, 0)
置数组成员值(数据, 0, 取数组成员(数据, 2))
置数组成员值(数据, 2, 临时)
调试输出("交换后: " + JSON编码(数据))  ' ["C","B","A"]

函数:清除重复成员(待操作数组)

清除数组的重复成员;注意:逻辑型数组使用该函数需注意长度。

' 清除数组中的重复值
变量 数字 = [1, 2, 2, 3, 3, 3, 4, 5, 5]
清除重复成员(数字)
调试输出("去重后: " + JSON编码(数字))  ' [1,2,3,4,5]
' 清除字符串数组中的重复值
变量 姓名 = ["张三", "李四", "张三", "王五", "李四"]
清除重复成员(姓名)
调试输出("去重后: " + JSON编码(姓名))  ' ["张三","李四","王五"]
' 从用户访问记录中提取不重复用户
变量 访问记录 = ["user1", "user2", "user1", "user3", "user2"]
清除重复成员(访问记录)
调试输出("不重复用户数: " + 取数组成员数(访问记录))  ' 3

函数:过滤文本数组(待操作数组,关键字,是否返回包含)

根据指定关键字过滤一个文本数组;如果关键字为空,则不作匹配返回原始数组,如果参数三为真;则只返回数组中包含关键字的成员;为假则返回不包含关键字的成员(含空成员对象,因为空成员对象不包含关键字)。

' 过滤包含关键字的成员
变量 水果 = ["苹果", "香蕉", "红苹果", "橙子", "青苹果"]
变量 包含苹果 = 过滤文本数组(水果, "苹果", 真)
调试输出("包含苹果: " + JSON编码(包含苹果))  ' ["苹果","红苹果","青苹果"]
' 过滤不包含关键字的成员
变量 不含苹果 = 过滤文本数组(水果, "苹果", 假)
调试输出("不含苹果: " + JSON编码(不含苹果))  ' ["香蕉","橙子"]
' 搜索过滤用户列表
变量 用户列表 = ["张三", "李四", "张伟", "王五", "张强"]
变量 张姓用户 = 过滤文本数组(用户列表, "张", 真)
调试输出("张姓用户: " + JSON编码(张姓用户))  ' ["张三","张伟","张强"]

函数:取最大值(待操作数组)

获取一个整数型数组中的最大值,如果参数数组为空或数组长度为0会抛出异常:“数组不能为空且长度不能为0”。

' 获取数组中的最大值
变量 分数 = [85, 92, 78, 95, 88]
变量 最高分 = 取最大值(分数)
调试输出("最高分: " + 最高分)  ' 95
' 获取温度数据中的最高温度
变量 温度 = [23, 25, 28, 31, 29, 27]
变量 最高温度 = 取最大值(温度)
调试输出("最高温度: " + 最高温度 + "°C")  ' 31°C
' 获取价格中的最大值
变量 价格 = [9.9, 19.9, 29.9, 39.9]
调试输出("最高价: " + 取最大值(价格))  ' 39.9

函数:取最小值(待操作数组)

获取一个整数型数组中的最小值,如果参数数组为空或数组长度为0会抛出异常:“数组不能为空且长度不能为0”。

' 获取数组中的最小值
变量 分数 = [85, 92, 78, 95, 88]
变量 最低分 = 取最小值(分数)
调试输出("最低分: " + 最低分)  ' 78
' 获取温度数据中的最低温度
变量 温度 = [23, 25, 28, 31, 29, 27]
变量 最低温度 = 取最小值(温度)
调试输出("最低温度: " + 最低温度 + "°C")  ' 23°C
' 获取价格中的最小值
变量 价格 = [9.9, 19.9, 29.9, 39.9]
调试输出("最低价: " + 取最小值(价格))  ' 9.9

函数:合并数组(待操作数组1,待操作数组2)

合并两个数组并返回合并后的结果。代码示例:变量 新数组 = 合并数组(数组1, 数组2)

' 合并两个用户列表
变量 列表1 = ["张三", "李四"]
变量 列表2 = ["王五", "赵六"]
变量 合并列表 = 合并数组(列表1, 列表2)
调试输出("合并后: " + JSON编码(合并列表))  ' ["张三","李四","王五","赵六"]
' 合并数字数组
变量 数字1 = [1, 2, 3]
变量 数字2 = [4, 5, 6]
变量 合并数字 = 合并数组(数字1, 数字2)
调试输出("合并数字: " + JSON编码(合并数字))  ' [1,2,3,4,5,6]
' 处理空数组
变量 空数组 = []
变量 有效数组 = ["元素1", "元素2"]
变量 结果 = 合并数组(空数组, 有效数组)
调试输出("结果: " + JSON编码(结果))  ' ["元素1","元素2"]

函数:添加成员(待操作数组,值)

添加一个元素到数组末尾,并返回数组的新长度。代码示例:变量 新长度 = 添加成员(待操作数组, 值)

' 向购物车添加商品
变量 购物车 = ["苹果", "香蕉"]
变量 新长度 = 添加成员(购物车, "橙子")
调试输出("购物车: " + JSON编码(购物车))  ' ["苹果","香蕉","橙子"]
调试输出("商品数量: " + 新长度)  ' 3
' 动态添加数据
变量 数据列表 = []
添加成员(数据列表, "数据1")
添加成员(数据列表, "数据2")
添加成员(数据列表, "数据3")
调试输出("数据列表: " + JSON编码(数据列表))  ' ["数据1","数据2","数据3"]

函数:清空数组(待操作数组)

清除数组中的所有元素,并返回数组的新长度。

' 清空购物车
变量 购物车 = ["苹果", "香蕉", "橙子"]
调试输出("清空前购物车: " + JSON编码(购物车))
变量 新长度 = 清空数组(购物车)
调试输出("清空后购物车: " + JSON编码(购物车))  ' []
调试输出("购物车长度: " + 新长度)  ' 0
' 重置数据
变量 数据缓存 = [1, 2, 3, 4, 5]
清空数组(数据缓存)
调试输出("缓存已清空,长度: " + 取数组成员数(数据缓存))  ' 0

函数:清空成员(待操作数组)

设置指定数组中的所有成员对象为空,仍保留其长度。

' 清空数组成员值但保留长度
变量 数据 = [1, 2, 3, 4, 5]
清空成员(数据)
调试输出("长度: " + 取数组成员数(数据))  ' 5(长度不变)
' 注:清空后成员值变为 空(轻语言空值关键字,等价于原生 JS 的 null)
调试输出("内容: " + JSON编码(数据))  ' [null,null,null,null,null]
' 重置用户选择状态
变量 选中状态 = [真, 真, 假, 真]
清空成员(选中状态)
' 选中状态现在为 [null,null,null,null]

函数:数组排序(待操作数组,正序排列)

对数值型数组元素进行排序,仅支持数值型成员排序。参数:正序排列 为真则从小到大排序、为假则从大到小排序。代码示例:数组排序(待操作数组, 真)

' 数值数组从小到大排序(正序)
变量 数字数组1 = [3, 1, 4, 1, 5, 9, 2, 6]
数组排序(数字数组1, 真)  ' 正序:从小到大
调试输出("正序排列: " + JSON编码(数字数组1))  ' [1,1,2,3,4,5,6,9]
' 数值数组从大到小排序(倒序)
变量 数字数组2 = [3, 1, 4, 1, 5, 9, 2, 6]
数组排序(数字数组2, 假)  ' 倒序:从大到小
调试输出("倒序排列: " + JSON编码(数字数组2))  ' [9,6,5,4,3,2,1,1]

函数:取数组相等(数组1,数组2)

获取并判断两个数组是否完全相等。

' 比较两个数组是否相等
变量 数组1 = [1, 2, 3]
变量 数组2 = [1, 2, 3]
变量 数组3 = [1, 2, 4]
调试输出(取数组相等(数组1, 数组2))  ' 真
调试输出(取数组相等(数组1, 数组3))  ' 假
' 比较字符串数组
变量 列表1 = ["苹果", "香蕉"]
变量 列表2 = ["苹果", "香蕉"]
变量 列表3 = ["苹果", "橙子"]
调试输出(取数组相等(列表1, 列表2))  ' 真
调试输出(取数组相等(列表1, 列表3))  ' 假
' 比较不同长度的数组
变量 短数组 = [1, 2]
变量 长数组 = [1, 2, 3]
调试输出(取数组相等(短数组, 长数组))  ' 假

函数:翻转数组(待操作数组)

将数组元素翻转顺序。代码示例:翻转数组(待操作数组)

' 翻转数字序列
变量 数字数组 = [1, 2, 3, 4, 5]
翻转数组(数字数组)
调试输出("翻转后: " + JSON编码(数字数组))  ' [5,4,3,2,1]
' 实现回文检测
变量 原数组 = ["a", "b", "c"]
变量 备份数组 = 合并数组([], 原数组)  ' 创建备份
翻转数组(备份数组)
如果(JSON编码(原数组) == JSON编码(备份数组))
	调试输出("是回文数组")
否则
	调试输出("不是回文数组")
结束 如果
' 倒序显示历史记录
变量 历史记录 = ["最新", "较新", "较旧", "最旧"]
翻转数组(历史记录)
调试输出("倒序历史: " + JSON编码(历史记录))  ' ["最旧","较旧","较新","最新"]

函数:重置数组(待操作数组,值)

将数组的所有成员均重新设置为指定的值。

' 将数组所有成员重置为同一值
变量 分数 = [85, 92, 78, 95]
重置数组(分数, 0)
调试输出("重置后: " + JSON编码(分数))  ' [0,0,0,0]
' 重置选中状态为未选中
变量 选中状态 = [真, 假, 真, 真]
重置数组(选中状态, 假)
调试输出("重置后: " + JSON编码(选中状态))  ' [false,false,false,false]
' 重置文本数组
变量 标签 = ["红", "绿", "蓝"]
重置数组(标签, "默认")
调试输出("重置后: " + JSON编码(标签))  ' ["默认","默认","默认"]

函数:取成员下标(待操作数组,值)

取出指定成员的下标值;如果成员不存在则返回 -1。

' 查找值在数组中的位置
变量 水果 = ["苹果", "香蕉", "橙子", "葡萄"]
变量 下标 = 取成员下标(水果, "橙子")
调试输出("橙子的下标: " + 下标)  ' 2
' 查找不存在的值
变量 不存在 = 取成员下标(水果, "西瓜")
调试输出("西瓜的下标: " + 不存在)  ' -1
' 查找用户在列表中的位置
变量 用户列表 = ["张三", "李四", "王五"]
变量 位置 = 取成员下标(用户列表, "李四")
如果(位置 != -1)
	调试输出("找到用户,位置: " + 位置)  ' 1
否则
	调试输出("用户不存在")
结束 如果

函数:删除成员(待操作数组,索引)

删除指定索引处的元素,并返回数组的新长度。代码示例:变量 新长度 = 删除成员(待操作数组, 索引)

' 从购物车中删除指定商品
变量 购物车 = ["苹果", "香蕉", "橙子", "葡萄"]
变量 删除索引 = 1  ' 香蕉的位置
变量 新长度 = 删除成员(购物车, 删除索引)
调试输出("购物车: " + JSON编码(购物车))  ' ["苹果","橙子","葡萄"]
调试输出("剩余商品数: " + 新长度)  ' 3
' 删除重复元素
变量 数组 = [1, 2, 2, 3, 2, 4]
' 从后往前删除,避免索引变化影响
变量循环(i = 取数组成员数(数组) - 1, 0, -1)
	如果(数组[i] == 2)
		删除成员(数组, i)
	结束 如果
结束循环
调试输出("去重后: " + JSON编码(数组))  ' [1,3,4]

函数:添加成员首(待操作数组,值)

添加一个元素到数组开头,并返回数组的新长度。代码示例:变量 新长度 = 添加成员首(待操作数组, 值)

' 在任务队列开头添加紧急任务
变量 任务队列 = ["普通任务1", "普通任务2"]
变量 新长度 = 添加成员首(任务队列, "紧急任务")
调试输出("任务队列: " + JSON编码(任务队列))  ' ["紧急任务","普通任务1","普通任务2"]
调试输出("任务数: " + 新长度)  ' 3
' 按优先级添加元素
变量 优先级列表 = ["中优先级", "低优先级"]
添加成员首(优先级列表, "高优先级")
调试输出("优先级列表: " + JSON编码(优先级列表))  ' ["高优先级","中优先级","低优先级"]

函数:删除成员首(待操作数组)

删除数组的第一个元素,并返回数组的新长度。代码示例:变量 新长度 = 删除成员首(待操作数组)

' 处理任务队列,完成第一个任务
变量 任务队列 = ["任务1", "任务2", "任务3"]
变量 剩余任务数 = 删除成员首(任务队列)
调试输出("已完成第一个任务")
调试输出("剩余任务: " + JSON编码(任务队列))  ' ["任务2","任务3"]
调试输出("剩余任务数: " + 剩余任务数)  ' 2
' 实现队列的出队操作
变量 队列 = ["元素1", "元素2", "元素3"]
' 注:数组[索引] 为原生 JS 数组访问语法,轻语言支持直接使用;也可用 取数组成员(数组, 索引)
变量 首元素 = 队列[0]
删除成员首(队列)
调试输出("出队元素: " + 首元素)  ' 元素1

函数:删除成员尾(待操作数组)

删除数组的最后一个元素,并返回数组的新长度。代码示例:变量 新长度 = 删除成员尾(待操作数组)

' 实现栈的出栈操作
变量 栈 = ["元素1", "元素2", "元素3"]
' 注:数组[索引] 为原生 JS 数组访问语法,轻语言支持直接使用;也可用 取数组成员(数组, 索引)
变量 栈顶元素 = 栈[取数组成员数(栈) - 1]
变量 新长度 = 删除成员尾(栈)
调试输出("出栈元素: " + 栈顶元素)  ' 元素3
调试输出("栈剩余元素: " + JSON编码(栈))  ' ["元素1","元素2"]
调试输出("栈大小: " + 新长度)  ' 2
' 撤销最近的操作
变量 操作历史 = ["打开文件", "编辑文本", "保存文件"]
删除成员尾(操作历史)
调试输出("撤销后历史: " + JSON编码(操作历史))  ' ["打开文件","编辑文本"]

函数:数组到文本(待操作数组,连接符)

将数组元素转换为字符串,并以指定分隔符分隔。代码示例:变量 文本 = 数组到文本(待操作数组, 连接符)

' 将标签数组转换为字符串
变量 标签 = ["重要", "紧急", "待办"]
变量 标签字符串 = 数组到文本(标签, ", ")
调试输出("标签: " + 标签字符串)  ' 重要, 紧急, 待办
' 构造CSS类名
变量 类名数组 = ["btn", "btn-primary", "active"]
变量 类名字符串 = 数组到文本(类名数组, " ")
调试输出("类名: " + 类名字符串)  ' btn btn-primary active
' 创建CSV行
变量 数据 = ["张三", "25", "工程师"]
变量 CSV行 = 数组到文本(数据, ",")
调试输出("CSV行: " + CSV行)  ' 张三,25,工程师

学习要点

知识点代码示例说明
元素访问取数组成员(数组, 0)取数组指定索引元素,索引从0开始;不能用 数组[i](轻语言数组语法)
长度获取取数组成员数(数组)获取数组元素数量;不能用 数组.length(轻语言数组语法)
修改元素置数组成员值(数组, 1, 10)修改指定索引位置的值;与 取数组成员 配套成对使用
循环遍历变量循环(i = 0, 取数组成员数(数组), 1)左闭右开区间 [0, 长度),自动遍历所有元素
去重清除重复成员(数组)原地去重,修改原数组;逻辑型数组注意长度变化
过滤过滤文本数组(数组, "关键字", 真)第三参数 真=返回包含项、假=返回不包含项;空关键字返回原数组
排序数组排序(数组, 真)真=正序(升序)、假=倒序(降序);仅支持数值型数组
查找位置取成员下标(数组, "橙子")返回元素索引,未找到返回 -1;常配合 删除成员 使用
数组序列化JSON编码(数组)将数组转为 JSON 字符串,用于调试输出、存储、传输
数组比较取数组相等(数组1, 数组2)深度比较两数组所有元素是否完全相等
空值处理清空成员(数组)清空值但保留长度,元素变为 (等价于 null);清空数组 则长度归零

相关文档

  • 文档前端(JavaScript)函数_对象操作 —— 取对象成员数取对象成员名 对象遍历函数
  • 文档前端(JavaScript)函数_数据转换类 —— JSON编码JSON解析到整数 等函数
  • 文档前端(JavaScript)函数_字符串操作 —— 数组到文本 的逆操作 文本到数组
  • 文档前端(JavaScript)函数_数学运算 —— 取最大值取最小值 的数学版本(参数为多值而非数组)
  • 文档轻语言网站:变量与数组与对象的定义 —— 数组与对象的基本语法

前端(JavaScript)函数_文档操作

文档概述

轻语言网站开发中的文档操作函数、用于操作HTML页面文档对象,包含获取页面元素、创建元素、设置属性、操作DOM、事件绑定等文档操作功能,常用于页面元素操作、动态内容生成、DOM操作等场景。

  • 元素查找查找元素ByID(单个) / 查找元素By类名(集合) / 查找元素By标签名(集合) / 查找元素By选择器(首个) / 查找全部元素By选择器(集合)
  • 元素创建与文档写入创建元素 创建新DOM节点;写文本到页面/写文本行到页面 向页面输出内容
  • 资源加载加载JS模块/加载JS文件/加载CSS文件 动态加载外部资源
  • 代码执行执行JS代码 通过 eval 执行原生JS代码字符串

💡 原生 JS DOM 注解:文档操作函数返回的DOM对象,其属性如 innerHTMLvaluestylesrconclick 等为原生 JS DOM 属性,轻语言支持直接使用。遍历DOM集合时使用 取数组成员数()取数组成员(集合, i),而非 .length集合[i]

函数:查找元素ByID(ID)

通过元素ID在当前页面中查找元素标签、并返回其DOM对象。

' 通过ID查找元素并修改其内容
变量 元素 = 查找元素ByID("myTitle")
' 注:innerHTML 为原生 JS DOM 属性,轻语言支持直接使用
如果(元素 != 空)
	元素.innerHTML = "新标题"
结束 如果
' 通过ID获取输入框的值
变量 输入框 = 查找元素ByID("username")
' 注:value 为原生 JS DOM 属性,轻语言支持直接使用
变量 用户名 = 输入框.value
调试输出("用户名: " + 用户名)

函数:查找元素By类名(类名)

根据指定的 class 样式类名获取界面指定元素节点;返回DOM对象集合。

' 查找所有class为"item"的元素
变量 元素列表 = 查找元素By类名("item")
调试输出("找到 " + 取数组成员数(元素列表) + " 个元素")
' 遍历所有匹配的元素
' 注:style.color 为原生 JS DOM 属性,轻语言支持直接使用
变量循环(i = 0, 取数组成员数(元素列表), 1)
	取数组成员(元素列表, i).style.color = "red"
结束循环
' 查找按钮类元素并设置点击事件
变量 按钮 = 查找元素By类名("btn-primary")
如果(取数组成员数(按钮) > 0)
	' 注:onclick、箭头函数 ()=>{} 为原生 JS 语法,轻语言支持直接使用
	取数组成员(按钮, 0).onclick = () => { 调试输出("按钮被点击") }
结束 如果

函数:查找元素By标签名(标签名称)

根据元素指定的标签名称获取界面指定元素节点;注意:标签名称只能为HTML原生名称、扩展组件不支持。

' 查找页面中所有的div元素
变量 div元素 = 查找元素By标签名("div")
调试输出("div数量: " + 取数组成员数(div元素))
' 查找所有段落标签
' 注:style.fontSize 为原生 JS DOM 属性,轻语言支持直接使用
变量 段落 = 查找元素By标签名("p")
变量循环(i = 0, 取数组成员数(段落), 1)
	取数组成员(段落, i).style.fontSize = "16px"
结束循环
' 查找所有图片标签并获取src
' 注:src 为原生 JS DOM 属性,轻语言支持直接使用
变量 图片 = 查找元素By标签名("img")
变量循环(i = 0, 取数组成员数(图片), 1)
	调试输出("图片地址: " + 取数组成员(图片, i).src)
结束循环

函数:查找元素By选择器(匹配表达式)

使用选择器"querySelector"查询界面中指定元素节点,返回第一个匹配的元素。

' 通过CSS选择器查找元素
变量 元素 = 查找元素By选择器("#myTitle")
' 注:innerHTML 为原生 JS DOM 属性,轻语言支持直接使用
元素.innerHTML = "通过ID选择器找到"
' 通过类选择器查找第一个匹配元素
变量 按钮 = 查找元素By选择器(".btn-primary")
' 注:style.backgroundColor 为原生 JS DOM 属性,轻语言支持直接使用
按钮.style.backgroundColor = "blue"
' 通过属性选择器查找
变量 输入框 = 查找元素By选择器("input[type='text']")
' 注:value 为原生 JS DOM 属性,轻语言支持直接使用
调试输出("输入框值: " + 输入框.value)
' 通过复合选择器查找
变量 选中项 = 查找元素By选择器("div.container > ul li.active")

函数:查找全部元素By选择器(匹配表达式)

使用选择器"querySelectorAll"查询界面中符合要求的所有指定元素节点;返回一个对象数组。

' 查找所有class为item的元素
变量 元素列表 = 查找全部元素By选择器(".item")
' 注:元素列表[i].style 为原生 JS DOM 操作语法,轻语言支持直接使用
变量循环(i = 0, 取数组成员数(元素列表), 1)
	取数组成员(元素列表, i).style.border = "1px solid #ccc"
结束循环
' 查找特定容器下的所有按钮
变量 按钮 = 查找全部元素By选择器("#toolbar button")
调试输出("工具栏按钮数: " + 取数组成员数(按钮))
' 查找所有选中的复选框
变量 选中项 = 查找全部元素By选择器("input[type='checkbox']:checked")
调试输出("选中数量: " + 取数组成员数(选中项))

函数:预处理文档()

删除当前页面空文本节点,并连接相邻节点。

' 规范化文档结构,清理空节点
预处理文档()
' 在动态添加/删除大量节点后调用
变量 容器 = 查找元素ByID("content")
' 注:innerHTML 为原生 JS DOM 属性,轻语言支持直接使用;创建元素 等效于 document.createElement
容器.innerHTML = ""
容器.appendChild(创建元素("div"))
预处理文档()  ' 清理可能产生的空文本节点

函数:写文本到页面(内容)

写(输出)指定文本内容到当前页面。

' 在页面中直接写入HTML内容
写文本到页面("<h1>欢迎来到我的网站</h1>")
' 写入段落和链接
写文本到页面("<p>这是一个<a href='about.html'>关于我们</a>的页面</p>")
' 注意:页面加载完成后调用会覆盖整个页面内容

函数:写文本行到页面(内容)

写(输出)指定文本行内容到当前页面,该函数会自动在写出的内容后面添加换行符。

' 写入多行内容(每行自动换行)
写文本行到页面("<p>第一行内容</p>")
写文本行到页面("<p>第二行内容</p>")
写文本行到页面("<p>第三行内容</p>")
' 在<pre>标签中效果更明显
写文本行到页面("<pre>")
写文本行到页面("代码行1")
写文本行到页面("代码行2")
写文本行到页面("</pre>")

函数:加载JS模块(目标JS文件,加载完成回调)

加载指定JS文件中导出的模块,在加载完成回调参数中以事件方式返回,返回一个参数:模块对象,可通过该对象取出JS文件中导出的指定模块类。

' 加载位于项目 static 文件夹中的 myModule.js 模块文件
加载JS模块("myModule.js", (模块对象) => {
	' 使用模块中的功能
	模块对象.某个导出函数()
})

函数:加载JS文件(目标JS文件,加载完成回调)

加载指定JS文件,在加载完成回调参数中以事件方式返回,返回一个参数:加载成功的JS文件地址。

' 加载位于项目 static 文件夹中的 MyJS.js 文件
加载JS文件("MyJS.js",(被加载JS文件) =>{
	调试输出("成功加载的JS文件:" + 被加载JS文件)
})

函数:加载CSS文件(目标CSS文件,加载完成回调)

加载指定CSS文件,在加载完成回调参数中以事件方式返回,返回一个参数:加载成功的CSS文件地址。

' 加载位于项目 static 文件夹中的 style.css 样式文件
加载CSS文件("style.css", (被加载CSS文件) => {
	调试输出("成功加载的CSS文件:" + 被加载CSS文件)
})

函数:执行JS代码(待执行JS代码)

执行指定JS代码,函数内部采用"eval"函数执行。

' 执行JS原生函数
执行JS代码("alert('信息提示')")
' 执行任意符合JavaScript语法的代码字符串
' 注:参数为字符串形式的原生 JS 代码,需用原生 JS 语法(new Date 为原生 JS 构造函数)
执行JS代码("let x = new Date(); 调试输出(x)")

函数:创建元素(标签名称)

创建指定标签元素对象。

' 创建 div 标签
变量 dom = 创建元素("div")
' 创建 button 标签
变量 btn = 创建元素("button")
' 添加到根布局或面板
弹性布局1.添加组件(dom)
弹性布局1.添加组件(btn)

学习要点

知识点代码示例说明
ID查找查找元素ByID("myTitle")返回单个DOM对象,无匹配返回 ;性能最佳
类名查找查找元素By类名("item")返回DOM集合,需用 取数组成员数 遍历
标签查找查找元素By标签名("div")仅支持HTML原生标签,扩展组件不支持
CSS选择器查找元素By选择器("#id") / 查找全部元素By选择器(".class")支持复合选择器;前者返回首个,后者返回全部
DOM属性访问元素.innerHTML / 元素.value / 元素.style原生JS DOM属性,轻语言支持直接使用;需加注释说明
DOM集合遍历变量循环(i = 0, 取数组成员数(列表), 1)取数组成员(列表, i) 访问,不能用 列表[i]
判空检查如果(元素 != 空)查找元素ByID 找不到返回 ,使用前必须判空
事件绑定元素.onclick = () => { ... }原生JS事件属性 + 箭头函数语法,轻语言支持
动态创建元素创建元素("div") + 添加组件创建DOM对象后用组件的 添加组件 方法加入布局
资源加载加载JS模块/加载JS文件/加载CSS文件动态加载外部资源;回调参数返回加载结果

相关文档

  • 文档前端(JavaScript)函数_窗口操作 —— 置组件居中批量赋值 等组件布局函数
  • 文档前端(JavaScript)函数_字符串操作 —— 寻找文本取文本中间 用于DOM文本处理
  • 文档前端(JavaScript)函数_数组操作 —— 取数组成员数取数组成员 用于DOM集合遍历
  • 文档前端(JavaScript)函数_对象操作 —— 取对象属性置对象属性 对象属性操作
  • 文档前端(JavaScript)函数_数据操作类 —— 解析XML文本 等数据解析函数

前端(JavaScript)函数_时钟类

文档概述

轻语言网站开发中的时钟类操作函数、用于实现定时器和延时功能,包含设置定时器、清除定时器、延时执行、倒计时等功能,常用于定时任务、动画控制、延时操作等场景。

  • 周期定时器创建时钟 按指定间隔(毫秒)重复执行子函数,返回时钟ID;类似 setInterval
  • 延时执行器延时执行 在指定等待时间(毫秒)后执行一次子函数,类似 setTimeout
  • 资源管理销毁时钟 / 销毁延时执行 用于停止定时器,避免内存泄漏

💡 时钟管理关键创建时钟销毁时钟 必须成对使用,延时执行销毁延时执行 同理。组件销毁时(如页面切换、元素移除)必须停止对应的时钟,否则会造成内存泄漏。间隔时间单位为毫秒,1000ms = 1秒。

函数:创建时钟(子函数,间隔时间)

创建一个根据指定间隔时间(单位:毫秒)周期调用子程序的定时器时钟对象;返回创建成功后的时钟ID。

' 创建一个每秒执行一次的时钟
变量 时钟ID = 创建时钟(()=>{
	调试输出("时钟执行中: " + 取本地现行时间())
}, 1000)

' 创建一个每5秒更新一次标签内容的时钟
变量 时钟ID2 = 创建时钟(()=>{
	标签1.文本 = "当前时间: " + 取本地现行时间()
}, 5000)

' 倒计时功能实现
变量 剩余秒数 = 60
变量 倒计时ID = 创建时钟(()=>{
	剩余秒数 = 剩余秒数 - 1
	倒计时标签.文本 = 到文本(剩余秒数) + "秒"
	如果(剩余秒数 <= 0)
		销毁时钟(倒计时ID)
		弹出提示("倒计时结束")
	结束 如果
}, 1000)

函数:销毁时钟(ID)

销毁创建的指定时钟对象。代码示例:销毁时钟(时钟ID)

' 销毁之前创建的时钟
销毁时钟(时钟ID)

' 在适当的时候停止时钟,避免内存泄漏
按钮1.置被单击回调((源对象, 事件源)=>{
	销毁时钟(时钟ID2)
	调试输出("时钟已停止")
})

' 页面卸载时清理所有时钟
页面.置被卸载回调(() => {
	销毁时钟(时钟ID)
	销毁时钟(时钟ID2)
})

函数:延时执行(子函数,等待时间)

创建一个根据指定等待时间(单位:毫秒)之后执行的子程序;返回创建成功后的时钟ID;注:本时钟只会在指定等待时间后调用一次子程序。代码示例:延时执行(子函数, 3000)

' 延时3秒后执行某个操作
变量 延时ID = 延时执行(()=>{
	弹出提示("3秒钟已到!")
}, 3000)

' 延时执行页面元素的显示
变量 延时ID2 = 延时执行(()=>{
	面板1.显示模式 = 显示_块
	面板1.文本 = "延时加载的内容"
}, 2000)

' 延时跳转页面
变量 跳转ID = 延时执行(()=>{
	切换页面("首页")
}, 5000)

函数:销毁延时执行(ID)

销毁创建的延时时钟对象。代码示例:销毁延时执行(延时ID)

' 在延时执行前取消操作
销毁延时执行(延时ID)

' 示例:创建一个可取消的延时操作
变量 延时ID3
延时ID3 = 延时执行(()=>{
	切换页面("下一页面")
}, 5000)

' 提供取消按钮
取消按钮.置被单击回调((sender, event)=>{
	销毁延时执行(延时ID3)
	弹出提示("操作已取消")
})

学习要点

知识点代码示例说明
周期定时器创建时钟(子函数, 1000)每隔指定毫秒执行一次,类似 setInterval;返回ID用于销毁
延时执行器延时执行(子函数, 3000)3秒后执行一次,类似 setTimeout;返回ID用于取消
销毁成对使用销毁时钟(时钟ID) / 销毁延时执行(延时ID)创建与销毁必须成对使用,否则内存泄漏
箭头函数回调() => { ... }原生 JS 箭头函数语法,轻语言支持直接使用;作为时钟回调函数
间隔单位1000 = 1秒间隔时间为毫秒,1000ms=1秒、500ms=0.5秒
倒计时实现剩余秒数 - 1 + 销毁时钟 判断创建时钟 每秒递减,到0时 销毁时钟 停止
页面卸载清理页面.置被卸载回调销毁时钟页面切换时必须清理定时器,防止后台运行与内存泄漏

相关文档

  • 文档前端(JavaScript)函数_时间类 —— 取本地现行时间创建时间对象 等时间函数
  • 文档前端(JavaScript)函数_浏览器操作类 —— 切换页面弹出提示 浏览器操作
  • 文档前端(JavaScript)函数_文档操作 —— 查找元素ByID 等DOM操作,配合时钟更新UI
  • 文档前端(JavaScript)函数_数据转换类 —— 到文本 等类型转换,配合时钟显示数据
  • 文档轻语言网站:变量与数组与对象的定义 —— 变量声明与基础语法

前端(JavaScript)函数_时间类

文档概述

轻语言网站开发中的时间日期操作函数、用于处理时间和日期数据,包含创建时间对象、获取年月日时分秒星期、格式化日期时间、计算时间差、时间戳转换、日期比较等功能,常用于时间显示、日期计算、时间格式化等场景。

  • 时间获取取年/取月/取日/取时/取分/取秒/取星期 可分别获取时间各部分,参数为空取当前时间
  • 格式化输出取现行日期/取现行时间/时间对象到文本 将时间对象转为字符串,可指定分隔符
  • 时间创建创建时间对象(字符串) / 创建指定时间对象(各分量) 两种创建方式
  • 时间计算取时间差 返回两时间对象的毫秒差;文本到时间戳 将时间字符串转为时间戳

💡 时间戳与时间差取时间差(A, B) 返回 A-B 的毫秒数(1秒=1000毫秒)。计算两时间相差天数:取时间差(A, B) / 1000 / 60 / 60 / 24取星期 返回 0-6,0 表示星期日。

函数:创建时间对象(时间字符串)

创建Date对象,参数为空则返回当前时间。时间字符串格式如 '2026/07/20 10:00:00'。

' 获取当前时间
变量 当前时间 = 创建时间对象()
调试输出(当前时间)

' 解析指定时间字符串
变量 指定时间 = 创建时间对象("2026/08/10 14:30:00")
调试输出(指定时间)

函数:取年(时间对象)

获取时间对象的年份,参数为空则取当前年。

变量 年 = 取年()
调试输出(年)  ' 如:2026

' 判断闰年
变量 当前年 = 取年()
如果(取余数(当前年, 4) == 0 且 取余数(当前年, 100) != 0)
	调试输出(当前年 + " 是闰年")
否则 如果(取余数(当前年, 400) == 0)
	调试输出(当前年 + " 是闰年")
否则
	调试输出(当前年 + " 是平年")
结束 如果

函数:取月(时间对象)

获取时间对象的月份(1-12),参数为空则取当前月。

变量 月 = 取月()
调试输出(月)  ' 1-12

' 根据月份显示季节
变量 当前月 = 取月()
如果(当前月 == 10 或 当前月 == 11 或 当前月 == 12)
	调试输出("冬季")
否则 如果(当前月 == 1 或 当前月 == 2 或 当前月 == 3)
	调试输出("春季")
否则 如果(当前月 == 4 或 当前月 == 5 或 当前月 == 6)
	调试输出("夏季")
否则 如果(当前月 == 7 或 当前月 == 8 或 当前月 == 9)
	调试输出("秋季")
否则
	调试输出("未知月份")
结束 如果

函数:取日(时间对象)

获取时间对象的日(1-31),参数为空则取当前日。

变量 日 = 取日()
调试输出(日)  ' 1-31

' 显示当前日期
变量 当前日期 = 取年() + "年" + 取月() + "月" + 取日() + "日"
调试输出(当前日期)

函数:取时(时间对象)

获取时间对象的小时(0-23),参数为空则取当前时。

变量 时 = 取时()
调试输出(时)  ' 0-23

' 根据时间显示问候语
变量 当前时 = 取时()
如果(当前时 < 6)
	调试输出("凌晨好")
否则 如果(当前时 < 12)
	调试输出("上午好")
否则 如果(当前时 < 18)
	调试输出("下午好")
否则
	调试输出("晚上好")
结束 如果

函数:取分(时间对象)

获取时间对象的分钟(0-59),参数为空则取当前分。

变量 分 = 取分()
调试输出(分)  ' 0-59

函数:取秒(时间对象)

获取时间对象的秒数(0-59),参数为空则取当前秒。

变量 秒 = 取秒()
调试输出(秒)  ' 0-59

函数:取星期(时间对象)

获取时间对象的星期几(0-6,0表示星期日),参数为空则取当前星期。

变量 星期 = 取星期()
调试输出(星期)  ' 0-6

' 显示中文星期
变量 星期名 = ["日", "一", "二", "三", "四", "五", "六"]
变量 星期几 = 取数组成员(星期名, 取星期())
调试输出("星期" + 星期几)  ' 如:星期一

函数:取现行日期(分隔符)

获取当前日期字符串,分隔符可选,默认 '/',例如 '2026/08/10'。

变量 日期 = 取现行日期("-")
调试输出(日期)  ' 2026-08-10

' 默认分隔符
变量 日期2 = 取现行日期()
调试输出(日期2)  ' 2026/08/10

函数:取现行时间(分隔符)

获取当前时间字符串,分隔符可选,默认 ':',例如 '14:30:25'。

变量 时间 = 取现行时间(":")
调试输出(时间)  ' 14:30:25

' 完整日期时间
变量 当前 = 取现行日期("-") + " " + 取现行时间(":")
调试输出(当前)  ' 2026-08-10 14:30:25

函数:创建指定时间对象(年, 月, 日, 时, 分, 秒)

根据指定年月日时分秒创建Date对象(月为1-12,时、分、秒可选)。

变量 时间 = 创建指定时间对象(2026, 8, 10, 10, 0, 0)
调试输出(时间)

' 仅指定年月日
变量 生日 = 创建指定时间对象(1990, 5, 15)
调试输出(生日)

函数:时间对象到文本(时间对象, 日期分隔符)

将Date对象格式化为 'YYYY/MM/DD HH:MM:SS' 字符串,分隔符可选,默认 '/'。

变量 文本 = 时间对象到文本(创建时间对象(), "-")
调试输出(文本)  ' 2026-08-10 14:30:25

' 格式化指定时间
变量 指定时间 = 创建指定时间对象(2026, 1, 1)
变量 格式文本 = 时间对象到文本(指定时间, "/")
调试输出(格式文本)  ' 2026/01/01 00:00:00

函数:取时间差(时间对象A, 时间对象B)

返回两个时间对象的毫秒差值(A - B)。

变量 差 = 取时间差(创建时间对象("2026-08-10 12:00:00"), 创建时间对象("2026-08-10 10:00:00"))
调试输出(差)  ' 7200000 (2小时的毫秒数)

' 计算两时间相差天数
变量 开始 = 创建时间对象("2026-08-01")
变量 结束 = 创建时间对象("2026-08-10")
变量 毫秒差 = 取时间差(结束, 开始)
变量 天数 = 向下取整(毫秒差 / 1000 / 60 / 60 / 24)
调试输出("相差 " + 天数 + " 天")  ' 9

函数:文本到时间戳(时间字符串)

将时间字符串转换为毫秒时间戳,若解析失败返回-1。

变量 时间戳 = 文本到时间戳("2026-08-10 14:30:00")
调试输出(时间戳)  ' 毫秒数

' 判断解析是否成功
变量 戳 = 文本到时间戳("无效时间")
如果(戳 == -1)
	调试输出("时间格式无效")
否则
	调试输出("时间戳: " + 戳)
结束 如果

学习要点

知识点代码示例说明
当前时间取年() / 取月() / 取日()参数为空时取当前时间分量,取星期 返回 0-6(0=周日)
日期格式化取现行日期("-") / 取现行时间(":")可指定分隔符;组合使用得到完整日期时间字符串
时间对象创建创建时间对象("2026/08/10")字符串创建;创建指定时间对象(年, 月, 日, 时, 分, 秒) 分量创建
时间差计算取时间差(A, B)返回 A-B 的毫秒数;天数 = 毫秒/1000/60/60/24
时间戳转换文本到时间戳("2026-08-10 14:30:00")字符串转毫秒时间戳;失败返回 -1,需判空
闰年判断取余数(年, 4) == 0能被4整除且不被100整除,或被400整除为闰年
中文星期取数组成员(["日","一",...], 取星期())星期数组映射中文名称,0=周日
时间字符串格式"2026/08/20 10:00:00"推荐使用 /- 分隔,避免使用 . 导致解析问题

相关文档

  • 文档前端(JavaScript)函数_时钟类 —— 创建时钟延时执行 定时器函数
  • 文档前端(JavaScript)函数_数据转换类 —— 到文本到数值 等类型转换函数
  • 文档前端(JavaScript)函数_数学运算 —— 取余数向下取整 等数学函数
  • 文档前端(JavaScript)函数_数组操作 —— 取数组成员 用于星期名映射
  • 文档前端(JavaScript)函数_储存类 —— 保存配置 存储时间相关用户偏好

前端(JavaScript)函数_正则表达类

文档概述

轻语言网站开发中的正则表达式相关操作函数、用于文本模式匹配和处理,包含正则匹配、正则搜索、正则替换、正则验证等功能,常用于文本验证、数据提取、格式化处理等场景。

  • 正则字面量语法:使用 /表达式/标志 形式定义正则(如 /\d+/g),原生 JS 语法,轻语言支持直接使用
  • 匹配与搜索区别正则匹配 返回所有匹配项数组(无匹配返回 );正则搜索 返回首次匹配位置索引(未找到返回 -1)
  • 替换支持反向引用正则替换 中可用 $1$2 引用捕获组内容

💡 正则表达式入门:常用元字符 \d(数字)、\w(字母数字下划线)、\s(空白)、.(任意字符);量词 *(0+次)、+(1+次)、?(0/1次)、{n,m}(n到m次);标志 g(全局)、i(忽略大小写)、m(多行)。

函数:正则匹配(待操作内容,表达式)

在指定待操作内容中搜索与正则表达式的匹配项,然后将匹配项作为数组返回。代码示例:变量 匹配结果 = 正则匹配(待操作内容, 表达式)

' 提取文本中的所有数字
变量 文本 = "今年是2023年,人口有14亿,GDP增长了5.5%"
变量 数字表达式 = /\d+\.?\d*/g
变量 数字匹配 = 正则匹配(文本, 数字表达式)
调试输出("提取的数字: " + JSON编码(数字匹配))  ' ["2023","14","5.5"]

' 提取邮箱地址
变量 邮箱文本 = "联系我: john@example.com 或 mary@test.org"
变量 邮箱表达式 = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g
变量 邮箱匹配 = 正则匹配(邮箱文本, 邮箱表达式)
调试输出("邮箱地址: " + JSON编码(邮箱匹配))  ' ["john@example.com","mary@test.org"]

' 验证手机号格式
变量 手机号 = "13812345678"
变量 手机号表达式 = /^1[3-9]\d{9}$/
变量 手机号匹配 = 正则匹配(手机号, 手机号表达式)
' 注:无匹配时返回 空(轻语言空值关键字,等价于原生 JS 的 null)
如果(手机号匹配 != 空)
	调试输出("手机号格式正确")
否则
	调试输出("手机号格式错误")
结束 如果

函数:正则搜索(待操作内容,表达式)

使用正则方式根据表达式搜索指定内容;找到返回索引、否则返回-1。代码示例:变量 位置 = 正则搜索(待操作内容, 表达式)

' 查找关键词首次出现的位置
变量 文档 = "这是一份重要的技术文档,文档中包含了关键技术要点"
变量 关键词表达式 = /技术/
变量 位置 = 正则搜索(文档, 关键词表达式)
调试输出("关键词首次出现位置: " + 位置)  ' 7

' 检查是否包含敏感词
变量 评论 = "这个产品真的很好用,没有任何问题"
变量 敏感词表达式 = /垃圾|废物|差劲/
变量 搜索结果 = 正则搜索(评论, 敏感词表达式)
如果(搜索结果 != -1)
	调试输出("发现敏感词,位置: " + 搜索结果)
否则
	调试输出("未发现敏感词")
结束 如果

' 查找邮箱格式内容
变量 文本 = "联系方式: email@test.com"
变量 邮箱表达式 = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/
变量 邮箱位置 = 正则搜索(文本, 邮箱表达式)
如果(邮箱位置 != -1)
	调试输出("邮箱位置: " + 邮箱位置)
结束 如果

函数:正则替换(待操作内容,新内容,表达式)

使用正则方式根据表达式匹配指定内容并将其替换为新内容。代码示例:变量 结果 = 正则替换(待操作内容, 新内容, 表达式)

' 替换文本中的敏感词
变量 原文 = "这个产品真是垃圾,完全没法用"
变量 敏感词表达式 = /垃圾/
变量 替换结果 = 正则替换(原文, "**", 敏感词表达式)
调试输出("替换后: " + 替换结果)  ' 这个产品真是**,完全没法用

' 格式化电话号码
变量 电话 = "电话:13812345678"
变量 电话表达式 = /(\d{3})(\d{4})(\d{4})/
变量 格式化结果 = 正则替换(电话, "电话:$1-$2-$3", 电话表达式)
调试输出("格式化后: " + 格式化结果)  ' 电话:138-1234-5678

' 去除多余空格
变量 多空格文本 = "这    是   一   个   测试   文本"
变量 空格表达式 = /\s+/g
变量 去空格结果 = 正则替换(多空格文本, " ", 空格表达式)
调试输出("整理后: " + 去空格结果)  ' 这 是 一 个 测试 文本

学习要点

知识点代码示例说明
正则字面量/\d+/g使用 /.../ 定义正则,结尾标志 g(全局)、i(忽略大小写)、m(多行)
数字提取/\d+\.?\d*/g\d 匹配数字,+ 一次以上,\.? 可选小数点,* 零次以上
邮箱匹配/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g字符集 [...] 匹配其中任意字符,+ 一次以上,{2,} 至少2次
手机号验证/^1[3-9]\d{9}$/^ 开头,$ 结尾,[3-9] 范围匹配,\d{9} 恰好9位数字
空值判断如果(匹配结果 != 空)正则匹配 无匹配时返回 (等价于 null),需先判空再使用
索引判断如果(搜索结果 != -1)正则搜索 未找到返回 -1,不能与 比较
反向引用正则替换(电话, "$1-$2-$3", 表达式)$1$2$3 引用正则中的捕获组 ( ... ) 内容
空白处理/\s+/g\s 匹配空格/制表符/换行等空白字符,+ 匹配连续多个

相关文档

  • 文档前端(JavaScript)函数_字符串操作 —— 寻找文本倒找文本子文本替换 等字符串处理函数
  • 文档前端(JavaScript)函数_数据转换类 —— JSON编码JSON解析 等数据序列化函数
  • 文档前端(JavaScript)函数_数组操作 —— 正则匹配返回的数组遍历与处理
  • 文档前端(JavaScript)函数_储存类 —— 配合正则做表单数据验证后存储
  • 文档轻语言网站:变量与数组与对象的定义 —— 变量声明与基础语法

前端(JavaScript)函数_浏览器操作类

文档概述

轻语言网站开发中的浏览器操作函数、用于获取和控制浏览器信息,包含浏览器版本检测、用户代理获取、浏览器特性判断等功能,常用于浏览器兼容性检测、功能适配、环境判断等场景。

  • 浏览器信息取浏览器名称/取浏览器版本信息/取浏览器引擎/取用户代理头信息 获取浏览器基本信息
  • 环境检测取浏览器运行平台/取浏览器语言/取浏览器状态/取Cookie启用状态 检测运行环境
  • Cookie管理读COOKIE/写COOKIE/置COOKIE 读写、设置浏览器Cookie

💡 Cookie 操作说明读COOKIE("") 返回所有cookie;指定字段存在返回字段值,否则返回空字符串。写COOKIE 单字段写入并指定有效天数;置COOKIE 一次性写入多个键值对,参数格式为 "key1=value1;key2=value2"

函数:取浏览器代码名()

获取当前浏览器的代码名称。

变量 代码名 = 取浏览器代码名()
调试输出("浏览器代码名: " + 代码名)  ' 如:Mozilla

函数:取浏览器名称()

获取当前浏览器的名称。

变量 名称 = 取浏览器名称()
调试输出("浏览器名称: " + 名称)  ' 如:Netscape

' 根据浏览器名称判断类型
变量 浏览器 = 取浏览器名称()
变量 UA = 取用户代理头信息()
如果(寻找文本(UA, "Chrome") != -1)
	调试输出("Chrome 浏览器")
否则 如果(寻找文本(UA, "Firefox") != -1)
	调试输出("Firefox 浏览器")
否则 如果(寻找文本(UA, "Safari") != -1)
	调试输出("Safari 浏览器")
结束 如果

函数:取浏览器版本信息()

获取当前浏览器的平台和版本信息。

变量 版本信息 = 取浏览器版本信息()
调试输出("版本信息: " + 版本信息)

函数:取Cookie启用状态()

获取当前浏览器中是否启用cookie的状态。

变量 启用 = 取Cookie启用状态()
调试输出("Cookie已启用: " + 启用)

' Cookie 未启用时提示用户
如果(启用 == 假)
	弹出提示("请启用浏览器Cookie以正常使用登录功能")
结束 如果

函数:取浏览器运行平台()

获取当前浏览器运行的操作系统平台。

变量 平台 = 取浏览器运行平台()
调试输出("运行平台: " + 平台)  ' 如:Win32

' 根据平台适配界面
变量 当前平台 = 取浏览器运行平台()
如果(寻找文本(当前平台, "Win") != -1)
	调试输出("Windows 系统")
否则 如果(寻找文本(当前平台, "Mac") != -1)
	调试输出("macOS 系统")
否则 如果(寻找文本(当前平台, "Linux") != -1)
	调试输出("Linux 系统")
结束 如果

函数:取用户代理头信息()

获取由客户机发送服务器的user-agent头部的值。

变量 UA = 取用户代理头信息()
调试输出("User-Agent: " + UA)

' 判断设备类型
变量 代理 = 取用户代理头信息()
如果(寻找文本(代理, "Mobile") != -1 或 寻找文本(代理, "Android") != -1)
	调试输出("移动设备")
否则
	调试输出("桌面设备")
结束 如果

函数:取浏览器位置()

获取当前浏览器的地理位置信息。

变量 位置信息 = 取浏览器位置()
调试输出(位置信息)

函数:取浏览器语言()

获取当前浏览器使用的语言。

变量 语言 = 取浏览器语言()
调试输出("浏览器语言: " + 语言)  ' 如:zh-CN

' 根据语言加载对应资源
变量 当前语言 = 取浏览器语言()
如果(寻找文本(当前语言, "zh") != -1)
	加载中文资源()
否则 如果(寻找文本(当前语言, "en") != -1)
	加载英文资源()
结束 如果

函数:取浏览器状态()

获取当前浏览器是否在线的状态。

变量 是否在线 = 取浏览器状态()
调试输出("在线状态: " + 是否在线)

' 离线状态提示
如果(取浏览器状态() == 假)
	弹出提示("您当前处于离线状态,部分功能不可用")
结束 如果

函数:取浏览器引擎()

获取当前浏览器使用的引擎(产品)。

变量 引擎 = 取浏览器引擎()
调试输出("浏览器引擎: " + 引擎)  ' 如:Gecko

函数:读COOKIE(字段名)

获取当前站点cookie,如果指定字段参数为空字符串,则返回所有cookie,若指定字段存在则返回指定字段cookie值,否则返回空。

' 读取指定字段的cookie
变量 用户名 = 读COOKIE("username")
调试输出("用户名: " + 用户名)

' 读取用户登录令牌
变量 令牌 = 读COOKIE("token")
如果(令牌 == "")
	调试输出("用户未登录")
否则
	调试输出("登录令牌: " + 令牌)
结束 如果

' 读取所有cookie
变量 所有cookie = 读COOKIE("")
调试输出("所有cookie: " + 所有cookie)

' 用户登录状态检查
变量 登录状态 = 读COOKIE("login")
如果(登录状态 == "true")
	显示用户信息()
否则
	跳转登录页()
结束 如果

函数:写COOKIE(字段名,值,有效天数)

向cookie列表中写入指定字段值及有效时间,单位为天。

' 写入用户名cookie,有效期7天
写COOKIE("username", "张三", 7)

' 写入登录令牌,有效期30天
写COOKIE("token", "abc123xyz", 30)

' 写入用户偏好设置
写COOKIE("theme", "dark", 365)
写COOKIE("language", "zh-CN", 365)

' 写入临时cookie(会话级别,1天)
写COOKIE("temp", "临时数据", 1)

' 登录成功后保存登录信息
登录按钮.置被单击回调(() => {
	写COOKIE("userid", "1001", 7)
	写COOKIE("login", "true", 7)
	弹出提示("登录成功")
})

函数:置COOKIE(COOKIE键值对字符串值)

设置全部或追加COOKIE值,参数值格式须为键值对格式,例如:“user=demo1;sign=123456”

' 一次设置多个cookie
置COOKIE("user=demo1;sign=123456")

' 设置用户登录信息
置COOKIE("userid=1001;role=admin;login=true")

' 追加新的cookie
置COOKIE("theme=dark;fontsize=14")

学习要点

知识点代码示例说明
浏览器信息取浏览器名称() / 取浏览器版本信息()获取浏览器名称、版本、引擎等基本信息
UA判断寻找文本(取用户代理头信息(), "Chrome")通过 UA 字符串匹配判断浏览器类型和设备类型
平台识别寻找文本(取浏览器运行平台(), "Win")通过平台字符串匹配识别操作系统
语言适配取浏览器语言()获取浏览器语言,用于国际化资源加载
Cookie读取读COOKIE("username")读取指定字段;空字符串参数返回所有cookie;不存在返回空字符串
Cookie写入写COOKIE("username", "张三", 7)单字段写入并指定有效天数
Cookie批量设置置COOKIE("user=demo1;sign=123456")一次性设置多个键值对,参数格式 "key1=value1;key2=value2"
字符串匹配寻找文本(文本, 关键词) != -1找到返回位置,未找到返回 -1;用于UA、平台等字符串匹配判断

相关文档

  • 文档前端(JavaScript)函数_字符串操作 —— 寻找文本取文本中间 用于解析UA和Cookie字符串
  • 文档前端(JavaScript)函数_储存类 —— 保存配置读取配置 基于localStorage的本地存储
  • 文档前端(JavaScript)函数_URL地址操作类 —— 取URL完整地址重载页面 URL操作函数
  • 文档前端(JavaScript)函数_窗口操作 —— 打开窗口关闭窗口 窗口管理函数
  • 文档前端(JavaScript)函数_网络操作类 —— HTTP请求 等网络通信函数

前端(JavaScript)函数_窗口操作

文档概述

轻语言网站开发中的窗口操作函数、用于控制浏览器窗口行为,包含页面跳转、窗口打开、CSS/JS文件加载、组件居中、页面标题设置等窗口操作功能,常用于页面导航、资源加载、窗口控制等场景。

  • 对话框与提示信息框/确认框/弹出提示/弹出输入框 提供不同交互级别的用户提示
  • 窗口控制切换页面/打开新窗口/关闭窗口/置窗口尺寸/移动窗口 控制窗口行为
  • 页面信息取页面标题/置页面标题/取页面图标/置页面图标/取页面背景色/置页面背景色 管理页面元信息
  • 组件布局置组件居中/置组件水平居中/置组件垂直居中/批量赋值/置组件宽度 控制组件布局
  • 数据编码BASE64编码/BASE64解码 用于简单的字符串编码转换
  • 页面参数切换页面 传递数据,取请求参数 接收数据

💡 页面切换传参切换页面("页面名", "key1=value1&key2=value2") 传递键值对格式数据,目标页面用 取请求参数() 接收参数对象,通过 参数["key"] 访问具体值。注意:传递值必须为文本且为键值对格式。

函数:信息框(信息内容)

显示一个警告对话框,参数为待显示的信息内容。

' 显示简单的信息提示
信息框("欢迎来到本网站!")
' 显示操作结果
信息框("保存成功!")
' 显示带变量的信息
变量 用户名 = "张三"
信息框("您好," + 用户名 + "!")

函数:确认框(确认内容)

显示一个确认对话框,返回用户点击确认或取消的结果。

' 删除前确认
变量 结果 = 确认框("确定要删除这条记录吗?")
如果(结果)
	调试输出("用户确认删除")
	' 执行删除操作...
否则
	调试输出("用户取消删除")
结束 如果
' 退出前确认
变量 是否退出 = 确认框("您有未保存的修改,确定要退出吗?")
如果(是否退出)
	关闭窗口()
结束 如果

函数:弹出提示(提示信息,持续时间)

在页面底部弹出一个文本提示,默认2秒后自动消失,参数持续时间单位:毫秒。代码示例:弹出提示("操作成功", 3000)

' 在页面底部弹出提示信息,持续3秒钟
弹出提示("操作成功", 3000)
' 使用默认持续时间(2秒)
弹出提示("保存完成")

函数:弹出输入框(提示信息)

弹出一个可提示用户输入的对话框,并返回用户的输入内容。

' 弹出一个输入对话框,并返回用户输入的内容
变量 输入结果 = 弹出输入框("请输入用户名")
调试输出("用户输入:" + 输入结果)

函数:调试输出(值)

将指定的值,对象,数组值输出到浏览器控制台(Console),一般浏览器按电脑键盘“F12”键可打开浏览器调试控制台。

' 输出字符串
调试输出("这是一条调试信息")
' 输出变量值
变量 用户名 = "张三"
变量 年龄 = 25
调试输出("姓名: " + 用户名 + ",年龄: " + 年龄)
' 输出数组
变量 水果 = ["苹果", "香蕉", "橙子"]
调试输出(水果)
' 输出对象
变量 用户 = { "姓名": "李四", "年龄": 30 }
调试输出(用户)

函数:调试输出对象(对象)

在控制台中输出指定对象信息。

变量 坐标 = { X: 100, Y: 200 }
' 输出对象信息
调试输出对象(坐标)

函数:请求窗口聚焦()

将焦点设置到当前窗口。

' 将焦点设置到当前窗口
请求窗口聚焦()
' 从子窗口回到主窗口时聚焦
变量 子窗口 = 打开新窗口("child.html")
子窗口.关闭()
请求窗口聚焦()  ' 回到主窗口

函数:请求窗口失焦()

移除当前窗口的焦点。

' 移除当前窗口焦点
请求窗口失焦()
' 在打开新窗口后让当前窗口失焦
打开新窗口("popup.html")
请求窗口失焦()

函数:滚动页面内容(X坐标, Y坐标)

将窗口页面内容滚动到指定坐标位置,坐标原点:页面左上角。代码示例:滚动页面内容(0, 500)

' 滚动到页面顶部
滚动页面内容(0, 0)
' 滚动到指定坐标位置,X=100,Y=500
滚动页面内容(100, 500)

函数:滚动相对位置(X偏移, Y偏移)

将窗口页面内容相对于当前位置滚动指定的偏移量。代码示例:滚动相对位置(0, 100)

' 向下滚动100像素
滚动相对位置(0, 100)
' 向右滚动50像素,向下滚动200像素
滚动相对位置(50, 200)

函数:停止加载()

停止窗口加载资源,类似浏览器的停止按钮。

' 停止页面加载
停止加载()
' 在用户点击取消按钮时停止加载
取消按钮.置被单击回调(() => {
	停止加载()
	弹出提示("已停止加载")
})

函数:置窗口尺寸(宽度,高度)

设置窗口尺寸大小,单位:像素。代码示例:置窗口尺寸(800, 600)

' 将窗口尺寸设置为800x600像素
置窗口尺寸(800, 600)
' 设置为全屏尺寸
置窗口尺寸(取窗口宽度(), 取窗口高度())

函数:调整窗口尺寸(宽度增减,高度增减)

调整窗口尺寸大小,窗口左上角位置不变,根据参数值增减窗口宽高,单位:像素。代码示例:调整窗口尺寸(100, 50)

' 窗口宽度增加100像素,高度增加50像素
调整窗口尺寸(100, 50)
' 窗口宽度减少50像素,高度减少100像素
调整窗口尺寸(-50, -100)

函数:打印页面()

打开打印对话框打印当前页面。

' 打印当前页面
打印页面()
' 点击按钮触发打印
打印按钮.置被单击回调(() => {
	打印页面()
})

函数:移动窗口(X坐标,Y坐标)

将窗口的左上角移动到一个指定的坐标。代码示例:移动窗口(100, 100)

' 将窗口移动到屏幕坐标(100, 100)位置
移动窗口(100, 100)
' 将窗口移动到屏幕中心
移动窗口((取屏幕宽度()-取窗口宽度())/2, (取屏幕高度()-取窗口高度())/2)

函数:取选中对象()

返回表示用户选择的文本范围或光标的当前位置的对象。

' 获取用户选择的文本范围或光标当前位置
变量 选中内容 = 取选中对象()
调试输出(选中内容)

函数:BASE64解码(值)

解码使用 base64 编码的字符串。

' 解码Base64字符串
变量 密文 = "SGVsbG8gV29ybGQ="
变量 明文 = BASE64解码(密文)
调试输出("解码结果: " + 明文)  ' Hello World
' 解码Token获取用户信息
变量 Token = "eyJ1c2VyIjoiemhhbmdzYW4ifQ=="
变量 用户数据 = BASE64解码(Token)
调试输出("用户数据: " + 用户数据)

函数:BASE64编码(值)

用于创建一个 base64 编码的字符串。

' 编码字符串为Base64
变量 明文 = "Hello World"
变量 密文 = BASE64编码(明文)
调试输出("编码结果: " + 密文)  ' SGVsbG8gV29ybGQ=
' 编码用户信息生成简单Token
变量 用户信息 = "user=张三&role=admin"
变量 Token = BASE64编码(用户信息)
调试输出("Token: " + Token)

函数:关闭窗口()

关闭当前窗口。

' 关闭当前窗口
关闭窗口()
' 用户确认后关闭
变量 结果 = 确认框("确定要关闭窗口吗?")
如果(结果)
	关闭窗口()
结束 如果

函数:切换页面(页面名称,数据值)

切换当前窗口内容为指定页面的内容,参数二为需要传递的数据值,可省略。

' 切换页面时不传递数据,切换到"我的"页面
切换页面("我的")
' 切换页面时向目标窗口传递数据,注意传递的值只能为文本值且为键值对格式
切换页面("窗口1","key=1&value=data2")
' 传递多个参数
切换页面("详情页", "id=123&name=产品名称&type=电子")

函数:打开新窗口(页面名称)

在新窗口中打开指定页面;等效于:“window.open”函数,示例:打开新窗口("窗口1")。

' 在新窗口中打开"主页"
打开新窗口("主页")
' 在新窗口中打开指定页面并获取窗口对象
变量 新窗口 = 打开新窗口("详情页")
' 可以通过新窗口对象进行进一步操作

函数:添加CSS文件(地址)

添加并引入指定路径的 CSS 文件。代码示例:添加CSS文件("/static/css/style.css")

' 添加外部CSS文件
添加CSS文件("https://cdn.example.com/styles.css")
' 添加本地CSS文件
添加CSS文件("/static/css/style.css")

函数:添加字体文件(字体名称,字体文件地址,加载完毕回调函数,预设参数)

添加并引入指定字体文件到当前页面。

' 添加并使用自定义字体
添加字体文件("CustomFont", "/static/fonts/custom.woff2", ()=>{
	' 字体加载完成后的使用
	标签1.字体 = "CustomFont"
})
' 带预设参数的字体加载
添加字体文件("MyFont", "/static/fonts/myfont.woff2",()=>{
	' 字体加载完成后的使用
	标签1.字体 = "MyFont"
},{"style": "normal", "weight": "400"})

函数:置页面标题(新标题)

设置当前页面的标题。代码示例:置页面标题("我的应用 - 首页")

' 设置页面标题
置页面标题("我的应用 - 首页")
' 动态设置标题
置页面标题("用户中心 - " + 用户名)

函数:取页面标题()

获取当前页面的标题。

' 获取当前页面标题
变量 当前标题 = 取页面标题()
调试输出("页面标题: " + 当前标题)

函数:置页面图标(图标地址)

设置当前页面的图标。

' 设置页面图标
置页面图标("/static/images/logo.png")
' 动态切换页面图标(如夜间模式)
变量 当前主题 = 取缓存数据("theme")
如果(当前主题 == "dark")
	置页面图标("/static/images/logo-dark.png")
否则
	置页面图标("/static/images/logo-light.png")
结束 如果

函数:取页面图标()

获取当前页面的图标。

' 获取当前页面图标地址
变量 当前图标 = 取页面图标()
调试输出("当前图标: " + 当前图标)
' 检查图标是否已设置
如果(取页面图标() == "")
	置页面图标("/static/images/default.png")
结束 如果

函数:置页面背景色(颜色值)

设置当前页面背景颜色。

' 设置页面背景色
置页面背景色("#f0f0f0")
' 根据时间切换背景色
变量 当前小时 = 取时()
如果(当前小时 >= 6 且 当前小时 < 18)
	置页面背景色("#ffffff")  ' 白天白色背景
否则
	置页面背景色("#333333")  ' 夜晚深色背景
结束 如果

函数:取页面背景色()

获取当前页面背景颜色。

' 获取当前页面背景色
变量 当前背景色 = 取页面背景色()
调试输出("背景色: " + 当前背景色)
' 判断当前主题
如果(取页面背景色() == "#333333")
	调试输出("当前为夜间模式")
否则
	调试输出("当前为日间模式")
结束 如果

函数:取本窗口对象()

获取当前窗口(Window)对象。

变量 当前窗口 = 取本窗口对象()
调试输出(当前窗口)

函数:窗口已关闭()

获取并返回当前窗口是否已经被关闭。

变量 是否关闭 = 窗口已关闭()
调试输出("窗口已关闭: " + 是否关闭)

函数:取文档高度()

获取并返回窗口的文档显示区的高度。

变量 文档高度 = 取文档高度()
调试输出("文档高度: " + 文档高度 + "px")

函数:取文档宽度()

获取并返回窗口的文档显示区的宽度。

变量 文档宽度 = 取文档宽度()
调试输出("文档宽度: " + 文档宽度 + "px")

函数:取窗口框架数()

获取并返回窗口中的框架数量。

变量 框架数 = 取窗口框架数()
调试输出("框架数: " + 框架数)

函数:取窗口名称()

获取并返回窗口的名称。

变量 窗口名 = 取窗口名称()
调试输出("窗口名称: " + 窗口名)

函数:取窗口源引用()

获取并返回 创建此窗口的 来源窗口对象,通俗的讲:就是这个窗口是从那个窗口创建或切换过来的。

变量 来源窗口 = 取窗口源引用()
调试输出(来源窗口)

函数:取窗口高度()

获取并返回窗口的外部高度,包含工具条与滚动条。

变量 窗口高度 = 取窗口高度()
调试输出("窗口高度: " + 窗口高度 + "px")

函数:取窗口宽度()

获取并返回窗口的外部宽度,包含工具条与滚动条。

变量 窗口宽度 = 取窗口宽度()
调试输出("窗口宽度: " + 窗口宽度 + "px")

函数:取页面X偏移()

获取并返回当前页面相对于窗口显示区左上角的X位置。

变量 页面X偏移 = 取页面X偏移()
调试输出("X偏移: " + 页面X偏移)

函数:取页面Y偏移()

获取并返回当前页面相对于窗口显示区左上角的Y位置。

变量 页面Y偏移 = 取页面Y偏移()
调试输出("Y偏移: " + 页面Y偏移)

函数:取父窗口()

获取并返回父窗口。

变量 父窗口 = 取父窗口()
调试输出(父窗口)

函数:取窗口X坐标()

获取并返回相对于屏幕窗口的x坐标。

变量 窗口X坐标 = 取窗口X坐标()
调试输出("窗口X坐标: " + 窗口X坐标)

函数:取窗口Y坐标()

获取并返回相对于屏幕窗口的y坐标。

变量 窗口Y坐标 = 取窗口Y坐标()
调试输出("窗口Y坐标: " + 窗口Y坐标)

函数:取顶层父窗口()

获取并返回最顶层的父窗口。

变量 顶层窗口 = 取顶层父窗口()
调试输出(顶层窗口)

函数:置组件水平居中(...视图组件)

设置指定组件在页面中相对于页面宽度水平居中。代码示例:置组件水平居中(按钮1, 输入框1)

' 将单个组件水平居中
置组件水平居中(登录按钮)
' 将多个组件同时水平居中
置组件水平居中(按钮1, 输入框1, 标签1)

函数:置组件垂直居中(...视图组件)

设置指定组件在页面中相对于页面高度垂直居中。代码示例:置组件垂直居中(面板1)

' 将组件垂直居中
置组件垂直居中(主面板)
' 将多个组件垂直居中
置组件垂直居中(面板1, 面板2)

函数:置组件居中(...视图组件)

设置指定组件在页面中垂直水平居中。代码示例:置组件居中(对话框1)

' 将组件完全居中(水平+垂直)
置组件居中(登录对话框)					
' 将多个组件居中
置组件居中(面板1, 面板2)

函数:批量赋值(属性名称,目标值,...视图组件)

对指定对象的属性批量赋值,例如要同时设置多个可视组件的宽度或背景颜色。

' 批量设置组件宽度
批量赋值("宽度", "80%", 编辑框1, 编辑框2, 编辑框3)
' 批量设置组件背景颜色
批量赋值("背景颜色", "#f0f0f0", 面板1, 面板2, 面板3)
' 批量设置组件可见性
批量赋值("可视", "hidden", 组件1, 组件2, 组件3)

函数:置组件宽度(值,...视图组件)

设置指定组件的宽度值,参数二支持同时设置多个组件的宽度。代码示例:置组件宽度(300, 按钮1, 输入框1)

' 设置单个组件宽度
置组件宽度(200, 按钮1)
' 同时设置多个组件宽度
置组件宽度("50%", 面板1, 面板2)
' 使用不同单位设置宽度
置组件宽度("200px", 组件1)
置组件宽度("80%", 组件2)

函数:置组件高度(值,...视图组件)

设置指定组件的高度值,参数二支持同时设置多个组件的高度。代码示例:置组件高度(400, 面板1)

' 设置组件高度
置组件高度(300, 主面板)
' 同时设置多个组件高度
置组件高度("60vh", 面板1, 面板2)

函数:置组件顶边(值,...视图组件)

设置指定组件的顶边值,参数二支持同时设置多个组件的顶边。代码示例:置组件顶边(50, 面板1)

' 设置组件距离顶部的位置
置组件顶边(100, 弹窗1)
' 同时设置多个组件的顶边
置组件顶边(20, 标签1, 输入框1)

函数:置组件左边(值,...视图组件)

设置指定组件的左边值,参数二支持同时设置多个组件的左边。代码示例:置组件左边(100, 面板1)

' 设置组件距离左边的位置
置组件左边(50, 侧边栏)
' 同时设置多个组件的左边位置
置组件左边(10, 标签1, 输入框1)

函数:取请求参数()

获取从其它页面切换到本页面时,传递过来的参数值,返回一个参数值对象。

' 获取页面跳转时传递的参数,假设上一个窗口切换到本页面时传递的参数为 ?id=123&name=test
变量 参数值 = 取请求参数()
如果(参数值 != 空)
	变量 用户ID = 参数值["id"]
	变量 用户名 = 参数值["name"]
	' 使用参数值
	调试输出("用户名:" + 用户名 + ",用户ID:" + 用户ID)
结束 如果

学习要点

知识点代码示例说明
对话框信息框/确认框/弹出提示/弹出输入框不同级别交互:信息框(alert)、确认框(confirm)、提示(toast)、输入(prompt)
页面切换切换页面("我的")在当前窗口切换页面,可传递键值对格式参数
新窗口打开打开新窗口("主页")在新窗口打开页面,类似 window.open;返回窗口对象可继续操作
页面传参切换页面("详情页", "id=123&name=产品")传递键值对字符串;目标页面用 取请求参数() 接收对象
参数接收取请求参数() 返回对象,参数值["key"]返回参数对象,用 ["键名"] 访问具体值;无参数返回
组件居中置组件居中(对话框1)水平+垂直居中;置组件水平居中/置组件垂直居中 可单独设置
批量操作批量赋值("宽度", "80%", 组件1, 组件2)对多组件同一属性批量赋值,减少重复代码
BASE64编解码BASE64编码("文本") / BASE64解码("密文")简单字符串编码,非加密;常用于Token、数据传输
窗口尺寸置窗口尺寸(800, 600)设置宽高;调整窗口尺寸 在原尺寸基础上增减
窗口移动移动窗口((取屏幕宽度()-取窗口宽度())/2, ...)移动窗口到指定坐标,常配合屏幕尺寸实现居中

相关文档

  • 文档前端(JavaScript)函数_URL地址操作类 —— 重载页面取URL完整地址 URL操作函数
  • 文档前端(JavaScript)函数_历史类 —— 后退页面前进页面 浏览历史控制
  • 文档前端(JavaScript)函数_浏览器操作类 —— 读COOKIE写COOKIE Cookie操作
  • 文档前端(JavaScript)函数_屏幕操作类 —— 取屏幕宽度取屏幕高度 屏幕信息获取
  • 文档前端(JavaScript)函数_文档操作 —— 查找元素ByID 等DOM操作函数
  • 文档前端(JavaScript)函数_时间类 —— 取时取年 等时间函数,配合定时切换背景

前端(JavaScript)函数_网络操作类

文档概述

轻语言网站开发中的网络操作函数、用于处理HTTP请求和网络通信,包含HTTP请求、文件上传、下载、接口调用、网络状态检测等功能,常用于API调用、数据交换、文件传输等场景。

  • 接口请求请求接口 调用本程序后端接口文件;发送GET请求/发送POST数据 发起HTTP请求
  • 文件上传上传文件By接口 通过后端接口上传文件
  • 回调异步:所有请求函数均为异步,通过回调函数接收结果,回调参数通常为 (请求结果, 标记)

💡 请求异步与跨域:所有网络请求函数均为异步操作,通过回调函数处理响应。GET/POST请求默认仅支持同源域名,跨域需服务端配置CORS。请求超时默认5秒,可通过最后参数自定义。返回的JSON字符串需用 JSON解析 转为对象后访问属性。

函数:请求接口(接口文件名,后端函数名,回调函数,待提交数据,协议头,标记值)

请求本程序中指定后端接口文件;向其发送或获取数据;回调函数返回两个参数:(请求结果,标记)。代码示例:请求接口(接口文件名, 后端函数名, 回调函数, 待提交数据)

' 发送GET请求获取用户信息,user 为接口文件名,getUserInfo为后端函数名
请求接口("user", "getUserInfo", (结果, 标记)=>{
	如果(结果 != "")
		变量 用户数据 = JSON解析(结果)
		调试输出("用户名: " + 用户数据.姓名)
	否则
		调试输出("获取用户信息失败")
	结束 如果
})
' 发送POST请求提交用户数据
变量 提交数据 = "name=张三&age=25&email=zhangsan@example.com"
请求接口("user", "saveUserInfo", (结果, 标记)=>{
	如果(结果 == "success")
		弹出提示("用户信息保存成功")
	否则
		弹出提示("保存失败")
	结束 如果
}, 提交数据)
' 带自定义协议头的请求
变量 自定义协议头 = {
	"Authorization": "Bearer token123",
	"Content-Type": "application/json"
}
变量 JSON数据 = JSON编码({"name": "李四", "age": 30})
请求接口("api", "updateUser", (结果, 标记)=>{
	调试输出("更新结果: " + 结果)
}, JSON数据, 自定义协议头, "更新用户")

函数:上传文件By接口(接口文件名,后端函数名,待上传文件对象,回调函数)

通过调用接口向服务端(服务器)上传一个文件;回调函数返回一个参数:(请求结果)。代码示例:上传文件By接口(接口文件名, 后端函数名, 待上传文件对象, 回调函数)

' 上传用户选择的文件
' 注:箭头函数 ()=>{} 为原生 JS 回调语法,轻语言支持直接使用
文件选择框1.置文件选择完毕回调((源对象, 文件列表)=>{
	' 注:数组[索引] 为原生 JS 数组访问语法,轻语言支持直接使用;也可用 取数组成员(数组, 索引)
	变量 选中文件 = 文件列表[0]
	如果(选中文件 != 空)
		上传文件By接口("file", "upload", 选中文件, (结果)=>{
			如果(结果 != "fail")
				弹出提示("文件上传成功")
				调试输出("文件URL: " + 结果)
			否则
				弹出提示("文件上传失败")
			结束 如果
		})
	结束 如果
})
' 上传图片文件
文件选择框2.置文件选择完毕回调((源对象, 文件列表)=>{
	变量 文件对象 = 文件列表[0]
	如果(文件对象 != 空)
		上传文件By接口("image", "uploadImage", 文件对象, (结果)=>{
			如果(结果 != "fail")
				图片预览.资源 = 结果
				弹出提示("图片上传成功")
			否则
				弹出提示("图片上传失败")
			结束 如果
		})
	结束 如果
})

函数:发送GET请求(地址,回调函数,标记值,超时)

向服务端发送GET请求获取内容、注意:默认仅支持访问同源域名地址;若访问跨域地址,请在服务端允许跨域,回调函数返回两个参数值:(请求结果,标记),参数超时默认5秒,可省略。代码示例:发送GET请求(地址, 回调函数)

' 获取天气信息
变量 天气API = "https://api.weather.com/v1/weather?city=Beijing"
' 注:箭头函数 ()=>{} 为原生 JS 回调语法,轻语言支持直接使用
发送GET请求(天气API, (结果, 标记)=>{
	如果(结果 != "")
		变量 天气数据 = JSON解析(结果)
		' 注:对象.属性 为原生 JS 对象属性访问语法,轻语言支持直接使用
		调试输出("当前温度: " + 天气数据.温度 + "°C")
	否则
		调试输出("获取天气信息失败")
	结束 如果
})
' 获取新闻列表
变量 新闻API = "/api/news/list?page=1&size=10"
发送GET请求(新闻API, (结果, 标记)=>{
	如果(结果 != "")
		变量 新闻列表 = JSON解析(结果)
		' 更新界面显示新闻
		' 注:数组[索引] 为原生 JS 数组访问语法,轻语言支持直接使用;也可用 取数组成员(数组, 索引)
		变量循环(i = 0, 取数组成员数(新闻列表), 1)
			新闻容器.添加子项(创建新闻项(新闻列表[i]))
		结束循环
	否则
		弹出提示("获取新闻失败")
	结束 如果
}, "新闻列表")
' 带超时设置的请求
变量 外部API = "https://external-api.com/data"
发送GET请求(外部API, (结果, 标记)=>{
	如果(结果 != "")
		处理数据(JSON解析(结果))
	否则
		弹出提示("请求超时或失败")
	结束 如果
}, "", 10000)  ' 10秒超时

函数:发送POST数据(地址,待提交数据,回调函数,协议头,标记值,超时)

向服务端发送POST请求获取内容、注意:默认仅支持访问同源域名地址;若访问跨域地址,请在服务端允许跨域,回调函数返回两个参数:(请求结果,标记),参数超时默认5秒,可省略。代码示例:发送POST数据(地址, 待提交数据, 回调函数)

' 用户登录
变量 登录地址 = "/api/user/login"
变量 登录数据 = "username=admin&password=123456"
发送POST数据(登录地址, 登录数据, (结果, 标记)=>{
	变量 响应 = JSON解析(结果)
	如果(响应.状态 == "success")
		弹出提示("登录成功")
		切换页面("dashboard")
	否则
		弹出提示("登录失败: " + 响应.消息)
	结束 如果
})
' 提交表单数据
变量 提交地址 = "/api/form/submit"
变量 表单对象 = {
	"name": 姓名输入框.文本,
	"email": 邮箱输入框.文本,
	"phone": 电话输入框.文本,
	"message": 留言输入框.文本
}
变量 JSON数据 = JSON编码(表单对象)
变量 协议头 = {
	"Content-Type": "application/json"
}
发送POST数据(提交地址, JSON数据, (结果, 标记)=>{
	变量 响应 = JSON解析(结果)
	如果(响应.状态 == "success")
		弹出提示("提交成功")
		清空表单()
	否则
		弹出提示("提交失败")
	结束 如果
}, 协议头)
' 发送带有认证信息的请求
变量 API地址 = "/api/protected/data"
变量 数据 = "query=getUserData"
变量 认证协议头 = {
	"Authorization": "Bearer " + 获取Token(),
	"Content-Type": "application/x-www-form-urlencoded"
}
发送POST数据(API地址, 数据, (结果, 标记)=>{
	如果(结果 != "")
		处理用户数据(JSON解析(结果))
	否则
		弹出提示("请求失败,请重新登录")
		切换页面("login")
	结束 如果
}, 认证协议头, "获取用户数据", 8000)

学习要点

知识点代码示例说明
后端接口调用请求接口("user", "getUserInfo", 回调)调用本程序后端接口文件中的函数;回调参数 (结果, 标记)
GET请求发送GET请求(地址, 回调, 标记, 超时)获取数据;默认仅同源;超时默认5秒,可省略
POST请求发送POST数据(地址, 数据, 回调, 协议头, 标记, 超时)提交数据;协议头可省略;常配合 JSON编码 提交JSON数据
文件上传上传文件By接口("file", "upload", 文件对象, 回调)通过后端接口上传单个文件;配合文件选择框回调使用
异步回调(结果, 标记) => { ... }所有请求异步执行;回调函数通过箭头函数定义,参数为结果与标记
JSON数据处理JSON解析(结果) / JSON编码(对象)返回JSON字符串需 JSON解析 转对象;提交对象需 JSON编码 转字符串
跨域限制默认仅同源跨域需服务端配置CORS(Access-Control-Allow-Origin)
协议头设置{ "Authorization": "Bearer token", "Content-Type": "..." }自定义请求头;常用于身份认证和内容类型声明
错误处理如果(结果 != "") / 如果(结果 == "fail")请求失败时结果为空字符串或特定错误标识;需判断后处理
超时控制发送GET请求(地址, 回调, 标记, 10000)最后参数为超时毫秒数;超时后触发回调处理失败逻辑

相关文档

  • 文档前端(JavaScript)函数_数据转换类 —— JSON编码JSON解析 JSON数据处理函数
  • 文档前端(JavaScript)函数_对象操作 —— 取对象属性置对象属性 对象属性操作
  • 文档前端(JavaScript)函数_数组操作 —— 取数组成员数取数组成员 用于响应数据遍历
  • 文档前端(JavaScript)函数_窗口操作 —— 切换页面弹出提示 请求后页面跳转与提示
  • 文档前端(JavaScript)函数_储存类 —— 保存配置读取配置 存储Token等登录信息
  • 文档前端(JavaScript)函数_字符串操作 —— 寻找文本取文本中间 用于处理响应文本

服务端(PHP)函数_MYSQL操作

文档概述

轻语言网站**后端(PHP)**开发中的MYSQL相关操作函数、用于连接和操作服务器中的MySQL数据库,包含数据库连接、SQL执行、数据查询、数据修改、表操作等功能,常用于数据库管理、数据存储、数据查询等场景。

⚠️ 使用限制说明

  • 本文档内函数仅限在轻语言后端文件 .sph 代码中使用,用于编写服务端逻辑(编译后输出为 PHP 代码在服务器执行)。
  • 不得在编写前端页面 .spl 代码中使用,更禁止与 JS 代码混合使用
  • 编写前端请使用 前端(JavaScript)函数_* 类目下的中文函数;服务端只能使用 服务端(PHP)函数_* 类目下的中文函数。
  • 前后端函数无同名冲突;MYSQL 数据库操作属后端独有功能,前端无法直接访问数据库。

💡 PHP 原生英文函数使用说明

  • 轻语言后端支持直接调用 PHP 原生英文函数(如 print_r()pdo_query()mysqli_fetch_assoc() 等)。
  • 当遇到轻语言未封装中文函数、但 PHP 原生函数可用时,可直接使用原生英文函数。
  • 仅支持使用原生英文函数名严禁使用 PHP 原生语法格式和英文关键字(如 if(){}for(){}functionclassecho 等控制结构与语法关键字)。
  • 控制结构必须使用轻语言中文关键字:如果...否则...结束 如果变量循环...结束循环函数 ... 结束 函数 等。
  • 注:->(对象方法调用,如 连接对象->beginTransaction())、=>(数组键值分隔)为轻语言本身支持的语法符号,可正常使用。

PHP MYSQL 相关特性:

  • 底层基于 PDO:所有函数基于 PHP PDO 扩展,支持预处理语句,自动防 SQL 注入
  • 参数绑定MySQL执行/MySQL查询 第二参数为数组,用 ? 占位符绑定参数,避免 SQL 注入
  • 事务支持:通过 MySQL取连接对象 获取 PDO 对象,可调用 beginTransaction/commit/rollBack
  • 自增IDMySQL取LASTID 对应 PDO lastInsertId(),获取上次插入的自增ID
  • 查询结果MySQL查询 返回关联数组数组(二维);MySQL取一行 返回单条关联数组
  • 存在性检查MySQL查找 返回布尔值,用于判断数据是否存在
  • 错误处理:连接失败返回假并输出错误信息,便于调试

函数:MySQL连接(数据库地址,数据库账号用户名,数据库密码,数据库名称)

连接服务器安装的MySQL数据库,连接成功返回真,连接失败返回假,并输出错误信息。

' 连接数据库,本地连接地址一般为 localhost
变量 连接 = MySQL连接("localhost", "root", "123456", "testdb")
如果(连接)
	返回 真
否则
	输出("连接数据库失败: " + 连接)
	返回 假
结束 如果

函数:MySQL执行(SQL命令,参数值=[])

'执行MySQL非查询命令、例如:添加数据、删除数据、修改数据。执行命令成功返回真,失败返回假并输出错误信息。

' 执行添加数据,数据表名为 mytable
变量 执行结果 = MySQL执行("insert into mytable(uname,upass,age)value(?,?,?)",["张三","123456",25])
输出 执行结果 ? "数据添加成功" : "数据添加失败"
' 执行修改数据
变量 执行结果 = MySQL执行("update mytable set age=? where id=?",[25,1])
输出 执行结果 ? "数据修改成功" : "数据修改失败"
' 执行删除数据
变量 执行结果 = MySQL执行("delete from mytable where id=?",[1])
输出 执行结果 ? "数据删除成功" : "数据删除失败"

函数:MySQL查询(SQL命令,参数值=[])

'执行MySQL查询命令、可通过该函数查询表中的数据。

' 查询表中所有数据
变量 查询结果 = MySQL查询("select * from mytable")
输出数组(查询结果)
' 查询表中指定字段数据
变量 查询结果 = MySQL查询("select uname,upass from mytable")
输出数组(查询结果)
' 查询表中指定字段数据,并指定查询条件 id 小于 100 且 age 年龄大于 30 的数据
变量 查询结果 = MySQL查询("select uname,upass from mytable where id < ? and age > ?",[100,30])
输出数组(查询结果)

函数:MySQL查找(表名,条件命令,参数值)

'查找指定字段值是否在表中存在、存在返回真、否则返回假。

' 查询表中是否存在指定字段值,例如查找检测表中用户名等于张三、年龄小于25岁的用户是否存在
变量 查询结果 = MySQL查找("mytable","uname=? and age < ?",["张三",25])
输出 查询结果 ? "存在" : "不存在"

函数:MySQL取一行(表名,条件,参数值)

'从表中查询并取出符合条件的第一条数据,如果查询成功返回查询到的数据,否则返回假。

' 例如取出表中id小于10且年龄(age)小于20的数据
变量 获取结果 = MySQL取一行("mytable","id<? and age < ?",[10,20])
如果(获取结果)
	输出数组(获取结果)
否则
	输出 "数据获取失败"
结束 如果

函数:MySQL取连接对象()

获取当前MySQL数据库连接对象,可用于直接操作PDO连接。

' 获取数据库连接对象
变量 连接对象 = MySQL取连接对象()
如果(连接对象)
	输出 "获取连接对象成功"
否则
	输出 "获取连接对象失败"
结束 如果

函数:MySQL取LASTID()

获取最后一次插入操作生成的自增ID。

' 执行插入操作后获取自增ID
MySQL执行("INSERT INTO mytable(uname,upass)VALUES(?,?)",["李四","654321"])
变量 新ID = MySQL取LASTID()
输出 "新记录ID: " + 新ID

函数:MySQL取表字段(表名)

获取指定表的所有字段信息,返回字段详细信息的数组。

' 获取表的所有字段信息
变量 字段信息 = MySQL取表字段("mytable")
如果(字段信息)
	输出数组(字段信息)
否则
	输出 "获取字段信息失败"
结束 如果

函数:MySQL取表是否存在(表名)

检查指定表是否存在,存在返回真,不存在返回假。

' 检查表是否存在
变量 表存在 = MySQL取表是否存在("mytable")
输出 表存在 ? "表存在" : "表不存在"

学习要点

知识点代码示例说明
数据库连接MySQL连接(地址, 用户, 密码, 库名)基于 PHP PDO;成功返回真,失败返回假并输出错误
非查询执行MySQL执行(SQL, 参数数组)增删改操作;用 ? 占位符防注入;成功返回真
查询多行MySQL查询(SQL, 参数数组)返回二维关联数组;每行为一条记录
存在性检查MySQL查找(表名, 条件, 参数)返回布尔值;判断数据是否存在
查询单行MySQL取一行(表名, 条件, 参数)返回单条关联数组;查不到返回假
取连接对象MySQL取连接对象()获取 PDO 对象;可调用事务方法 beginTransaction/commit
取自增IDMySQL取LASTID()对应 PDO lastInsertId();插入后获取自增ID
取表字段MySQL取表字段(表名)返回字段信息数组
表存在检查MySQL取表是否存在(表名)返回布尔值
参数绑定["张三", 25] / ? 占位符PDO 预处理;自动防 SQL 注入
SQL 注入防护MySQL执行(SQL, 参数) 配合 ? 占位符参数自动转义;切勿拼接SQL字符串
输出函数输出 值 / 输出数组(数组)后端输出到响应体;对应 PHP echo/print_r

相关文档

  • 文档服务端(PHP)函数_核心库函数 —— JSON编码取请求值 等接口数据处理
  • 文档服务端(PHP)函数_编码操作 —— 反斜杠转义 防注入辅助
  • 文档服务端(PHP)函数_字符串操作 —— 字符串字段处理
  • 文档服务端(PHP)函数_数组操作 —— 查询结果数组遍历
  • 文档服务端(PHP)函数_时间操作 —— 时间戳字段读写
  • 文档轻语言网站:变量与数组与对象的定义 —— 变量、对象、数组的基本语法

服务端(PHP)函数_字符串操作

文档概述

轻语言网站**后端(PHP)**开发中的字符串相关操作函数、基于PHP mbstring扩展处理多语言文本,包含文本分割、连接、大小写转换、MD5加密、文本截取、替换、查找等功能,常用于文本处理、数据格式化、字符串操作等场景,注意使用该类型函数时需开启PHP的'mbstring'扩展。

⚠️ 使用限制说明

  • 本文档内函数仅限在轻语言后端文件 .sph 代码中使用,用于编写服务端逻辑(编译后输出为 PHP 代码在服务器执行)。
  • 不得在编写前端页面 .spl 代码中使用,更禁止与 JS 代码混合使用
  • 编写前端请使用 前端(JavaScript)函数_* 类目下的中文函数;服务端只能使用 服务端(PHP)函数_* 类目下的中文函数。
  • 前后端虽存在同名函数(如 取文本长度到大写到小写分割文本),但底层实现与运行环境完全不同,严禁混用。

💡 PHP 原生英文函数使用说明

  • 轻语言后端支持直接调用 PHP 原生英文函数(如 print_r()mb_strlen()str_repeat()nl2br() 等)。
  • 当遇到轻语言未封装中文函数、但 PHP 原生函数可用时,可直接使用原生英文函数。
  • 仅支持使用原生英文函数名严禁使用 PHP 原生语法格式和英文关键字(如 if(){}for(){}functionclassecho 等控制结构与语法关键字)。
  • 控制结构必须使用轻语言中文关键字:如果...否则...结束 如果变量循环...结束循环函数 ... 结束 函数 等。
  • 注:->(对象方法调用)、=>(数组键值分隔)为轻语言本身支持的语法符号,可正常使用。

PHP 字符串相关特性:

  • 多字节支持取子文本/寻找文本/倒找文本 基于 PHP mb_* 系列,支持中文(UTF-8,一字3字节)
  • 字节 vs 字符取字节子文本/翻转字节/子字节替换字节操作,处理中文可能乱码;取子文本字符操作
  • MD5加密取MD5 对应 PHP md5(),常用于密码哈希
  • 大小写转换到大写/到小写 对应 PHP strtoupper/strtolower
  • 空白处理删首空/删尾空/删首尾空 对应 ltrim/rtrim/trim
  • 分割连接分割文本/数组到文本 对应 explode/implode
  • 扩展依赖:使用多字节函数(含 取子文本 等)需开启 PHP mbstring 扩展

函数:分割文本(分割符,待分割文本)

用指定的分割符分割指定的文本字符串、并返回分割后的数组。

' 使用逗号分割字符串
变量 分割结果 = 分割文本(",", "苹果,香蕉,橙子,葡萄")
输出数组(分割结果)

' 使用空格分割字符串
变量 句子 = "今天 天气 很好"
变量 词语数组 = 分割文本(" ", 句子)
输出数组(词语数组)

函数:数组到文本(分隔符,数组)

返回由数组元素组合成的字符串,注意:不支持多维数组。

' 用逗号连接数组元素
变量 水果数组 = ["苹果", "香蕉", "橙子"]
变量 水果文本 = 数组到文本(",", 水果数组)
输出 水果文本  ' 输出: 苹果,香蕉,橙子

' 用空格连接数组元素
变量 词语数组 = ["今天", "天气", "很好"]
变量 句子 = 数组到文本(" ", 词语数组)
输出 句子  ' 输出: 今天 天气 很好

函数:删首空(文本)

移除字符串左侧的空白字符或其他字符。

' 删除字符串左侧的空格
变量 原文本 = "   左侧有空格的文本"
变量 新文本 = 删首空(原文本)
输出 新文本  ' 输出: "左侧有空格的文本"

函数:删尾空(文本)

移除字符串右侧的空白字符或其他字符。

' 删除字符串右侧的空格
变量 原文本 = "右侧有空格的文本   "
变量 新文本 = 删尾空(原文本)
输出 新文本  ' 输出: "右侧有空格的文本"

函数:删首尾空(文本)

删除字符串左右两边的空白字符或其它字符

' 删除字符串两端的空格
变量 原文本 = "   两端都有空格的文本   "
变量 新文本 = 删首尾空(原文本)
输出 新文本  ' 输出: "两端都有空格的文本"

函数:取MD5(文本)

计算字符串的 MD5 散列。

' 计算字符串的MD5值
变量 密码 = "123456"
变量 MD5密码 = 取MD5(密码)
输出 "原密码: " + 密码
输出 "MD5密码: " + MD5密码

函数:到小写(文本)

把字符串转换为小写字母。

' 将字符串转换为小写
变量 大写文本 = "HELLO WORLD"
变量 小写文本 = 到小写(大写文本)
输出 小写文本  ' 输出: hello world

函数:到大写(文本)

把字符串转换为大写字母。

' 将字符串转换为大写
变量 小写文本 = "hello world"
变量 大写文本 = 到大写(小写文本)
输出 大写文本  ' 输出: HELLO WORLD

函数:取字节子文本(待操作文本,开始位置,长度)

获取并返回指定位置的子字符串,注意:该函数是按 “字节” 裁取指定位置,长度的子字符串,不是按 “字符”,适合操作纯英文字符串。如果处理中文(UTF-8 编码,一个中文占 3 字节),直接截取会乱码,需用‘取子文本’函数或‘mb_substr’(多字节字符串函数)。

' 取指定位置的子字符串
变量 原文本 = "Hello World"
变量 子文本 = 取字节子文本(原文本, 0, 5)
输出 子文本  ' 输出: Hello

函数:翻转字节(待处理文本)

通过字节方式反转指定字符串。

' 反转字符串
变量 原文本 = "abcdef"
变量 反转文本 = 翻转字节(原文本)
输出 反转文本  ' 输出: fedcba

函数:子字节替换(待被替换值,用作替换的值,待搜索的文本)

通过字节方式替换字符串中指定字符为另一个字符(对大小写不敏感)。

' 替换字符串中的文本
变量 原文本 = "我喜欢苹果,苹果很美味"
变量 新文本 = 子字节替换("苹果", "香蕉", 原文本)
输出 新文本  ' 输出: 我喜欢香蕉,香蕉很美味

函数:取文本长度(文本)

返回字符串的长度,若字符串为空则返回0。

' 获取字符串长度
变量 文本 = "Hello World"
变量 长度 = 取文本长度(文本)
输出 "文本长度: " + 长度  ' 输出: 文本长度: 11

变量 空文本 = ""
变量 空长度 = 取文本长度(空文本)
输出 "空文本长度: " + 空长度  ' 输出: 空文本长度: 0

函数:取子文本(待操作文本,开始位置,长度)

按字符长度截取子字符串,获取并返回指定位置的子字符串,注意:使用该函数需开启php的mbstring扩展。

' 取指定位置的子字符串
变量 原文本 = "Hello World"
变量 子文本 = 取子文本(原文本, 0, 5)
输出 子文本  ' 输出: Hello

函数:寻找文本(待搜索文本,待查找文本,开始位置)

查找字符串在另一字符串中第一次出现的位置(大小写不敏感);返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回“假”

' 查找文本在字符串中的位置
变量 主文本 = "Hello World"
变量 查找文本 = "world"
变量 位置 = 寻找文本(主文本, 查找文本, 0)
如果(位置 >= 0)
	输出 "找到了,位置: " + 位置
否则
	输出 "未找到"
结束 如果

函数:倒找文本(待搜索文本,待查找文本,开始位置)

从右向左查找字符串在另一字符串中最后一次出现的位置(对大小写不敏感);返回字符串在另一字符串中最后一次出现的位置,如果没有找到字符串则返回“假”

' 从右向左查找文本最后一次出现的位置
变量 主文本 = "apple banana apple"
变量 查找文本 = "apple"
变量 最后位置 = 倒找文本(主文本, 查找文本, 0)
如果(最后位置 >= 0)
	输出 "最后一次出现的位置: " + 最后位置
否则
	输出 "未找到"
结束 如果

学习要点

知识点代码示例说明
文本分割分割文本(",", 文本)对应 PHP explode;返回数组
数组转文本数组到文本(",", 数组)对应 PHP implode;不支持多维数组
删空白删首空 / 删尾空 / 删首尾空对应 ltrim/rtrim/trim
MD5加密取MD5("123456")对应 PHP md5();常用于密码哈希
大小写转换到大写(文本) / 到小写(文本)对应 strtoupper/strtolower
字节截取取字节子文本(文本, 0, 5)按字节截取;处理中文易乱码,建议改用 取子文本
字符截取取子文本(文本, 0, 5)按字符截取;基于 PHP mb_substr,支持中文
字节翻转翻转字节(文本)按字节翻转字符串;中文慎用
字节替换子字节替换(旧, 新, 文本)按字节替换;大小写不敏感
文本长度取文本长度(文本)对应 PHP strlen;空文本返回 0
查找位置寻找文本(主文本, 查找文本, 起始)基于 mb_strpos;大小写不敏感;找不到返回假
倒找位置倒找文本(主文本, 查找文本, 起始)基于 mb_strrpos;从右向左找最后一次出现
输出函数输出 值 / 输出数组(数组)后端输出到响应体;对应 PHP echo/print_r

相关文档

  • 文档服务端(PHP)函数_数组操作 —— 后端数组操作函数
  • 文档服务端(PHP)函数_编码操作 —— URL编解码、HTML转义等函数
  • 文档服务端(PHP)函数_核心库函数 —— JSON编码JSON解码 等核心函数
  • 文档服务端(PHP)函数_MYSQL操作 —— 数据库字符串字段读写
  • 文档服务端(PHP)函数_数学运算 —— 数值计算与随机数生成
  • 文档轻语言网站:变量与数组与对象的定义 —— 变量、对象、数组的基本语法

服务端(PHP)函数_数学运算

文档概述

轻语言网站**后端(PHP)**开发中的数学运算相关操作函数、用于执行数值计算和数学处理,包含绝对值、三角函数、对数运算、随机数生成、角度弧度转换、幂运算等数学功能,常用于数值计算、科学计算、数学公式处理等场景。

⚠️ 使用限制说明

  • 本文档内函数仅限在轻语言后端文件 .sph 代码中使用,用于编写服务端逻辑(编译后输出为 PHP 代码在服务器执行)。
  • 不得在编写前端页面 .spl 代码中使用,更禁止与 JS 代码混合使用
  • 编写前端请使用 前端(JavaScript)函数_* 类目下的中文函数;服务端只能使用 服务端(PHP)函数_* 类目下的中文函数。
  • 前后端虽存在同名函数(如 取绝对值取随机数取平方根),但底层实现与运行环境完全不同,严禁混用。

💡 PHP 原生英文函数使用说明

  • 轻语言后端支持直接调用 PHP 原生英文函数(如 print_r()max()min()floor()ceil() 等)。
  • 当遇到轻语言未封装中文函数、但 PHP 原生函数可用时,可直接使用原生英文函数。
  • 仅支持使用原生英文函数名严禁使用 PHP 原生语法格式和英文关键字(如 if(){}for(){}functionclassecho 等控制结构与语法关键字)。
  • 控制结构必须使用轻语言中文关键字:如果...否则...结束 如果变量循环...结束循环函数 ... 结束 函数 等。
  • 注:->(对象方法调用)、=>(数组键值分隔)为轻语言本身支持的语法符号,可正常使用。

PHP 数学相关特性:

  • 三角函数取正弦/取余弦/取反正弦/取余弦值 基于 PHP sin/cos/asin/acos,参数为弧度
  • 角度弧度互转角度到弧度/弧度到角度 对应 PHP deg2rad/rad2deg
  • 随机数取伪随机数 返回 (0,1) 浮点数,对应 PHP lcg_value()取随机数(最小, 最大) 返回区间内整数
  • 对数运算取自然对数 对应 PHP log(),底数默认为自然常数 e
  • 幂运算取次方(底数, 指数) 对应 PHP pow()
  • 平方根取平方根 对应 PHP sqrt()
  • 取余取余数(被除数, 除数) 对应 PHP fmod(),返回浮点数余数
  • 四舍五入四舍五入(数值, 位数) 对应 PHP round(),第二参数为保留小数位数

函数:取绝对值(数值)

取数值绝对值,参数支持整数,小数。

' 获取负数的绝对值
变量 负数 = -10
变量 绝对值 = 取绝对值(负数)
输出 "负数" + 负数 + "的绝对值是: " + 绝对值

' 获取正数的绝对值
变量 正数 = 5.5
变量 绝对值2 = 取绝对值(正数)
输出 "正数" + 正数 + "的绝对值是: " + 绝对值2

函数:取余弦值(数值)

获取指定数值反余弦值。

' 计算反余弦值
变量 数值 = 0.5
变量 反余弦值 = 取余弦值(数值)
输出 "数值" + 数值 + "的反余弦值是: " + 反余弦值

函数:取反正弦(数值)

获取指定数值的反正弦。

' 计算反正弦值
变量 数值 = 0.5
变量 反正弦值 = 取反正弦(数值)
输出 "数值" + 数值 + "的反正弦值是: " + 反正弦值

函数:取余弦(数值)

获取指定数的余弦值。

' 计算余弦值(注:参数为弧度,需先用 角度到弧度 转换)
变量 弧度 = 1.0472  ' 约等于π/3,即60度
变量 余弦值 = 取余弦(弧度)
输出 "弧度" + 弧度 + "的余弦值是: " + 余弦值

函数:角度到弧度(角度值)

将角度转换为弧度。

' 将角度转换为弧度
变量 角度 = 180
变量 弧度 = 角度到弧度(角度)
输出 角度 + "度等于" + 弧度 + "弧度"

函数:取余数(被除数,除数)

返回除法的浮点数余数。

' 计算浮点数除法的余数
变量 被除数 = 10.5
变量 除数 = 3.2
变量 余数 = 取余数(被除数, 除数)
输出 被除数 + "除以" + 除数 + "的余数是: " + 余数

函数:取伪随机数()

返回范围为 (0, 1) 的一个伪随机数。

' 生成一个0到1之间的伪随机数
变量 随机数 = 取伪随机数()
输出 "随机数: " + 随机数

函数:取自然对数(值)

获取指定数据的自然对数。

' 计算自然对数
变量 数值 = 2.71828  ' 自然常数e
变量 自然对数 = 取自然对数(数值)
输出 "数值" + 数值 + "的自然对数是: " + 自然对数

函数:取次方(X,Y)

返回 x 的 y 次方。

' 计算x的y次方
变量 底数 = 2
变量 指数 = 3
变量 次方 = 取次方(底数, 指数)
输出 底数 + "的" + 指数 + "次方是: " + 次方

函数:弧度到角度(弧度值)

把弧度数转换为角度数。

' 将弧度转换为角度
变量 弧度 = 3.14159  ' π弧度
变量 角度 = 弧度到角度(弧度)
输出 弧度 + "弧度等于" + 角度 + "度"

函数:取随机数(最小值,最大值)

返回指定区间的随机整数。

' 生成指定区间内的随机整数
变量 最小值 = 1
变量 最大值 = 100
变量 随机整数 = 取随机数(最小值, 最大值)
输出 "1到100之间的随机整数: " + 随机整数

函数:四舍五入(待舍入数值,保留位数)

对浮点数进行四舍五入。

' 对浮点数进行四舍五入
变量 原数 = 3.14159
变量 保留两位 = 四舍五入(原数, 2)
输出 "原数: " + 原数 + ",保留两位小数: " + 保留两位

变量 保留整数 = 四舍五入(原数, 0)
输出 "原数: " + 原数 + ",四舍五入到整数: " + 保留整数

函数:取正弦(值)

获取指定数据的正弦值。

' 计算正弦值(注:参数为弧度,需先用 角度到弧度 转换)
变量 弧度 = 1.5708  ' 约等于π/2,即90度
变量 正弦值 = 取正弦(弧度)
输出 "弧度" + 弧度 + "的正弦值是: " + 正弦值

函数:取平方根(值)

获取指定数据的平方根。

' 计算平方根
变量 数值 = 16
变量 平方根 = 取平方根(数值)
输出 "数值" + 数值 + "的平方根是: " + 平方根

学习要点

知识点代码示例说明
绝对值取绝对值(-10)对应 PHP abs();支持整数和小数
三角函数取正弦(弧度) / 取余弦(弧度)对应 PHP sin/cos;参数为弧度,角度需先用 角度到弧度 转换
反三角函数取反正弦(0.5) / 取余弦值(0.5)对应 PHP asin/acos;返回弧度值
角度弧度互转角度到弧度(180) / 弧度到角度(3.14)对应 PHP deg2rad/rad2deg;互为反向操作
随机数取伪随机数() / 取随机数(1, 100)浮点 (0,1) 与区间整数;对应 lcg_value/rand
对数运算取自然对数(2.71828)对应 PHP log();底数默认为 e
幂运算取次方(2, 3)对应 PHP pow();2的3次方=8
平方根取平方根(16)对应 PHP sqrt();结果为 4
取余数取余数(10.5, 3.2)对应 PHP fmod();返回浮点余数
四舍五入四舍五入(3.14159, 2)对应 PHP round();第二参数为保留小数位数
输出函数输出 值后端输出到响应体;对应 PHP echo

相关文档

  • 文档服务端(PHP)函数_字符串操作 —— 后端字符串处理函数
  • 文档服务端(PHP)函数_数组操作 —— 后端数组操作函数
  • 文档服务端(PHP)函数_时间操作 —— 时间戳计算与日期数学运算
  • 文档服务端(PHP)函数_核心库函数 —— 格式化内容 等核心函数
  • 文档服务端(PHP)函数_MYSQL操作 —— 数据库数值字段计算
  • 文档轻语言网站:变量与数组与对象的定义 —— 变量声明与基础语法

服务端(PHP)函数_数组操作

文档概述

轻语言网站**后端(PHP)**开发中的数组操作相关函数、用于处理数组的创建、修改、查询和转换,包含数组创建、合并、添加、查找、删除、排序等数组操作功能,常用于数据处理、列表管理、批量操作等场景。

⚠️ 使用限制说明

  • 本文档内函数仅限在轻语言后端文件 .sph 代码中使用,用于编写服务端逻辑(编译后输出为 PHP 代码在服务器执行)。
  • 不得在编写前端页面 .spl 代码中使用,更禁止与 JS 代码混合使用
  • 编写前端请使用 前端(JavaScript)函数_* 类目下的中文函数;服务端只能使用 服务端(PHP)函数_* 类目下的中文函数。
  • 前后端虽存在同名函数(如 创建数组取数组成员数),但底层实现与运行环境完全不同,严禁混用。

💡 PHP 原生英文函数使用说明

  • 轻语言后端支持直接调用 PHP 原生英文函数(如 print_r()count()array_keys()in_array() 等)。
  • 当遇到轻语言未封装中文函数、但 PHP 原生函数可用时,可直接使用原生英文函数。
  • 仅支持使用原生英文函数名严禁使用 PHP 原生语法格式和英文关键字(如 if(){}for(){}functionclassecho 等控制结构与语法关键字)。
  • 控制结构必须使用轻语言中文关键字:如果...否则...结束 如果变量循环...结束循环函数 ... 结束 函数 等。
  • 注:->(对象方法调用)、=>(数组键值分隔)为轻语言本身支持的语法符号,可正常使用。

PHP 数组相关特性:

  • 有序映射:PHP 数组是有序映射(ordered map),既可作索引数组(数字键)也可作关联数组(字符串键),统一为数组类型
  • 输出函数:后端使用 输出 / 输出数组 进行结果输出,对应 PHP 的 echo / print_r
  • 短数组语法:支持 [键=>值, 键=>值] 创建关联数组,等价于 PHP 的短语法
  • 弱类型比较:PHP 默认弱类型比较,如 0 == "abc" 为真,使用 取成员是否存在 等函数需注意类型陷阱

函数:创建数组(...值)

创建一个数组;参数值可以为空。

' 创建空数组
变量 空数组 = 创建数组()
输出 "空数组成员数: " + 取数组成员数(空数组)

' 创建带初始值的索引数组
变量 水果数组 = 创建数组("苹果", "香蕉", "橙子")
输出数组(水果数组)
' 注:PHP 数组支持直接用 [索引] 访问,等价于 PHP 的 $arr[0]
输出 "水果数组的第1个成员是: " + 水果数组[0]

' 创建关联数组(PHP特色:字符串键名)
变量 学生数组 = 创建数组()
学生数组["学号"] = "1001"
学生数组["姓名"] = "张三"
学生数组["性别"] = "男"
输出数组(学生数组)

' 创建多维数组(嵌套关联数组)
变量 学生信息 = 创建数组()
学生信息["1001"] = 创建数组("张三", "男", 18)
输出数组(学生信息)

' 使用短数组语法创建关联数组(等价于 PHP 的 ["键"=>值] 语法)
变量 学生 = ["学号"=> 1, "姓名"=> "张三", "性别"=> "男"]
输出数组(学生)

函数:合并数组(...数组对象)

把一个或多个数组合并为一个数组。

' 合并两个索引数组
变量 数组1 = 创建数组("苹果", "香蕉")
变量 数组2 = 创建数组("橙子", "葡萄")
变量 合并结果 = 合并数组(数组1, 数组2)
输出数组(合并结果)

' 合并关联数组(注:PHP中相同字符串键会被覆盖,数字键会被重新索引)
变量 配置1 = ["主机"=> "localhost", "端口"=> 3306]
变量 配置2 = ["用户名"=> "root", "端口"=> 3307]
变量 合并配置 = 合并数组(配置1, 配置2)
输出数组(合并配置)  ' 端口为3307(后者覆盖前者)

函数:添加成员(数组对象,...数组值)

将一个或多个元素插入数组的末尾(入栈)、返回新数组的元素个数。

' 向数组末尾添加元素
变量 水果数组 = 创建数组("苹果", "香蕉")
变量 新数量 = 添加成员(水果数组, "橙子", "葡萄")
输出数组(水果数组)
输出 "数组现在的成员数: " + 新数量

' 向关联数组添加成员(注:添加成员对关联数组追加数字键成员)
变量 学生 = ["姓名"=> "张三"]
添加成员(学生, "男", 18)
输出数组(学生)  ' 姓名为张三,0=>男,1=>18

函数:取数组成员数(数组对象)

返回数组中元素的数量。

' 获取索引数组元素数量
变量 水果数组 = 创建数组("苹果", "香蕉", "橙子", "葡萄")
变量 成员数 = 取数组成员数(水果数组)
输出 "水果数组共有" + 成员数 + "个元素"

' 获取关联数组元素数量(PHP特色:关联数组同样可统计)
变量 学生信息 = ["姓名"=> "李四", "年龄"=> 22, "专业"=> "计算机"]
变量 信息项数 = 取数组成员数(学生信息)
输出 "学生信息共有" + 信息项数 + "项"

' 获取多维数组的顶层成员数(注:不递归统计子数组)
变量 班级 = [
	"1001"=> ["张三", "男"],
	"1002"=> ["李四", "女"]
]
输出 "班级人数: " + 取数组成员数(班级)  ' 2

函数:取成员是否存在(成员值,数组对象)

查询某个成员值是否在数组中存在、如果存在返回真;否则返回假。

' 检查索引数组中是否存在特定值
变量 水果数组 = 创建数组("苹果", "香蕉", "橙子")
变量 是否包含苹果 = 取成员是否存在("苹果", 水果数组)
输出 "是否包含苹果: " + 是否包含苹果

变量 是否包含西瓜 = 取成员是否存在("西瓜", 水果数组)
输出 "是否包含西瓜: " + 是否包含西瓜

' 检查关联数组中的值(注:PHP 默认弱类型比较,0=="abc" 为真,需注意)
变量 配置 = ["状态"=> "active", "等级"=> 0]
变量 是否启用 = 取成员是否存在("active", 配置)
输出 "是否启用: " + 是否启用  ' 真

函数:查找成员(成员值,数组)

搜索数组中给定的值并返回键名;如果在数组中找到指定的键值,则返回对应的键名,否则返回假。

' 在关联数组中查找值并返回键名(PHP特色:返回字符串键名)
变量 学生数组 = ["姓名"=> "张三", "年龄"=> 20, "成绩"=> 95]
变量 键名 = 查找成员("张三", 学生数组)
如果(键名)
	输出 "找到值'张三',键名为: " + 键名  ' 姓名
否则
	输出 "未找到值'张三'"
结束 如果

' 在索引数组中查找值返回数字键名
变量 水果 = 创建数组("苹果", "香蕉", "橙子")
变量 索引 = 查找成员("香蕉", 水果)
如果(索引 != 假)
	输出 "香蕉的索引是: " + 索引  ' 1
结束 如果

学习要点

知识点代码示例说明
PHP数组本质["学号"=> 1, "姓名"=> "张三"]有序映射,索引数组与关联数组统一为数组类型
关联数组创建数组["键"] = 值 / [键=>值]PHP特色,用数组承载键值对,字符串键名
短数组语法[键=>值, 键=>值]等价 PHP [... ] 短语法;注意用 => 而非 :
输出函数输出 值 / 输出数组(数组)后端输出到响应体;对应 PHP echo/print_r
数组访问数组[0] / 数组["键名"]索引和键名都用方括号访问,统一为数组语法
合并覆盖规则合并数组(数组1, 数组2)关联数组相同字符串键后者覆盖前者;数字键重新索引
成员数统计取数组成员数(数组)索引/关联数组均适用;多维数组默认只统计顶层,不递归
查找返回值查找成员(值, 数组)关联数组返回字符串键名;索引数组返回数字键名;未找到返回
弱类型比较取成员是否存在(0, ["abc"])PHP 默认弱类型,0=="abc" 为真;需注意类型陷阱

相关文档

  • 文档服务端(PHP)函数_字符串操作 —— 后端字符串处理函数
  • 文档服务端(PHP)函数_数据操作类 —— 后端数据操作函数
  • 文档服务端(PHP)函数_数学运算 —— 后端数学运算函数
  • 文档轻语言网站:变量与数组与对象的定义 —— 变量、对象、数组的基本语法

服务端(PHP)函数_文件操作

文档概述

轻语言网站**后端(PHP)**开发中的文件操作相关函数、用于处理文件和路径操作,包含文件名获取、路径解析、文件读写、文件上传、目录操作、磁盘信息、文件权限、符号连接等功能,常用于文件处理、数据存储、路径管理等场景。

⚠️ 使用限制说明

  • 本文档内函数仅限在轻语言后端文件 .sph 代码中使用,用于编写服务端逻辑(编译后输出为 PHP 代码在服务器执行)。
  • 不得在编写前端页面 .spl 代码中使用,更禁止与 JS 代码混合使用
  • 编写前端请使用 前端(JavaScript)函数_* 类目下的中文函数;服务端只能使用 服务端(PHP)函数_* 类目下的中文函数。
  • 前后端虽存在同名函数(如 取文件大小取文件是否存在),但底层实现与运行环境完全不同,严禁混用。

💡 PHP 原生英文函数使用说明

  • 轻语言后端支持直接调用 PHP 原生英文函数(如 print_r()file_get_contents()glob()realpath() 等)。
  • 当遇到轻语言未封装中文函数、但 PHP 原生函数可用时,可直接使用原生英文函数。
  • 仅支持使用原生英文函数名严禁使用 PHP 原生语法格式和英文关键字(如 if(){}for(){}functionclassecho 等控制结构与语法关键字)。
  • 控制结构必须使用轻语言中文关键字:如果...否则...结束 如果变量循环...结束循环函数 ... 结束 函数 等。
  • 注:->(对象方法调用)、=>(数组键值分隔)为轻语言本身支持的语法符号,可正常使用。

PHP 文件相关特性:

  • 文件路径:基于服务器文件系统,路径用 / 分隔(Linux)或 \(Windows);前端 JS 路径基于 URL
  • 打开类型打开文件 的第二个参数支持 r/r+/w/w+/a/a+/x/x+,对应 PHP fopen() 模式
  • 文件句柄打开文件 返回文件句柄,后续 读数据/写数据/取一行/关闭文件 均基于句柄操作
  • CSV 操作取CSV一行 / 写数据到CSV 专用 CSV 文件读写
  • 权限创建目录 默认权限 0777;取文件权限 返回权限数字
  • 文件类型取文件类型 返回 7 种类型(fifo、char、dir、block、link、file、unknown)
  • 上传文件移动上传文件 配合 取上传文件临时路径 保存前端上传的文件
  • 符号连接创建符号连接 / 创建硬连接 / 取符号连接目标,硬连接不支持 Windows

函数:取文件名(文件路径)

根据指定文件路径返回路径中的文件名部分(含扩展名后缀)。

' 获取文件名
变量 文件路径 = "D:/test/test.txt"
变量 文件名 = 取文件名(文件路径)
输出 "文件名: " + 文件名

函数:取文件扩展名(文件路径)

返回路径中的文件扩展名部分。

' 获取文件扩展名
变量 文件路径 = "D:/test/test.txt"
变量 文件扩展名 = 取文件扩展名(文件路径)
输出 "文件扩展名: " + 文件扩展名

函数:复制文件(待复制文件,目标文件)

复制指定文件到目标文件;成功返回真;失败返回假。

' 复制文件
变量 待复制文件 = "D:/test/test.txt"
变量 目标文件 = "D:/test/test_copy.txt"
变量 是否成功 = 复制文件(待复制文件, 目标文件)
如果(是否成功)
	输出 "复制文件成功"
否则
	输出 "复制文件失败"
结束 如果

函数:移动上传文件(待移动文件地址,目标文件路径)

移动上传的文件到指定新路径,移动成功返回真、失败返回假。

' 移动上传文件
变量 待移动文件 = "D:/test/upload/test.txt"
变量 目标文件 = "D:/test/test.txt"
变量 是否成功 = 移动上传文件(待移动文件, 目标文件)
如果(是否成功)
	输出 "移动文件成功"
否则
	输出 "移动文件失败"
结束 如果

函数:取文件目录(文件路径)

返回路径中的目录名称部分。

' 获取文件所在目录
变量 文件路径 = "D:/test/test.txt"
变量 文件所在目录 = 取文件目录(文件路径)
输出 "文件所在目录: " + 文件所在目录

函数:取文件大小(文件路径)

返回指定文件的大小,单位为字节。

' 获取文件大小
变量 文件路径 = "D:/test/test.txt"
变量 文件大小 = 取文件大小(文件路径)
输出 "文件大小: " + 文件大小 + "字节"

函数:取文件最后修改时间(文件路径)

返回指定文件的最后修改时间。

' 获取文件最后修改时间
变量 文件路径 = "D:/test/test.txt"
变量 文件最后修改时间 = 取文件最后修改时间(文件路径)
输出 "文件最后修改时间: " + 文件最后修改时间

函数:取文件访问时间(文件路径)

返回指定文件的最后访问时间。

' 获取文件最后访问时间
变量 文件路径 = "D:/test/test.txt"
变量 文件最后访问时间 = 取文件访问时间(文件路径)
输出 "文件最后访问时间: " + 文件最后访问时间

函数:取文件创建时间(文件路径)

返回指定文件的创建时间。

' 获取文件创建时间
变量 文件路径 = "D:/test/test.txt"
变量 文件创建时间 = 取文件创建时间(文件路径)
输出 "文件创建时间: " + 文件创建时间

函数:读文件内容(文件路径)

获取指定地址的内容,参数除了支持普通路径外,还支持网络文件直链地址。

' 获取文件内容
变量 文件路径 = "D:/test/test.txt"
变量 文件内容 = 读文件内容(文件路径)
输出 "文件内容: " + 文件内容

函数:写文本到文件(文件路径,待写出内容)

将字符串写入文件。返回写入到文件内数据的字节数。如果文件不存在将会自动创建。

' 写文本到文件
变量 文件路径 = "D:/test/test.txt"
变量 待写出内容 = "Hello World!"
变量 写入的字节数 = 写文本到文件(文件路径, 待写出内容)
输出 "写入的字节数: " + 写入的字节数

函数:取目录剩余尺寸(目录路径)

返回目录中的可用空间的尺寸;单位为字节。

' 获取目录剩余空间
变量 目录路径 = "D:/test"
变量 目录剩余空间 = 取目录剩余尺寸(目录路径)
输出 "目录剩余空间: " + 目录剩余空间 + "字节"

函数:取磁盘总容量(目录路径)

返回存放指定目录的磁盘总容量。单位为字节。

' 获取磁盘总容量
变量 目录路径 = "D:/test"
变量 磁盘总容量 = 取磁盘总容量(目录路径)
输出 "磁盘总容量: " + 磁盘总容量 + "字节"

函数:取目录列表(目录路径)

返回目录中的文件列表。

' 获取目录列表
变量 目录路径 = "D:/test"
变量 目录列表 = 取目录列表(目录路径)
输出 "目录列表: " + 目录列表

函数:打开文件(文件路径,打开类型)

打开一个文件或 URL。参数二的取值为:"r"只读方式打开,将文件指针指向文件头。"r+"读写方式打开,将文件指针指向文件头。"w"写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。"w+"读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。"a"写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。"a+"读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。"x"创建并以写入方式打开,将文件指针指向文件头。"x+"创建并以读写方式打开,将文件指针指向文件头。

' 打开文件
变量 文件路径 = "D:/test/test.txt"
变量 打开类型 = "r"
变量 文件句柄 = 打开文件(文件路径, 打开类型)
输出 "文件句柄: " + 文件句柄

函数:关闭文件(文件句柄)

关闭打开的文件。关闭成功返回真;否则返回假。

' 关闭文件
变量 文件句柄 = 打开文件("D:/test/test.txt", "r")
变量 关闭成功 = 关闭文件(文件句柄)
输出 "关闭成功: " + 关闭成功

函数:取文件字符(文件句柄)

从打开的文件中获取一个字符。

' 获取文件字符
变量 文件句柄 = 打开文件("D:/test/test.txt", "r")
变量 文件字符 = 取文件字符(文件句柄)
输出 "文件字符: " + 文件字符

函数:取一行(文件句柄,长度)

从打开的文件中获取一行内容。参数二指定行最大长度;默认为1k可以省略。

' 获取一行
变量 文件句柄 = 打开文件("D:/test/test.txt", "r")
变量 一行内容 = 取一行(文件句柄)
输出 "一行内容: " + 一行内容

函数:取CSV一行(文件句柄)

从打开的csv文件中获取一行。

' 获取CSV一行
变量 文件句柄 = 打开文件("D:/test/test.csv", "r")
变量 一行内容 = 取CSV一行(文件句柄)
输出 "一行内容: " + 一行内容

函数:取文件是否存在(文件路径)

检查文件或目录是否存在。

' 检查文件是否存在
变量 文件路径 = "D:/test/test.txt"
变量 文件是否存在 = 取文件是否存在(文件路径)
输出 "文件是否存在: " + 文件是否存在

函数:取文件类型(文件路径)

返回文件类型;返回值一共有7种类型:fifo、char、dir、block、link、file、unknown

' 取文件类型
变量 文件路径 = "D:/test/test.txt"
变量 文件类型 = 取文件类型(文件路径)
输出 "文件类型: " + 文件类型

函数:清除文件状态缓存()

当我们操作执行文件相关的操作时;系统为了提供更高的性能所以会缓存很多的文件操作。在结束文件操作的时候可以使用该函数来清除文件状态缓存。

函数:取一行_过滤标记(文件句柄,长度,保留标记)

从打开的文件中读取一行并过滤掉 HTML 和 PHP 标记。参数二指定行的最大长度;默认为1k可以省略;参数三指定不需要过滤的标记。可以省略。

函数:读文件到数组(文件路径)

把文件读入一个数组中。数组中每个元素表示一行内容。如果读取失败返回假。

函数:取文件指针结束位置(文件句柄)

获取文件指针是否到了文件结束的位置。如果文件指针到了 EOF 或者出错时则返回 TRUE,否则返回一个错误(包括 socket 超时),其它情况则返回 FALSE。

函数:取文件组ID(文件路径)

返回文件的组 ID。如果失败返回假

函数:取文件INODE(文件路径)

返回文件的 inode 编号;如果失败返回假。

函数:取文件所属用户(文件路径)

获取文件的 user ID (所有者);如果失败返回假。

函数:取文件权限(文件路径)

返回文件的权限;如果失败返回假。

函数:锁定文件(文件句柄,锁定类型,阻挡其它进程)

锁定文件。参数二取值为:1取得共享锁定(读取的程序)、2取得独占锁定(写入的程序)、3释放锁定(无论共享或独占)、4如果不希望 flock() 在锁定时堵塞

函数:匹配文件(文本模板,字符串)

根据指定的模式来匹配文件名或字符串。

函数:读数据(文件句柄)

从打开的文件中读数据,输出文件指针处的所有剩余数据。

函数:写数据到CSV(文件路径,数据数组)

将行格式化为 CSV 并写入一个打开的文件中。参数二必须为一个逗号分隔的数组

函数:读取已打开文件(文件句柄,长度)

读取已打开的文件;参数二为读取的长度;为必须参数。成功返回读取的数据;失败返回假。

函数:取文件信息(文件句柄)

返回关于一个已经打开的文件的信息。

函数:取文件指针位置(文件句柄)

返回文件指针的读/写位置

函数:裁剪文件(文件句柄,新尺寸)

将文件截断到指定的长度(尺寸)。成功返回真;失败返回假。

函数:写数据到文件(文件句柄,文本内容,长度)

写入数据到已经打开的文件中。写入成功返回写入的字符数;失败返回假。参数三:要写入的最大字节数;可以省略。

函数:取匹配文件(匹配格式)

返回一个包含匹配指定模式的文件名目录的数组。如果失败则返回假。

函数:为目录(文件路径)

获取指定指定的文件名是否是一个目录。如果是返回真;否则返回假。

函数:可被执行(文件路径)

判断文件是否可执行。如果是一个可执行文件则返回真;否则返回假。

函数:为常规文件(文件路径)

判断指定文件是否为常规的文件;如果是则返回真;否则返回假。

函数:为连接(文件路径)

判断指定的文件是否是连接。如果是则返回真;否则返回假。

函数:文件可被读(文件路径)

判断文件是否可读。如果是则返回真;否则返回假。

函数:为POST上传(文件路径)

判断文件是否是通过 HTTP POST 上传的;如果是则返回真;否则返回假。

函数:文件可写(文件路径)

判断文件是否可写;如果是则返回真;否则返回假。

函数:创建硬连接(目标,链接)

创建一个硬连接;注意:该函数不能用于远程文件、并且不能用于在Windows的系统中。成功返回真;否则返回假。

函数:取硬连接信息(路径)

获取一个硬连接的信息;如果失败则返回假;注意:该函数不能用于Windows平台中。

函数:取文件连接信息(文件路径)

返回关于文件或符号连接的信息;如果失败则返回假。

函数:创建目录(路径,权限)

根据指定路径创建一个目录;参数二默认为0777最高权限。

函数:解析配置文件(文件路径)

解析一个配置文件,并以数组的形式返回其中的设置。如果失败返回假。

函数:取文件路径信息(文件路径)

返回关于文件目录和路径的信息。

函数:关闭进程(进程句柄)

关闭由 popen() 打开的进程。成功返回真;失败返回假。

函数:打开进程(命令,模式)

打开一个进程;参数二取值为:"r"只读模式、"w"写入模式。执行成功返回真;否则返回假。

函数:读取文件(文件路径)

读入一个文件并写入到输出缓冲。若成功,则返回从文件中读入的字节数。若失败,则返回 false

函数:取符号连接目标(连接路径)

返回符号连接的目标。

函数:取绝对路径(文件名称)

返回文件的绝对路径名。如果失败则返回假。

函数:重命名文件(旧名称,新名称)

重名名文件或目录;成功返回真;失败返回假。

函数:重置文件指针位置(文件句柄)

重新设置文件指针的位置到文件的开头。成功返回真;失败返回假。

函数:删除空目录(目录路径)

删除空的目录。成功返回真;失败返回假。

函数:删除文件(文件路径)

删除文件。成功返回真;失败返回假。

函数:置打开文件缓存大小(文件句柄,缓存值)

设置已打开文件的缓冲大小。参数二单位为字节。成功返回0;失败返回EOF。

函数:取文件信息数组(文件句柄)

返回已经打开的文件信息数组。

函数:创建符号连接(目标,链接)

创建符号连接。成功返回真;失败返回假。

函数:创建唯一临时文件(目录,文件名开头)

创建唯一的临时文件,成功返回临时文件名;失败返回假。

函数:创建临时文件(目录,文件名开头)

建立临时文件,成功返回文件句柄;失败返回假。

函数:置文件最后修改时间(文件名称,修改时间,访问时间)

设置文件的访问和修改时间。成功返回真;失败返回假。

学习要点

知识点代码示例说明
文件名/扩展名取文件名(路径) / 取文件扩展名(路径)基于 PHP basename/pathinfo;路径解析常用
文件读写读文件内容(路径) / 写文本到文件(路径, 内容)简单读写;写文件不存在自动创建
文件句柄操作打开文件取一行/读数据/写数据关闭文件对应 PHP fopen/fgets/fread/fwrite/fclose
打开类型"r"/"w"/"a"/"r+"/"w+"/"a+"/"x"/"x+"对应 PHP fopen 模式;r只读、w写入截零、a追加、x创建
CSV 文件取CSV一行(句柄) / 写数据到CSV(路径, 数组)专用 CSV 读写;对应 PHP fgetcsv/fputcsv
文件信息取文件大小 / 取文件类型 / 取文件权限 / 取文件所属用户对应 PHP filesize/filetype/fileperms/fileowner
时间戳信息取文件创建时间 / 取文件访问时间 / 取文件最后修改时间对应 PHP filectime/fileatime/filemtime
文件判断取文件是否存在 / 为目录 / 为常规文件 / 文件可被读 / 文件可写对应 PHP file_exists/is_dir/is_file/is_readable/is_writable
目录操作取目录列表 / 创建目录 / 删除空目录对应 PHP scandir/mkdir/rmdir
磁盘空间取目录剩余尺寸 / 取磁盘总容量对应 PHP disk_free_space/disk_total_space
上传文件移动上传文件(临时路径, 目标路径)对应 PHP move_uploaded_file;配合 取上传文件临时路径 使用
文件复制/重命名/删除复制文件 / 重命名文件 / 删除文件对应 PHP copy/rename/unlink
符号连接创建符号连接 / 创建硬连接 / 取符号连接目标对应 PHP symlink/link/readlink;硬连接不支持 Windows
文件锁定锁定文件(句柄, 类型)对应 PHP flock;1共享锁、2独占锁、3释放、4非堵塞
进程操作打开进程(命令, 模式) / 关闭进程(句柄)对应 PHP popen/pclose;执行系统命令
临时文件创建临时文件 / 创建唯一临时文件对应 PHP tmpfile/tempnam
配置文件解析配置文件(路径)对应 PHP parse_ini_file;返回配置数组

相关文档

  • 文档服务端(PHP)函数_字符串操作 —— 后端字符串处理函数
  • 文档服务端(PHP)函数_数组操作 —— 后端数组操作函数
  • 文档服务端(PHP)函数_核心库函数 —— 取上传文件取上传文件临时路径 等文件上传相关
  • 文档服务端(PHP)函数_MYSQL操作 —— 数据库二进制字段读写
  • 文档服务端(PHP)函数_时间操作 —— 文件时间戳相关函数
  • 文档轻语言网站:变量与数组与对象的定义 —— 变量、对象、数组的基本语法

服务端(PHP)函数_时间操作

文档概述

轻语言网站**后端(PHP)**开发中的时间操作相关函数、用于处理时间和日期数据,包含时间戳操作、时间对象创建、时间格式化、时间差计算、日期时间设置等功能,常用于时间显示、日期计算、时间格式化等场景。

⚠️ 使用限制说明

  • 本文档内函数仅限在轻语言后端文件 .sph 代码中使用,用于编写服务端逻辑(编译后输出为 PHP 代码在服务器执行)。
  • 不得在编写前端页面 .spl 代码中使用,更禁止与 JS 代码混合使用
  • 编写前端请使用 前端(JavaScript)函数_* 类目下的中文函数;服务端只能使用 服务端(PHP)函数_* 类目下的中文函数。
  • 前后端虽存在同名函数(如 创建时间对象取时间差格式化时间),但底层实现与运行环境完全不同,严禁混用。

💡 PHP 原生英文函数使用说明

  • 轻语言后端支持直接调用 PHP 原生英文函数(如 print_r()date()mktime()checkdate() 等)。
  • 当遇到轻语言未封装中文函数、但 PHP 原生函数可用时,可直接使用原生英文函数。
  • 仅支持使用原生英文函数名严禁使用 PHP 原生语法格式和英文关键字(如 if(){}for(){}functionclassecho 等控制结构与语法关键字)。
  • 控制结构必须使用轻语言中文关键字:如果...否则...结束 如果变量循环...结束循环函数 ... 结束 函数 等。
  • 注:->(对象方法调用,如 时间对象->format())、=>(数组键值分隔)为轻语言本身支持的语法符号,可正常使用。

PHP 时间相关特性:

  • 时间戳取现行时间戳 返回当前10位Unix时间戳(秒级),对应 PHP time()
  • 时间对象创建时间对象 基于 PHP DateTime 类;通过 对象->format()/对象->getTimestamp() 调用方法
  • 格式化模板格式化时间 基于 PHP date(),模板字符如 Y-m-d H:i:sY年m月d日
  • 相对时间到时间戳 支持英文相对描述("+1 day"、"-1 week"),基于 PHP strtotime()
  • 时区:后端默认服务器时区;可通过 置响应头 或 PHP 配置调整
  • 方法调用语法:时间对象方法用 -> 调用(PHP 风格);前端 JS 用 . 调用

函数:取现行时间戳()

返回当前10位时间戳。

' 获取当前时间戳
变量 当前时间戳 = 取现行时间戳()
输出 "当前时间戳: " + 当前时间戳

' 显示时间戳格式的时间
变量 格式化 = 格式化时间("Y-m-d H:i:s", 当前时间戳)
输出 "当前时间: " + 格式化

函数:创建时间对象(文本时间)

根据指定的文本时间内容创建一个新的时间对象"DateTime ";如果参数设置为空、则默认使用当前时间创建。

' 创建指定日期的时间对象
变量 特定时间 = 创建时间对象("2023-12-25")
' 注:->format() 为 PHP DateTime 类的方法调用,轻语言支持直接使用
输出 "特定时间: " + 特定时间->format("Y-m-d")

' 创建当前时间的时间对象
变量 当前时间 = 创建时间对象()
输出 "当前时间: " + 当前时间->format("Y-m-d H:i:s")

' 获取创建的时间对象的时间戳
变量 时间戳 = 当前时间->getTimestamp()
输出 "时间戳: " + 时间戳

函数:置日期(时间对象,年,月,日)

修改指定时间对象为一个新的日期。

' 创建一个时间对象并修改日期
变量 时间对象 = 创建时间对象("2022-01-01")
置日期(时间对象, 2023, 6, 15)
' 注:->format() 为 PHP DateTime 类方法
变量 修改后时间 = 时间对象->format("Y-m-d H:i:s")
输出 "修改后的日期: " + 修改后时间

函数:置时间(时间对象,时,分,秒)

将指定的时间对象;重新设置为指定的时间时分秒。

' 创建一个时间对象并修改时间
变量 时间对象 = 创建时间对象("2023-01-01 00:00:00")
置时间(时间对象, 14, 30, 45)
变量 修改后时间 = 时间对象->format("Y-m-d H:i:s")
输出 "修改后时间: " + 修改后时间

函数:取时间差(时间对象一,时间对象二)

返回两个日期间的差值;单位:天。

' 计算两个日期之间的天数差
变量 日期1 = 创建时间对象("2023-01-01")
变量 日期2 = 创建时间对象("2023-01-10")
变量 天数差 = 取时间差(日期2, 日期1)
输出 "两个日期相差: " + 天数差 + "天"

函数:格式化时间(模板,时间戳)

将指定的时间戳格式化为指定模板的时间。

' 格式化时间戳为不同格式(注:模板字符基于 PHP date() 函数)
变量 当前时间戳 = 取现行时间戳()
' 格式化为完整日期时间
变量 完整时间 = 格式化时间("Y-m-d H:i:s", 当前时间戳)
输出 "完整时间: " + 完整时间
' 格式化为日期
变量 仅日期 = 格式化时间("Y年m月d日", 当前时间戳)
输出 "仅日期: " + 仅日期
' 格式化为时间
变量 仅时间 = 格式化时间("H:i:s", 当前时间戳)
输出 "仅时间: " + 仅时间

函数:取时间戳数组(时间戳)

返回指定时间戳的数组时间信息。

' 获取时间戳的详细信息数组(注:基于 PHP getdate() 返回关联数组)
变量 当前时间戳 = 取现行时间戳()
变量 时间数组 = 取时间戳数组(当前时间戳)
输出数组(时间数组)
' 提取数组中的年月日信息
变量 年份 = 时间数组["year"]
变量 月份 = 时间数组["mon"]
变量 日期 = 时间数组["mday"]
输出 "今天是" + 年份 + "年" + 月份 + "月" + 日期 + "日"

函数:到时间戳(文本时间)

将任何英文文本的日期或时间描述解析为 Unix 时间戳。

' 将文本时间转换为时间戳(注:基于 PHP strtotime(),支持英文相对描述)
变量 文本时间 = "2023-12-25 15:30:00"
变量 时间戳 = 到时间戳(文本时间)
输出 "文本时间: " + 文本时间
输出 "对应时间戳: " + 时间戳
输出 "格式化回来: " + 格式化时间("Y-m-d H:i:s", 时间戳)

' 使用相对时间描述(PHP特色:strtotime 支持英文相对描述)
变量 相对时间戳 = 到时间戳("+1 day")  ' 一天后
输出 "一天后: " + 格式化时间("Y-m-d H:i:s", 相对时间戳)
变量 一周前时间戳 = 到时间戳("-1 week")  ' 一周前
输出 "一周前: " + 格式化时间("Y-m-d H:i:s", 一周前时间戳)

学习要点

知识点代码示例说明
当前时间戳取现行时间戳()10位Unix时间戳(秒级);对应 PHP time()
时间对象创建创建时间对象("2023-12-25")基于 PHP DateTime 类;空参数为当前时间
对象方法调用对象->format("Y-m-d")PHP风格 -> 调用;format() 格式化、getTimestamp() 取戳
日期修改置日期(对象, 年, 月, 日)修改时间对象的日期部分;原对象被修改
时间修改置时间(对象, 时, 分, 秒)修改时间对象的时分秒部分
时间差计算取时间差(对象A, 对象B)返回 A-B 天数差;单位为天
格式化模板"Y-m-d H:i:s" / "Y年m月d日"基于 PHP date();Y年、m月、d日、H时、i分、s秒
时间戳数组取时间戳数组(戳)["year"]基于 PHP getdate();返回关联数组含 year/mon/mday 等
文本转时间戳到时间戳("2023-12-25 15:30:00")基于 PHP strtotime();支持标准格式与英文相对描述
相对时间描述到时间戳("+1 day") / 到时间戳("-1 week")PHP特色:strtotime 解析 "+1 day"、"-1 week"、"+1 month"
输出函数输出 值 / 输出数组(数组)后端输出到响应体;对应 PHP echo/print_r

相关文档

  • 文档服务端(PHP)函数_字符串操作 —— 后端字符串处理函数
  • 文档服务端(PHP)函数_数组操作 —— 后端数组操作函数
  • 文档服务端(PHP)函数_核心库函数 —— 格式化内容置全局变量 等核心函数
  • 文档服务端(PHP)函数_文件操作 —— 文件读写、日志记录
  • 文档服务端(PHP)函数_MYSQL操作 —— 数据库时间字段读写
  • 文档轻语言网站:变量与数组与对象的定义 —— 变量、对象、数组的基本语法

服务端(PHP)函数_核心库函数

文档概述

轻语言网站**后端(PHP)**开发中的核心库内置函数、用于处理HTTP请求、响应、服务器信息、JSON数据等核心功能,包含请求处理、响应发送、服务器信息获取、JSON编解码、客户端IP获取、会话管理、全局变量、模块引用等功能,常用于API开发、服务器交互、数据处理等场景。

⚠️ 使用限制说明

  • 本文档内函数仅限在轻语言后端文件 .sph 代码中使用,用于编写服务端逻辑(编译后输出为 PHP 代码在服务器执行)。
  • 不得在编写前端页面 .spl 代码中使用,更禁止与 JS 代码混合使用
  • 编写前端请使用 前端(JavaScript)函数_* 类目下的中文函数;服务端只能使用 服务端(PHP)函数_* 类目下的中文函数。
  • 前后端虽存在同名函数(如 JSON编码JSON解码为空),但底层实现与运行环境完全不同,严禁混用。

💡 PHP 原生英文函数使用说明

  • 轻语言后端支持直接调用 PHP 原生英文函数(如 print_r()count()json_encode()curl_init() 等)。
  • 当遇到轻语言未封装中文函数、但 PHP 原生函数可用时,可直接使用原生英文函数。
  • 仅支持使用原生英文函数名严禁使用 PHP 原生语法格式和英文关键字(如 if(){}for(){}functionclassecho 等控制结构与语法关键字)。
  • 控制结构必须使用轻语言中文关键字:如果...否则...结束 如果变量循环...结束循环函数 ... 结束 函数 等。
  • 注:->(对象方法调用)、=>(数组键值分隔)为轻语言本身支持的语法符号,可正常使用。

PHP 核心库相关特性:

  • 请求处理取请求值 基于 PHP $_GET/$_POST/$_REQUEST取请求流 基于 php://input 接收原生流数据
  • 服务器信息取服务信息 对应 PHP $_SERVER,可获取请求URI、用户代理、主机名等
  • 会话凭证启用会话凭证/置会话凭证/取会话凭证/销毁会话凭证 对应 PHP session_start/$_SESSION/session_destroy
  • JSON处理JSON编码/JSON解码 对应 PHP json_encode/json_decode;前端用 JSON编码/JSON解析
  • 全局变量置全局变量/取全局变量 跨文件共享数据,基于 PHP GLOBALS
  • HTTP请求发送GET请求/发送POST请求 对应 PHP cURL,支持自定义超时和协议头
  • 响应头置响应头 必须在任何输出前调用,否则报错;对应 PHP header()
  • 格式化输出格式化内容 输出带状态码的JSON字符串,便于前端判断请求状态

函数:取请求值(参数名)

获取前端提交请求时传递的值。

' 获取所有请求参数
变量 所有参数 = 取请求值("")
输出数组(所有参数)
' 获取特定参数值
变量 用户名 = 取请求值("username")
变量 密码 = 取请求值("password")
输出 "用户名: " + 用户名
输出 "密码: " + 密码

函数:取请求流()

获取前端提交请求时传递的原生流数据;例如:前端提交的JSON字符串。

' 获取前端提交的JSON数据
变量 原始数据 = 取请求流()
输出 "原始数据: " + 原始数据
' 解析JSON数据
变量 JSON对象 = JSON解码(原始数据)
输出数组(JSON对象)

函数:取请求方式()

获取前端提交请求的方式;GET、POST。

' 获取当前请求方式
变量 请求方式 = 取请求方式()
如果(请求方式 == "GET")
	输出 "这是一个GET请求"
否则 如果(请求方式 == "POST")
	输出 "这是一个POST请求"
否则
	输出 "请求方式: " + 请求方式
结束 如果

函数:取服务信息(字段名)

获取PHP原生“$_SERVER”中的值,参数字段名称若为空则返回全部信息值,不为空则返回指定信息值。

' 获取所有服务器信息
变量 所有信息 = 取服务信息("")
输出数组(所有信息)
' 获取特定服务器信息
变量 请求URI = 取服务信息("REQUEST_URI")
变量 用户代理 = 取服务信息("HTTP_USER_AGENT")
输出 "请求URI: " + 请求URI
输出 "用户代理: " + 用户代理

函数:发送GET请求(地址,超时,协议头)

向指定地址提交GET请求以获取数据。

' 发送GET请求获取数据
变量 API地址 = "https://api.example.com/data"
变量 响应 = 发送GET请求(API地址, 30, [])
输出 "API响应: " + 响应
' 带自定义协议头的GET请求
变量 协议头 = ["Authorization": "Bearer token123", "Content-Type": "application/json"]
变量 响应2 = 发送GET请求("https://api.example.com/secure-data", 30, 协议头)
输出 "安全API响应: " + 响应2

函数:发送POST请求(地址,数据,超时,协议头)

向指定地址提交POST请求、并发送数据。

' 发送POST请求提交数据
变量 API地址 = "https://api.example.com/users"
变量 提交数据 = "{\"name\": \"张三\", \"email\": \"zhangsan@example.com\"}"
变量 响应 = 发送POST请求(API地址, 提交数据, 30, ["Content-Type": "application/json"])
输出 "POST响应: " + 响应
' 发送表单数据
变量 表单数据 = "username=admin&password=123456"
变量 响应2 = 发送POST请求("https://api.example.com/login", 表单数据, 30, ["Content-Type": "application/x-www-form-urlencoded"])
输出 "登录响应: " + 响应2

函数:取客户IP()

获取当前请求的客户端IP地址。

' 获取客户端IP地址
变量 客户IP = 取客户IP()
输出 "客户端IP: " + 客户IP
' 记录访问日志
变量 日志内容 = "访问时间: " + 格式化时间("Y-m-d H:i:s", 取现行时间戳()) + ", IP: " + 客户IP
输出 日志内容

函数:JSON编码(数组)

将指定数组对象编码并转换为JSON字符串。

' 将数组编码为JSON字符串
变量 用户信息 = ["姓名": "李四", "年龄": 25, "城市": "北京"]
变量 JSON字符串 = JSON编码(用户信息)
输出 "JSON字符串: " + JSON字符串
' 编码复杂数据结构
变量 响应数据 = ["code": 200, "msg": "success", "data": 用户信息]
变量 响应JSON = JSON编码(响应数据)
输出 "响应JSON: " + 响应JSON

函数:JSON解码(JSON文本)

将指定JSON字符串解码为JSON对象。

' 将JSON字符串解码为对象
变量 JSON文本 = "{\"姓名\": \"王五\", \"年龄\": 30, \"职业\": \"工程师\"}"
变量 解码对象 = JSON解码(JSON文本)
输出数组(解码对象)
' 访问解码后的数据
输出 "姓名: " + 解码对象["姓名"]
输出 "年龄: " + 解码对象["年龄"]

函数:取上传文件(字段名)

获取上传的指定参数名称的文件;如果参数为空字符串、则获取所有上传信息。

' 获取所有上传文件信息
变量 所有文件 = 取上传文件("")
输出数组(所有文件)
' 获取特定字段的上传文件
变量 头像文件 = 取上传文件("avatar")
如果(头像文件 != 空)
	输出 "文件名: " + 头像文件["name"]
	输出 "文件大小: " + 头像文件["size"]
	输出 "文件类型: " + 头像文件["type"]
否则
	输出 "没有上传头像文件"
结束 如果

函数:取上传文件临时路径(文件名称)

获取接收到从前端上传的文件的临时路径。

' 获取上传文件的临时路径
变量 临时路径 = 取上传文件临时路径("avatar")
输出 "临时路径: " + 临时路径
' 移动上传文件到指定位置
如果(临时路径 != "")
	变量 目标路径 = "./uploads/" + 取现行时间戳() + ".jpg"
	移动上传文件(临时路径, 目标路径)
	输出 "文件已保存到: " + 目标路径
结束 如果

函数:置全局变量(名称,值)

设置全局变量;可在整个程序中跨文件使用。

' 设置全局变量
置全局变量("网站标题", "我的网站")
置全局变量("管理员邮箱", "admin@example.com")
置全局变量("网站版本", "1.0.0")
' 设置全局数组
变量 配置数组 = ["数据库主机": "localhost", "数据库端口": 3306]
置全局变量("系统配置", 配置数组)

函数:取全局变量(名称)

获取设置的全局变量。

' 获取全局变量
变量 网站标题 = 取全局变量("网站标题")
变量 管理员邮箱 = 取全局变量("管理员邮箱")
输出 "网站标题: " + 网站标题
输出 "管理员邮箱: " + 管理员邮箱
' 获取全局数组
变量 系统配置 = 取全局变量("系统配置")
输出数组(系统配置)

函数:启用会话凭证()

开启会话凭证(SESSION);使用凭证必须先开启该功能。

' 启用会话功能
启用会话凭证()
' 在启用会话后设置会话数据
置会话凭证("用户名", "张三")
置会话凭证("登录时间", 取现行时间戳())

函数:销毁会话凭证()

销毁当前已经开启的所有会话凭证(SESSION),并同时销毁设置的所有凭证数据。

' 用户退出时销毁会话
输出 "用户正在退出..."
销毁会话凭证()
输出 "会话已销毁,用户已退出"

函数:置会话凭证(键名,值)

设置当前连接域的会话凭证;一般可用于保存登录信息,及判断登录状态。

' 用户登录后设置会话
启用会话凭证()
置会话凭证("用户ID", 12345)
置会话凭证("用户名", "admin")
置会话凭证("登录状态", "已登录")
置会话凭证("登录时间", 格式化时间("Y-m-d H:i:s", 取现行时间戳()))
输出 "用户登录信息已保存到会话"

函数:取会话凭证(键名)

获取当前连接域保存的会话凭证信息。

' 获取会话中的用户信息
启用会话凭证()
变量 用户名 = 取会话凭证("用户名")
变量 登录状态 = 取会话凭证("登录状态")
如果(登录状态 == "已登录")
	输出 "欢迎, " + 用户名 + "!"
否则
	输出 "请先登录"
结束 如果
' 检查登录时间
变量 登录时间 = 取会话凭证("登录时间")
输出 "登录时间: " + 登录时间

函数:为空(变量名)

检测指定变量是否为一个空值或空对象;为空返回真;否则返回假。

' 检测变量是否为空
变量 空变量 = ""
变量 非空变量 = "Hello"
变量 空数组 = []
如果(为空(空变量))
	输出 "空变量确实为空"
结束 如果
如果(!为空(非空变量))
	输出 "非空变量不为空: " + 非空变量
结束 如果
如果(为空(空数组))
	输出 "空数组为空"
结束 如果

函数:格式化内容(状态码,数据值)

格式化输出带状态码的JSON字符串,状态码可自定义任何整数值,一般用于在前端判断状态。

' 格式化成功响应
变量 成功响应 = 格式化内容(200, "操作成功")
输出 成功响应
' 格式化失败响应
变量 失败响应 = 格式化内容(404, "资源未找到")
输出 失败响应
' 格式化带数据的响应
变量 数据响应 = 格式化内容(200, ["用户ID"=>123, "用户名"=>"张三"])
输出 数据响应

函数:引用模块(模块文件名)

引入并使用指定模块文件,参数为不含后缀的模块文件名称。

' 引用自定义模块
变量 模块加载结果 = 引用模块("user_module")
如果(模块加载结果)
	输出 "模块加载成功"
	' 使用模块中的函数
	变量 用户信息 = 获取用户信息(123)
	输出数组(用户信息)
否则
	输出 "模块加载失败"
结束 如果

函数:生成验证码(目标内容,宽度,高度)

根据指定内容绘制验证码图片并返回图片流对象,前端使用图片框(地址)接收。

' 生成4位数字验证码
变量 验证码内容 = "1234"
生成验证码(验证码内容, 120, 40)
' 生成字母数字混合验证码
变量 随机验证码 = "A7k9"
生成验证码(随机验证码, 150, 50)

函数:输出数组(待输出数组)

向前端输出数组内容。

' 输出简单数组
变量 简单数组 = ["苹果", "香蕉", "橙子"]
输出数组(简单数组)
' 输出关联数组
变量 用户信息 = ["姓名"=>"张三", "年龄"=>25, "城市"=>"上海"]
输出数组(用户信息)

函数:置响应头(值)

向客户端(浏览器)发送原始的 HTTP 响应头信息,它通常用于控制网页的重定向、设置缓存策略、指定内容类型等,注意使用该函数时,必须在任何实际输出之前调用(包括普通的 HTML 标签、空行或空格)。如果在输出内容之后再调用该函数,将会导致报错。

' 重定向跳转到指定页面
置响应头("Location: http://www.example.com")
' 设置内容类型 (Content-Type):告诉浏览器当前返回的数据格式,如 HTML、JSON 或 PDF 文件。
置响应头("Content-Type: application/json")
' 控制页面缓存:设置缓存时间或禁止浏览器缓存页面。
置响应头("Cache-Control: no-cache, must-revalidate")
' 设置 HTTP 状态码:例如返回 404 未找到错误。
置响应头("HTTP/1.1 404 Not Found")

函数:执行函数(待执行函数名称)

通过函数名称执行指定函数,效果等同于:“call_user_func”。

学习要点

知识点代码示例说明
请求参数获取取请求值("username")基于 PHP $_GET/$_POST/$_REQUEST;空参数返回全部
原生流数据取请求流()基于 php://input;常用于接收前端提交的JSON字符串
请求方式判断取请求方式()返回 "GET" 或 "POST",用于接口逻辑分支
服务器信息取服务信息("REQUEST_URI")对应 PHP $_SERVER;空参数返回全部信息
JSON编解码JSON编码(数组) / JSON解码(文本)对应 json_encode/json_decode;解码后用 ["键"] 访问
客户端IP取客户IP()获取访问者IP,用于日志记录、风控
会话凭证四件套启用销毁对应 PHP session;登录信息保存与退出登录
全局变量置全局变量(名, 值) / 取全局变量(名)跨文件共享数据;基于 PHP GLOBALS
HTTP请求发送GET请求(地址, 超时, 协议头)基于 PHP cURL;支持自定义超时和协议头
响应头设置置响应头("Content-Type: application/json")对应 PHP header();必须在任何输出前调用
格式化响应格式化内容(200, 数据)输出带状态码的JSON字符串,便于前端判断请求状态
模块引用引用模块("user_module")引入并使用指定模块文件;参数为不含后缀的模块名
文件上传取上传文件("avatar") / 取上传文件临时路径("avatar")获取上传文件信息和临时路径;配合 移动上传文件 保存
空值判断为空(变量)空字符串、空数组、空对象均为真;用 !(为空(x)) 判断非空
验证码生成生成验证码("1234", 120, 40)返回图片流对象;前端用图片框(地址)接收

相关文档

  • 文档服务端(PHP)函数_字符串操作 —— 后端字符串处理函数
  • 文档服务端(PHP)函数_数组操作 —— 后端数组操作函数
  • 文档服务端(PHP)函数_编码操作 —— URL编解码、HTML转义等函数
  • 文档服务端(PHP)函数_MYSQL操作 —— 数据库操作函数
  • 文档服务端(PHP)函数_文件操作 —— 文件读写、移动上传文件等
  • 文档服务端(PHP)函数_时间操作 —— 取现行时间戳格式化时间 等时间函数
  • 文档轻语言网站:变量与数组与对象的定义 —— 变量、对象、数组的基本语法

服务端(PHP)函数_编码操作

文档概述

轻语言网站**后端(PHP)**开发中的编码操作相关函数、用于处理各种编码转换和编码安全,包含ASCII与十六进制转换、URL编解码、HTML转义还原、UUENCODE编解码、反斜杠转义等功能,常用于数据编码、安全防护、编码转换等场景。

⚠️ 使用限制说明

  • 本文档内函数仅限在轻语言后端文件 .sph 代码中使用,用于编写服务端逻辑(编译后输出为 PHP 代码在服务器执行)。
  • 不得在编写前端页面 .spl 代码中使用,更禁止与 JS 代码混合使用
  • 编写前端请使用 前端(JavaScript)函数_* 类目下的中文函数;服务端只能使用 服务端(PHP)函数_* 类目下的中文函数。
  • 前后端虽存在同名函数(如 URL编码URL解码),但底层实现与运行环境完全不同,严禁混用。

💡 PHP 原生英文函数使用说明

  • 轻语言后端支持直接调用 PHP 原生英文函数(如 print_r()urlencode()base64_encode()mb_convert_encoding() 等)。
  • 当遇到轻语言未封装中文函数、但 PHP 原生函数可用时,可直接使用原生英文函数。
  • 仅支持使用原生英文函数名严禁使用 PHP 原生语法格式和英文关键字(如 if(){}for(){}functionclassecho 等控制结构与语法关键字)。
  • 控制结构必须使用轻语言中文关键字:如果...否则...结束 如果变量循环...结束循环函数 ... 结束 函数 等。
  • 注:->(对象方法调用)、=>(数组键值分隔)为轻语言本身支持的语法符号,可正常使用。

PHP 编码相关特性:

  • URL编码差异:后端 URL编码 基于 PHP urlencode,空格转 +;前端 JS encodeURIComponent 空格转 %20
  • HTML转义:基于 PHP htmlspecialchars,转义 < > & " ',用于防 XSS 攻击
  • 反斜杠转义:基于 PHP addslashes,转义 ' " \ NULL,用于防 SQL 注入
  • 编码函数对称ASCII到十六进制十六进制到ASCIIURL编码URL解码HTML转义HTML还原编码UUENCODE解码UUENCODE反斜杠转义反斜杠还原

函数:ASCII到十六进制(待转换文本)

把 ASCII 字符的字符串转换为十六进制值。

' 将ASCII文本转换为十六进制
变量 文本 = "Hello"
变量 十六进制 = ASCII到十六进制(文本)
输出 "原文本: " + 文本
输出 "十六进制: " + 十六进制	
' 再转换回来验证
变量 转回文本 = 十六进制到ASCII(十六进制)
输出 "转回文本: " + 转回文本

函数:十六进制到ASCII(待转换文本)

把十六进制字符串转换为 ASCII 字符。

' 将十六进制转换为ASCII文本
变量 十六进制值 = "48656c6c6f"  ' "Hello"的十六进制
变量 ASCII文本 = 十六进制到ASCII(十六进制值)
输出 "十六进制: " + 十六进制值
输出 "ASCII文本: " + ASCII文本

函数:代码转字符(待转换代码)

将指定的 ASCII 值转成字符。

' 将ASCII码转换为字符
变量 ASCII码 = 65
变量 字符 = 代码转字符(ASCII码)
输出 ASCII码 + "对应的字符是: " + 字符
' 转换多个ASCII码
变量 字符A = 代码转字符(65)
变量 字符B = 代码转字符(66)
变量 字符C = 代码转字符(67)
输出 "ABC: " + 字符A + 字符B + 字符C

函数:解码UUENCODE(待解码文本)

解码 uuencode 编码的字符串。

' 对UUENCODE编码的文本进行解码
变量 UU编码文本 = 编码UUENCODE("这是一个测试文本")
输出 "UU编码后: " + UU编码文本
变量 解码后文本 = 解码UUENCODE(UU编码文本)
输出 "解码后: " + 解码后文本

函数:编码UUENCODE(待编码文本)

使用 uuencode 算法对字符串进行编码。

' 对文本进行UUENCODE编码
变量 原文本 = "Hello World!"
变量 UU编码 = 编码UUENCODE(原文本)
输出 "原文本: " + 原文本
输出 "UU编码: " + UU编码
' 验证解码结果
变量 解码结果 = 解码UUENCODE(UU编码)
输出 "解码验证: " + 解码结果

函数:URL解码(待解码文本)

对URL已编码文本进行解码。

' 对URL编码的文本进行解码
变量 URL编码文本 = "Hello%20World%21"  ' "Hello World!"的URL编码
变量 URL解码文本 = URL解码(URL编码文本)
输出 "URL编码: " + URL编码文本
输出 "URL解码: " + URL解码文本
' 更复杂的URL编码解码(注:中文UTF-8编码格式)
变量 复杂编码 = "name%3D%E4%B8%AD%E6%96%87%26age%3D25"  ' "name=中文&age=25"的编码
变量 复杂解码 = URL解码(复杂编码)
输出 "复杂编码: " + 复杂编码
输出 "复杂解码: " + 复杂解码

函数:URL编码(待编码文本)

对文本进行URL编码。

' 对文本进行URL编码
变量 原文本 = "Hello World!"
变量 URL编码 = URL编码(原文本)
输出 "原文本: " + 原文本
输出 "URL编码: " + URL编码
' 对包含特殊字符的文本进行编码(注:空格会被编码为 + 号)
变量 特殊文本 = "name=张三&age=25&city=北京"
变量 特殊编码 = URL编码(特殊文本)
输出 "特殊文本: " + 特殊文本
输出 "特殊编码: " + 特殊编码
' 验证编码解码过程
变量 解码验证 = URL解码(特殊编码)
输出 "编码解码验证: " + 解码验证

函数:HTML转义(待转义文本,转义标志,编码格式)

将HTML特殊字符转义为实体形式,包括< > & " '等字符,防止XSS攻击。

' 转义HTML特殊字符防止XSS
变量 用户输入 = "<script>alert('XSS')</script>"
变量 转义后 = HTML转义(用户输入)
输出 "转义后: " + 转义后  ' 输出: &lt;script&gt;alert(&#039;XSS&#039;)&lt;&#47;script&gt;
' 在Web页面中显示用户输入的安全做法
变量 用户评论 = "用户说:<strong>这个产品很好</strong>"
变量 安全显示 = HTML转义(用户评论)
输出 "安全显示: " + 安全显示

函数:HTML还原(待还原文本)

将转义的HTML实体字符还原为原始字符,是转义HTML字符函数的反向操作。

' 将转义的HTML实体还原为原始字符
变量 转义文本 = "&lt;h1&gt;标题&lt;&#47;h1&gt;"
变量 还原后 = HTML还原(转义文本)
输出 "还原后: " + 还原后  ' 输出: <h1>标题</h1>
' 还原并显示安全内容
变量 安全内容 = "&lt;p&gt;这是一段安全的HTML内容&lt;&#47;p&gt;"
变量 原始内容 = HTML还原(安全内容)
输出 "原始内容: " + 原始内容

函数:反斜杠转义(待转义文本)

在特殊字符前添加反斜杠进行转义,包括单引号、双引号、反斜杠和NULL字符,用于防止SQL注入。

' 为SQL查询添加反斜杠转义
变量 用户名 = "O'Connor"
变量 转义用户名 = 反斜杠转义(用户名)
输出 "转义后: " + 转义用户名  ' 输出: O\'Connor
' 转义包含多种特殊字符的文本
变量 特殊文本 = "他说: \"我很喜欢这个产品\""
变量 转义特殊文本 = 反斜杠转义(特殊文本)
输出 "转义特殊文本: " + 转义特殊文本

函数:反斜杠还原(待还原文本)

去除由加反斜杠转义函数添加的反斜杠,还原原始字符串。

' 去除反斜杠还原原始字符串
变量 转义文本 = "O'Connor"
变量 还原文本 = 反斜杠还原(转义文本)
输出 "还原后: " + 还原文本  ' 输出: O'Connor
' 还原包含多种转义字符的文本
变量 转义句子 = "她说: \\\"这个很好\\\""
变量 原始句子 = 反斜杠还原(转义句子)
输出 "原始句子: " + 原始句子

学习要点

知识点代码示例说明
ASCII十六进制互转ASCII到十六进制(文本)十六进制到ASCII(文本)字符串与十六进制互转;常用于数据传输、编码存储
ASCII码转字符代码转字符(65)数字ASCII码转字符;65→A、66→B、97→a
URL编解码URL编码(文本)URL解码(文本)基于 PHP urlencode/urldecode;空格转 +
HTML转义防XSSHTML转义(文本)转义 < > & " ' 为实体;基于 htmlspecialchars 防XSS
HTML还原HTML还原(文本)HTML转义 的反向操作;实体还原为原始字符
反斜杠转义防注入反斜杠转义(文本)转义 ' " \ NULL;基于 addslashes 防SQL注入
反斜杠还原反斜杠还原(文本)反斜杠转义 的反向操作;去除多余反斜杠
UUENCODE编解码编码UUENCODE(文本)解码UUENCODE(文本)uuencode 算法编码解码;用于二进制数据传输
编码对称性编码/解码函数成对出现ASCII↔十六进制、URL、HTML、反斜杠、UUENCODE 均为对称设计
安全防护用途HTML转义 防XSS / 反斜杠转义 防注入后端常见安全编码实践;用户输入入库前转义

相关文档

  • 文档服务端(PHP)函数_字符串操作 —— 后端字符串处理函数
  • 文档服务端(PHP)函数_数组操作 —— 后端数组操作函数
  • 文档服务端(PHP)函数_MYSQL操作 —— 数据库操作(SQL注入防护场景)
  • 文档服务端(PHP)函数_文件操作 —— 文件读写操作
  • 文档轻语言网站:变量与数组与对象的定义 —— 变量、对象、数组的基本语法

框架基础类:程序入口文件

文档概述

程序入口文件为项目中的 App.spl 文件。当网站第一次打开或每次重新被打开(包括刷新)时,浏览器都会先执行该文件,并回调 网站被访问 事件。开发者可以在该文件中做一些程序的初始化工作,或根据用户设备类型切换到指定页面(手机端/桌面端)。

入口文件是整个网站的「路由起点」,是 PC/移动端适配、初始页面路由的常用位置。

学习目标

阅读本文档后,你应当能够掌握以下内容:

  • 入口文件 App.spl 的作用与执行时机
  • 必须存在的 网站被访问 事件及其回调时机
  • 使用 切换页面(页面名称) 跳转到指定页面
  • 使用 取用户代理头信息() 判断设备类型(Android/Windows/iOS 等)
  • 使用 寻找文本(源, 目标) 检测子字符串是否存在
  • 通过 UA 字符串实现 PC/移动端自适应路由

涉及函数与关键字

关键字: 事件 ... 结束 事件变量如果 ... 否则 如果 ... 结束 如果

入口事件:

  • 网站被访问() —— 必须存在,不能删除。每次网站被访问(含刷新)时回调

路由函数:

  • 切换页面(页面名称) —— 跳转到指定名称的页面(页面名对应 .spldg/.spl 文件名)
  • 切换页面(页面名称, 参数) —— 跳转并传参(详见下方"相关文档")

UA 探测函数:

  • 取用户代理头信息() —— 获取浏览器 User-Agent 字符串
  • 寻找文本(源文本, 目标文本) —— 查找子文本位置,未找到返回 -1,找到返回索引(从 0 开始)

默认入口文件代码

事件 网站被访问()
    切换页面("首页")
结束 事件
  • 网站被访问 事件是必须存在的,不能删除
  • 当浏览器通过域名访问网站时,浏览器将回调该事件
  • 你可在该入口中初始化网站所需数据或切换到指定网站页面

进阶:根据设备类型自动切换页面

通过读取浏览器的 User-Agent,可以判断用户设备类型,从而将移动端用户跳转到移动端页面,桌面端用户跳转到桌面端页面。

代码示例:

事件 网站被访问()
    变量 userAgent = 取用户代理头信息()
    如果(寻找文本(userAgent,"Android") != -1)
        切换页面("安卓手机页")
    否则 如果(寻找文本(userAgent,"Windows") != -1)
        切换页面("桌面端页")
    结束 如果
结束 事件

关键代码解读

1. 网站被访问 是入口回调

事件 网站被访问()
    切换页面("首页")
结束 事件
  • 该事件在 App.spl必须存在,删除会导致网站无法启动
  • 浏览器每次打开网站或刷新时都会触发该回调
  • 该事件是网站的统一「路由起点」

2. UA 字符串判断设备类型

变量 userAgent = 取用户代理头信息()
如果(寻找文本(userAgent,"Android") != -1)
    切换页面("安卓手机页")
否则 如果(寻找文本(userAgent,"Windows") != -1)
    切换页面("桌面端页")
结束 如果
  • 取用户代理头信息() 返回浏览器的 UA 字符串
  • 寻找文本(源, 目标) 返回目标文本的位置索引,未找到返回 -1,找到返回 >=0 的索引
  • 因此 寻找文本(...) != -1 等价于"包含子字符串"
  • 常见 UA 关键字:
    • Android(安卓手机)
    • iPhone(苹果手机)
    • iPad(苹果平板)
    • Windows(Windows 桌面)
    • Macintosh(Mac 桌面)
    • Linux(Linux 桌面)

3. 切换页面

切换页面("首页")
  • 参数为页面名称,对应 .spldg/.spl 文件名(不含扩展名)
  • 若目标页面不存在会报错
  • 也支持带参数跳转:切换页面("首页", 参数对象),目标页面通过 取请求参数() 取出(详见相关文档)

注意事项

  • 网站被访问 事件不可删除:入口文件 App.spl 中必须存在该事件,否则网站无法正常启动。
  • 入口文件名固定:入口文件名必须为 App.spl,不可改名。
  • UA 判断顺序:UA 探测应将移动端关键字优先判断(如先判断 AndroidiPhone),再判断桌面端,避免移动设备 UA 中含兼容性字段误判。
  • UA 不可靠:UA 可被浏览器或用户篡改,关键判断不能完全依赖 UA;如需要严格判断可结合屏幕宽度等综合判断。
  • 每次刷新都会触发:刷新页面也会再次执行 网站被访问,因此该事件中适合做幂等的初始化操作。
  • 寻找文本 返回 -1 表示未找到:判断子字符串存在用 != -1,不要用 > 0(索引可能为 0)。
  • 目标页面必须存在切换页面(页面名) 中页面名必须对应实际的 .spldg/.spl 文件,否则报错。

学习要点总结

知识点关键代码适用场景
入口文件App.spl网站启动入口
必需事件事件 网站被访问()网站被访问回调
页面路由切换页面("首页")跳转到指定页面
UA 探测取用户代理头信息()设备类型判断
字符串查找寻找文本(源, 目标) != -1判断包含子串
设备路由UA + 切换页面PC/移动端适配

相关文档

  • 文档轻语言网站:工程项目结构 —— 项目目录与 App.spl 的位置
  • 文档轻语言网站:界面XML定义规范 —— .spldg 页面文件写法
  • 文档轻语言网站:循环语句体结构 —— 流程控制语法
  • 文档轻语言网站:轻语言语法速查 —— 事件、条件判断语法
  • 文档前端(JavaScript)函数_字符串 —— 寻找文本 等字符串函数
  • 文档前端(JavaScript)函数_浏览器 —— 取用户代理头信息 等 UA 相关函数
  • 文档综合演示:手机移动端记事本网页开发 —— 移动端页面(类型="wap")的开发示例
  • 文档综合演示:网页留言板开发 —— 多页面切换与参数传递示例
  • 文档综合演示:XML 与使用代码动态创建组件演示 —— 切换页面与取请求参数的用法

框架基础类:视图

视图类用于作为页面中所有可视组件的抽象基类,支持设置宽度、高度、左边、顶边、背景颜色、背景图像、文本、文本颜色、字体、字体大小、边框、边框圆角、透明度、显示模式、定位、显示层级等属性,以及对齐、移动、获取焦点、添加/移除样式类、置被单击/双击/鼠标/键盘回调等操作,常用于作为所有UI组件的父类继承使用,注意该类为抽象类不能直接创建实例。

属性:ID

  • 类型: 文本型
  • 说明: 设置或获取当前组件的ID。

属性:左边

  • 类型: 数值型
  • 说明: 设置或获取当前组件相对于父元素的左边位置,支持的单位有 “px”、“%” 等,若传入数值,默认单位为 “px”。

属性:顶边

  • 类型: 数值型
  • 说明: 设置或获取当前组件相对于父元素的顶边位置,支持的单位有 “px”、“%” 等,若传入数值,默认单位为 “px”。

属性:右边

  • 类型: 数值型
  • 说明: 设置或获取当前组件相对于父元素的右边位置,支持的单位有 “px”、“%” 等,若传入数值,默认单位为 “px”。

属性:底边

  • 类型: 数值型
  • 说明: 设置或获取当前组件相对于父元素的底边位置,支持的单位有 “px”、“%” 等,若传入数值,默认单位为 “px”。

属性:宽度

  • 类型: 数值型
  • 说明: 设置或获取当前组件的宽度,支持的单位有 “px”、“%”、“vw” 等,若传入数值,默认单位为 “px”。

属性:高度

  • 类型: 数值型
  • 说明: 设置或获取当前组件的高度,支持的单位有 “px”、“%”、“vh” 等,若传入数值,默认单位为 “px”。

属性:背景

  • 类型: 文本型
  • 说明: 设置或获取当前组件的背景样式,可设置颜色、图像、重复方式等,例如 “red”、“url(./static/image.jpg)” 等。

属性:背景颜色

  • 类型: 文本型
  • 说明: 设置或获取当前组件的背景颜色,可使用颜色名称、十六进制值、RGB 值等,例如 “red”、“#FF0000”、“rgb(255, 0, 0)”。

属性:背景图像

  • 类型: 文本型
  • 说明: 设置或获取当前组件的背景图像,使用 “url()” 函数指定图像路径,例如 “url(./static/image.jpg)”。

属性:文本

  • 类型: 文本型
  • 说明: 设置或获取当前组件的文本内容。

属性:文本颜色

  • 类型: 文本型
  • 说明: 设置或获取当前组件的文本颜色,可使用颜色名称、十六进制值、RGB 值等,例如 “red”、“#FF0000”、“rgb(255, 0, 0)”。

属性:字体

  • 类型: 文本型
  • 说明: 设置或获取当前组件的字体(名称),例如:“sans-serif”。

属性:字体大小

  • 类型: 数值型
  • 说明: 设置或获取当前组件的字体大小,支持的单位有 “px”、“em”、“rem” 等。

属性:字体粗细

  • 类型: 数值型
  • 说明: 设置或获取当前组件的字体粗细,可选值有 “normal”、“bold”、“bolder”、“lighter” 以及 100 - 900 的数值。

属性:行高

  • 类型: 数值型
  • 说明: 设置或获取当前组件的行高,支持的单位有 “px”、“em” 等。

属性:边框

  • 类型: 文本型
  • 说明: 设置或获取当前组件的边框样式,可设置边框宽度、样式和颜色,例如 “1px solid #ccc”。

属性:边框圆角

  • 类型: 数值型
  • 说明: 设置或获取当前组件的边框圆角,支持的单位有 “px”、“%” 等。

属性:边框宽度

  • 类型: 数值型
  • 说明: 设置或获取当前组件的边框宽度,支持的单位有 “px”、“em” 等。

属性:光标样式

  • 类型: 文本型
  • 说明: 设置或获取当前组件的光标样式,可选值有 “auto”、“pointer”、“text”、“wait” 等。

属性:显示模式

  • 类型: 文本型
  • 说明: 设置或获取当前组件的显示模式,可选值有 “block”、“inline”、“inline-block”、“none” 等。

属性:透明度

  • 类型: 数值型
  • 说明: 设置或获取当前组件的透明度,取值范围为 0(完全透明)到 1(完全不透明)。

属性:外边距

  • 类型: 数值型
  • 说明: 设置或获取当前组件的外边距,支持的单位有 “px”、“em” 等。可一次性设置四个方向的外边距,也可单独设置每个方向。

属性:外边距底

  • 类型: 数值型
  • 说明: 设置或获取当前组件的底部外边距,支持的单位有 “px”、“em” 等。

属性:外边距左

  • 类型: 数值型
  • 说明: 设置或获取当前组件的左边外边距,支持的单位有 “px”、“em” 等。

属性:外边距右

  • 类型: 数值型
  • 说明: 设置或获取当前组件的右边外边距,支持的单位有 “px”、“em” 等。

属性:外边距顶

  • 类型: 数值型
  • 说明: 设置或获取当前组件的顶部外边距,支持的单位有 “px”、“em” 等。

属性:最大高度

  • 类型: 数值型
  • 说明: 设置或获取当前组件的最大高度,支持的单位有 “px”、“%”、“vh” 等。

属性:最大宽度

  • 类型: 数值型
  • 说明: 设置或获取当前组件的最大宽度,支持的单位有 “px”、“%”、“vw” 等。

属性:最小高度

  • 类型: 数值型
  • 说明: 设置或获取当前组件的最小高度,支持的单位有 “px”、“%”、“vh” 等。

属性:最小宽度

  • 类型: 数值型
  • 说明: 设置或获取当前组件的最小宽度,支持的单位有 “px”、“%”、“vw” 等。

属性:内边距

  • 类型: 数值型
  • 说明: 设置或获取当前组件的内边距,支持的单位有 “px”、“em” 等。可一次性设置四个方向的内边距,也可单独设置每个方向。

属性:内边距底

  • 类型: 数值型
  • 说明: 设置或获取当前组件的底部内边距,支持的单位有 “px”、“em” 等。

属性:内边距左

  • 类型: 数值型
  • 说明: 设置或获取当前组件的左边内边距,支持的单位有 “px”、“em” 等。

属性:内边距右

  • 类型: 数值型
  • 说明: 设置或获取当前组件的右边内边距,支持的单位有 “px”、“em” 等。

属性:内边距顶

  • 类型: 数值型
  • 说明: 设置或获取当前组件的顶部内边距,支持的单位有 “px”、“em” 等。

属性:定位

  • 类型: 文本型
  • 说明: 设置或获取当前组件的定位方式,可选值有 “static”、“relative”、“absolute”、“fixed”、“sticky”。

属性:CLASS

  • 类型: 文本型
  • 说明: 设置或获取当前元素的“class”属性值。

属性:InnerHTML

  • 类型: 文本型
  • 说明: 设置或获取当前组件的 InnerHTML 内容,需注意:设置自定义 HTML 内容后、可能将导致默认样式失效。

属性:OuterHTML

  • 类型: 文本型
  • 说明: 设置或获取当前组件的 OuterHTML 内容,与InnerHTML区别为:OuterHTML包含自身在内以及所有子节点的内容,需注意:设置自定义 HTML 内容后、可能将导致默认样式失效。

属性:内容水平对齐方式

  • 类型: 文本型
  • 说明: 设置或获取当前组件内文本或子元素的水平对齐方式,可选值有 “left”、“right”、“center”、“justify” 等。

属性:首行缩进

  • 类型: 数值型
  • 说明: 设置或获取当前组件内文本首行的缩进量,支持的单位有 “px”、“em” 等。

属性:可视

  • 类型: 文本型|逻辑值
  • 说明: 设置或获取当前组件的可见性,支持设置逻辑型和文本型的值,当设置属性值为“真”时,显示组件效果等同于“visible”,当设置为假时,组件隐藏但占位置,效果同于“hidden”。设置文本型值可选值有: “visible”(可见)、“hidden”(隐藏但仍占据空间)、“none”(完全不可见也不占空间)、“collapse”(用于表格行、列等)。

属性:显示层级

  • 类型: 数值型
  • 说明: 设置或获取当前组件的显示层级,数值越大越显示在上方,效果等同于“z-index”属性。

属性:内联样式

  • 类型: 文本型
  • 说明: 设置或获取当前组件的Style样式值,返回样式文本值。

属性:禁用

  • 类型: 逻辑型
  • 说明: 设置或获取是否禁用当前组件,设置为真时组件将呈现灰色不可用状态。

函数:追加内联样式(样式文本)

添加指定内联样式到当前组件的Style样式中。

函数:置内联样式(名称,值)

给当前组件设置指定style属性,例如:按钮1.置内联样式("color","red")。

函数:取内联样式值(名称)

获取当前组件的内联样式style的值,例如:按钮1.取内联样式值("color")

函数:取Style对象()

获取当前组件的style对象。

函数:添加事件(事件名称, 回调函数)

为当前元素添加指定事件,例如:click、input 等等。

函数:删除事件(事件名称, 回调函数)

移除当前元素上指定的事件监听器。

函数:获取焦点()

尝试使当前元素获取焦点。

函数:清除焦点()

使当前元素失去焦点。

函数:添加样式类(类名称)

为当前元素添加 CSS 样式表中定义的样式,效果等同于在HTML中为元素设置“class”属性值。

函数:移除样式类(类名称)

移除前元素中的 CSS 样式,效果等同于在HTML中删除元素中设置“class”指定属性值。

函数:取样式类列表()

获取当前元素的“class”类名列表。

函数:取样式类()

获取当前元素的“class”类名。

函数:执行单击()

模拟当前元素的单击操作。

函数:取属性值(属性名)

获取当前元素指定属性的值。

函数:取属性节点(属性名)

获取当前元素指定属性的属性节点。

函数:取布局参数()

获取当前组件的布局参数,原生函数:getBoundingClientRect,返回当前组件的边界数据信息

函数:取渲染宽度()

获取当前元素在页面中渲染时实际占用页面布局的像素宽度值,返回一个不带单位的可运算数值。

函数:取渲染高度()

获取当前元素在页面中渲染时的实际占用像素高度,返回一个不带单位的可运算数值。

函数:取渲染顶边()

获取当前元素在页面中渲染时顶边距离父布局或页面的实际像素值,返回一个不带单位的可运算数值。

函数:取渲染左边()

获取当前元素在页面中渲染时左侧距离父布局或页面的实际像素值,返回一个不带单位的可运算数值。

函数:左侧对齐到(目标组件,偏移量)

移动当前组件(左侧对齐)到指定组件的左侧,偏移量默认为0,可省略。

函数:右侧对齐到(目标组件,偏移量)

移动当前组件(右侧对齐)到指定组件的右侧,偏移量默认为0,可省略。

函数:顶边对齐到(目标组件,偏移量)

移动当前组件(顶部对齐)到指定组件的顶部,偏移量默认为0,可省略。

函数:底边对齐到(目标组件,偏移量)

移动当前组件(底部对齐)到指定组件的底部,偏移量默认为0,可省略。

函数:右侧对齐到左(目标组件, 偏移量)

将当前组件的右侧对齐到目标组件的左侧,可设置偏移量。偏移量为正数时向右偏移,负数时向左偏移。

函数:左侧对齐到右(目标组件, 偏移量)

将当前组件的左侧对齐到目标组件的右侧,可设置偏移量。偏移量为正数时向右偏移,负数时向左偏移。

函数:底边对齐到顶(目标组件, 偏移量)

将当前组件的底边对齐到目标组件的顶部,可设置偏移量。偏移量为正数时向下偏移,负数时向上偏移。

函数:顶边对齐到底(目标组件, 偏移量)

将当前组件的顶边对齐到目标组件的底部,可设置偏移量。偏移量为正数时向下偏移,负数时向上偏移。

函数:有指定属性(属性名)

判断当前元素是否有指定属性。

函数:有属性()

判断当前元素是否有属性。

函数:内容可编辑()

判断当前元素内容是否可编辑。

函数:包含CSS类(类名)

判断当前元素是否包含指定的CSS类。

函数:取命名空间()

获取当前元素的命名空间。

函数:取下个节点()

获取当前元素的下一个节点。

函数:取下个元素()

获取当前元素的下一个元素。

函数:取节点名称()

获取当前元素的节点名称。

函数:取节点类型()

获取当前元素的节点类型。

函数:取父节点()

获取当前元素的父节点。

函数:取父元素()

获取当前元素的父元素。

函数:取上个节点()

获取当前元素的上一个节点。

函数:取上个元素()

获取当前元素的上一个元素。

函数:销毁()

移除当前元素。

函数:删除属性(属性名)

删除当前元素的指定属性。

函数:删除属性节点(属性名)

删除当前元素的指定属性节点。

函数:置属性值(属性名, 属性值)

设置当前元素指定属性的值。

函数:置属性节点(属性节点)

设置当前元素的指定属性节点。

函数:取标签名()

获取当前元素的标签名。

函数:移动(左边 顶边, 宽度, 高度)

设置当前元素的位置和大小,参数说明:左边:距离左侧的像素值,顶边:距离顶部的像素值,宽度:元素的宽度值,高度:元素的高度值。

函数:取原生对象()

获取当前元素的原生DOM对象。

函数:置被单击回调(回调函数)

设置单击事件回调,回调函数返回两个参数:(视图对象, 事件对象)。视图对象为触发事件的视图实例,事件对象包含鼠标点击的详细信息如坐标等。

函数:置被双击回调(回调函数)

设置双击事件回调,回调函数返回两个参数:(视图对象, 事件对象)。视图对象为触发事件的视图实例,事件对象包含鼠标双击的详细信息。

函数:置鼠标被进入回调(回调函数)

设置鼠标进入事件回调,回调函数返回两个参数:(视图对象, 事件对象)。视图对象为鼠标进入的视图实例,事件对象包含鼠标位置等信息。

函数:置鼠标被移出回调(回调函数)

设置鼠标移出事件回调,回调函数返回两个参数:(视图对象, 事件对象)。视图对象为鼠标移出的视图实例,事件对象包含鼠标位置等信息。

函数:置鼠标被移动回调(回调函数)

设置鼠标移动事件回调,回调函数返回两个参数:(视图对象, 事件对象)。视图对象为鼠标移动所在的视图实例,事件对象包含鼠标当前位置、移动距离等信息。

函数:置鼠标被按下回调(回调函数)

设置鼠标按下事件回调,回调函数返回两个参数:(视图对象, 事件对象)。视图对象为触发事件的实例,事件对象包含按下的鼠标按钮、位置等信息。

函数:置鼠标被抬起回调(回调函数)

设置鼠标抬起事件回调,回调函数返回两个参数:(视图对象, 事件对象)。视图对象为触发事件的实例,事件对象包含抬起的鼠标按钮、位置等信息。

函数:置鼠标滚轮被滚动回调(回调函数)

设置鼠标滚轮事件回调,回调函数返回两个参数:(视图对象, 事件对象)。视图对象为触发事件的实例,事件对象包含滚轮滚动方向(deltaY)、滚动量等信息。

函数:置键盘被按下回调(回调函数)

设置键盘按下事件回调,回调函数返回两个参数:(视图对象, 事件对象)。视图对象为触发事件的实例,事件对象包含按下的键码(keyCode)、是否按下修饰键等信息。

函数:置按键被抬起回调(回调函数)

设置键盘抬起事件回调,回调函数返回两个参数:(视图对象, 事件对象)。视图对象为触发事件的实例,事件对象包含抬起的键码(keyCode)等信息。

函数:置按键被压下回调(回调函数)

设置按键压住事件回调,回调函数返回两个参数:(视图对象, 事件对象)。视图对象为触发事件的实例,事件对象包含被压住的键码(keyCode)、字符(charCode)等信息。

函数:置被失去焦点回调(回调函数)

设置失去焦点事件回调,回调函数返回两个参数:(视图对象, 事件对象)。视图对象为失去焦点的实例,事件对象包含相关焦点转移信息。

函数:置被获得焦点回调(回调函数)

设置获得焦点事件回调,回调函数返回两个参数:(视图对象, 事件对象)。视图对象为获得焦点的实例,事件对象包含相关焦点转移信息。

事件:被单击(源对象,事件源)

被单击回调接口中的方法;当组件被单击时触发该方法。

事件:被双击(源对象,事件源)

被双击回调接口中的方法;当组件被双击时触发该方法。

事件:鼠标被进入(源对象,事件源)

鼠标被进入回调接口中的方法;当鼠标进入组件时触发该方法。

事件:鼠标被移出(源对象,事件源)

鼠标被移出回调接口中的方法;当鼠标移出组件时触发该方法。

事件:鼠标被移动(源对象,事件源)

鼠标被移动回调接口中的方法;当鼠标移动时触发该方法。

事件:鼠标被按下(源对象,事件源)

鼠标被按下回调接口中的方法;当鼠标按下时触发该方法。

事件:鼠标被抬起(源对象,事件源)

鼠标被抬起回调接口中的方法;当鼠标抬起时触发该方法。

事件:鼠标滚轮被滚动(源对象,事件源)

鼠标滚轮被滚动回调接口中的方法;当鼠标滚轮滚动时触发该方法。

事件:键盘被按下(源对象,事件源)

键盘被按下回调接口中的方法;当键盘按下时触发该方法。

事件:按键被抬起(源对象,事件源)

按键被抬起回调接口中的方法;当按键抬起时触发该方法。

事件:按键被压下(源对象,事件源)

按键被压下回调接口中的方法;当按键被压下时触发该方法。

事件:被失去焦点(源对象,事件源)

被失去焦点回调接口中的方法;当组件失去焦点时触发该方法。

事件:被获得焦点(源对象,事件源)

被获得焦点回调接口中的方法;当组件获得焦点时触发该方法。

框架基础类:容器视图

容器视图类用于作为所有布局组件的基类,支持添加子组件、管理子组件集合等容器操作,常用于弹性布局、滚动框等布局容器类的父类继承使用,注意该类为抽象类不能直接创建实例。

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图

函数:添加组件(组件)

向当前布局中添加一个子组件。

函数:取子组件数()

获取当前容器中的子组件数量,非网页元素数量。

函数:取子组件(索引)

获取当前容器中指定索引的子组件对象。

函数:取子元素By类名(类名)

根据 class 类名获取当前元素的子元素列表。

函数:取子元素By标签(标签名)

根据标签名获取当前元素的子元素列表。

函数:有子节点()

判断当前元素是否有子节点。

函数:取末端子节点()

获取当前元素的最后一个子节点。

函数:取末端子元素()

获取当前元素的最后一个子元素。

函数:查询子节点(选择器)

根据选择器查询当前元素的第一个子节点。

函数:查询子节点全部(选择器)

根据选择器查询当前元素的所有子节点。

框架基础类:页面

文档概述

本例程演示如何监听轻语言 web 框架中页面级的生命周期事件与浏览器事件,包括:页面加载完毕、页面解析完毕、窗口尺寸改变、页面内容滚动、页面即将被关闭、页面被关闭、页面发生错误、页面获得/失去焦点等。这些事件覆盖了网页运行过程中最重要的几个时机,是初始化逻辑、资源清理、用户离开提示、响应式布局、错误监控的基础。

学习目标

阅读本文档后,你应当能够掌握以下内容:

  • 轻语言页面级事件的命名规则与触发时机
  • 页面加载完毕页面解析完毕 的区别与用途
  • 窗口尺寸被改变 事件配合 取窗口宽度/取窗口高度 实现响应式
  • 页面内容被滚动 事件的监听
  • 页面即将被关闭 事件中通过 事件源.preventDefault() 阻止关闭
  • 页面被关闭页面即将被关闭 的先后关系
  • 页面发生错误页面获得焦点页面失去焦点 的用途
  • 在 IDE 中添加页面事件的两种方式(右键菜单 / Ctrl + E 快捷键)

涉及组件

组件名称作用参考文档
绝对布局根布局页面根布局容器文档布局类组件_绝对布局
标签标签1显示事件触发信息文档文本类组件_标签
按钮按钮1测试交互文档按钮类组件_按钮

涉及函数与关键字

关键字: 事件 ... 结束 事件

页面级事件:

事件名触发时机是否可阻止参考文档
页面加载完毕页面所有资源(含图片等)加载完成文档页面事件_页面加载完毕
页面解析完毕DOM 解析完成(早于加载完毕)文档页面事件_页面解析完毕
窗口尺寸被改变浏览器窗口尺寸变化文档页面事件_窗口尺寸被改变
页面内容被滚动页面滚动条被滚动文档页面事件_页面内容被滚动
页面即将被关闭用户尝试离开/关闭页面(可阻止)文档页面事件_页面即将被关闭
页面被关闭页面确认被关闭后文档页面事件_页面被关闭
页面发生错误页面脚本发生错误文档页面事件_页面发生错误
页面获得焦点页面获得焦点(切回当前标签)文档页面事件_页面获得焦点
页面失去焦点页面失去焦点(切换到其他标签/窗口)文档页面事件_页面失去焦点

事件参数:

  • 事件源 —— 部分事件可接收事件源对象,提供 preventDefault()returnValue 等原生 DOM API

窗口信息函数:

  • 取窗口宽度() —— 获取浏览器视口宽度
  • 取窗口高度() —— 获取浏览器视口高度

调试函数:

  • 调试输出(内容) —— 控制台输出
  • 置页面标题(文本) —— 修改浏览器标签栏标题(见贪吃蛇演示示例用法)

如何添加页面事件

在轻语言 IDE 中,添加页面事件有两种方式:

  1. 右键菜单:在 .spl 文件空白处右键 → 单击「单击事件」菜单项(实际为"添加事件"菜单)
  2. 快捷键:在 .spl 文件编辑区按下 Ctrl + E

💡 页面事件无需绑定具体组件,事件名以 页面窗口 开头,直接在 .spl 顶层定义即可。

程序源码

测试页面.spldg

<页面 标题="页面标题" 宽度="500" 高度="300">
	<绝对布局 名称="根布局" >
	  <标签 名称="标签1" 左边="12" 顶边="12" 高度="40" 宽度="218" 文本="我是最棒的!" />
	  <按钮 名称="按钮1" 左边="12" 宽度="218" 顶边="70" 高度="40" 文本="点击测试" />
	</绝对布局>
</页面>

测试页面.spl

' ****************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 程序作者:
' 联系信息:
' 窗口描述:默认首页。
' ****************************************************************************
' 如何添加页面事件?
' 1.在空白处右键菜单
' 2.单击“单击事件”菜单项
' 3.或直接使用 “Ctrl + E” 快捷键添加
' ****************************************************************************

事件 页面加载完毕()
    标签1.文本 = "页面加载完毕,欢迎使用 VcnStudio 网站开发插件!"
结束 事件

事件 页面解析完毕()
    标签1.文本 = "页面解析完毕"
结束 事件

事件 窗口尺寸被改变()
    标签1.文本 = "页面(浏览器)窗口尺寸被改变,宽度:" + 取窗口宽度() + ",高度:" + 取窗口高度()
结束 事件

事件 页面内容被滚动()
    标签1.文本 = "页面内容被滚动"
结束 事件

事件 页面即将被关闭(事件源)
    标签1.文本 = "页面即将被关闭"
    ' 取消关闭事件
    事件源.preventDefault()
    ' 谷歌浏览器 需要设置 returnValue
    事件源.returnValue = ""
    ' 显示给用户的提示信息(部分浏览器可能不会显示自定义信息)
    返回 "你确定要离开此页面吗?"
结束 事件

事件 页面被关闭()
    调试输出("页面被关闭")
结束 事件

事件 页面发生错误(事件源)
    调试输出("页面发生错误")
结束 事件

事件 页面获得焦点()
    调试输出("页面获得焦点")
结束 事件

事件 页面失去焦点()
    调试输出("页面失去焦点")
结束 事件

关键代码解读

1. 页面加载完毕 vs 页面解析完毕

事件 页面解析完毕()       ' DOM 解析完成即触发(不等图片等资源)
    标签1.文本 = "页面解析完毕"
结束 事件

事件 页面加载完毕()       ' 所有资源(含图片、样式等)加载完成后触发
    标签1.文本 = "页面加载完毕,欢迎使用 VcnStudio 网站开发插件!"
结束 事件
  • 对应浏览器原生的 DOMContentLoaded(解析完毕)与 load(加载完毕)事件
  • 页面解析完毕 触发更早,适合尽早操作 DOM
  • 页面加载完毕 触发较晚,适合依赖完整资源的初始化(如读取图片尺寸)
  • 两者都会触发,且 页面解析完毕 必然先于 页面加载完毕

2. 窗口尺寸被改变:响应式布局基础

事件 窗口尺寸被改变()
    标签1.文本 = "页面(浏览器)窗口尺寸被改变,宽度:" + 取窗口宽度() + ",高度:" + 取窗口高度()
结束 事件
  • 浏览器窗口尺寸变化时触发(对应原生 resize 事件)
  • 取窗口宽度()/取窗口高度() 取视口尺寸(数字)
  • 实际开发中常在此事件中重新计算并调整组件位置(如 置组件水平居中调整页面布局

3. 页面即将被关闭:阻止用户离开

事件 页面即将被关闭(事件源)
    标签1.文本 = "页面即将被关闭"
    ' 取消关闭事件
    事件源.preventDefault()
    ' 谷歌浏览器 需要设置 returnValue
    事件源.returnValue = ""
    ' 显示给用户的提示信息(部分浏览器可能不会显示自定义信息)
    返回 "你确定要离开此页面吗?"
结束 事件
  • 对应原生 beforeunload 事件,用户尝试关闭/刷新/跳转时触发
  • 三步阻止关闭:
    1. 事件源.preventDefault() —— 阻止默认行为
    2. 事件源.returnValue = "" —— Chrome 要求设置 returnValue 才能弹出确认框
    3. 返回 "提示文本" —— 部分浏览器会显示该文本作为确认提示
  • ⚠️ 注意:现代浏览器出于安全考虑,自定义提示文本通常不会被显示,浏览器只会弹出一个通用的"是否离开"确认框

4. 页面被关闭 vs 页面即将被关闭

事件 页面即将被关闭(事件源)   ' 可阻止,用户可取消关闭
    ...
结束 事件

事件 页面被关闭()              ' 不可阻止,页面确认要关闭后触发
    调试输出("页面被关闭")
结束 事件
  • 页面即将被关闭:用户尝试离开时触发,可阻止
  • 页面被关闭:用户确认离开后触发,不可阻止
  • 对应原生 beforeunloadunload
  • 页面被关闭 中适合做异步不可的资源清理(如发送统计请求),但页面已无法更新 UI

5. 页面发生错误:错误监控

事件 页面发生错误(事件源)
    调试输出("页面发生错误")
结束 事件
  • 对应原生 error 事件
  • 适合做错误上报、日志记录
  • 事件源 含错误详情(具体字段以框架封装为准)

6. 页面获得/失去焦点:用户活跃状态监控

事件 页面获得焦点()
    调试输出("页面获得焦点")
结束 事件

事件 页面失去焦点()
    调试输出("页面失去焦点")
结束 事件
  • 对应原生 focusblur(页面级,非组件级)
  • 用户切换到其他标签页/窗口时触发 页面失去焦点,切回时触发 页面获得焦点
  • 实际用途:暂停/恢复动画、停止轮询、统计用户停留时长

注意事项

  • 事件添加方式:在 IDE 中通过右键菜单或 Ctrl + E 快捷键添加,事件名以 页面/窗口 开头的是页面级事件,无需绑定组件。
  • 页面加载完毕 vs 页面解析完毕:前者晚于后者;依赖图片等资源的初始化放前者,尽早操作 DOM 的逻辑放后者。
  • 页面即将被关闭 的兼容性preventDefault() + returnValue + 返回 文本三步走,但现代浏览器大多不显示自定义提示,仅弹通用确认框。
  • 页面被关闭 中不可更新 UI:此时页面已开始卸载,DOM 操作无效;适合做不可逆的资源清理、统计上报。
  • 窗口尺寸被改变 频率:拖动窗口时该事件会高频触发,重计算逻辑建议加节流(如用时钟定时器延迟执行)。
  • 事件名大小写敏感:轻语言事件名为中文,大小写不敏感,但必须与框架定义的事件名完全一致。
  • 组件级事件与页面级事件:本节为页面级事件(无组件前缀),组件事件(如 按钮1.被单击)需带组件名前缀。

学习要点总结

知识点关键代码适用场景
页面加载完毕事件 页面加载完毕()资源依赖的初始化
页面解析完毕事件 页面解析完毕()尽早操作 DOM
窗口尺寸改变事件 窗口尺寸被改变() + 取窗口宽度()响应式布局
内容滚动事件 页面内容被滚动()滚动监听
阻止关闭事件源.preventDefault() + returnValue用户离开提示
页面被关闭事件 页面被关闭()资源清理
错误监控事件 页面发生错误(事件源)错误上报
焦点切换页面获得焦点/页面失去焦点暂停/恢复动画
添加事件Ctrl + E 快捷键 / 右键菜单IDE 操作

相关文档

  • 文档页面事件_页面加载完毕 —— 加载完毕事件详解
  • 文档页面事件_页面解析完毕 —— 解析完毕事件详解
  • 文档页面事件_窗口尺寸被改变 —— 窗口尺寸事件
  • 文档页面事件_页面内容被滚动 —— 滚动事件
  • 文档页面事件_页面即将被关闭 —— beforeunload 与阻止关闭
  • 文档页面事件_页面被关闭 —— unload 事件
  • 文档页面事件_页面发生错误 —— 错误事件
  • 文档页面事件_页面获得焦点 / 文档页面事件_页面失去焦点 —— 焦点事件
  • 文档前端(JavaScript)函数_窗口 —— 取窗口宽度/取窗口高度
  • 文档轻语言网站:轻语言语法速查 —— 事件定义语法、VB6 风格事件
  • 文档轻语言网站:界面XML定义规范 —— .spldg XML 写法
  • 文档综合演示:贪吃蛇游戏开发演示 —— 窗口尺寸被改变 配合 调整页面布局 的实战用法
  • 文档综合演示:手机移动端记事本网页开发 —— 页面加载完毕 中读取本地数据的实战用法

组件:Iframe面板

Iframe面板组件用于在页面中嵌入另一个网页,以独立窗口的形式展示外部内容。它支持设置地址、尺寸、边框等属性,并提供了内容加载完毕的回调事件。常用于嵌入第三方页面、独立子页面、外部系统等场景。注意: 嵌入跨域页面时,受浏览器同源策略限制,部分操作(如通信)可能受限。

典型使用场景:

  • 嵌入第三方服务页面(如地图、支付、客服系统)
  • 展示独立子页面(如帮助文档、用户协议)
  • 集成外部系统(如报表系统、监控面板)
  • 页面预览(如链接预览、模板预览)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置嵌入的页面地址地址Iframe面板1.地址 = "https://example.com"
设置面板尺寸宽度 / 高度Iframe面板1.宽度 = 800Iframe面板1.高度 = 600
设置边框样式边框 / 边框圆角Iframe面板1.边框 = "1px solid #d9d9d9"Iframe面板1.边框圆角 = "8px"
设置加载完毕回调置内容加载完毕回调(回调函数)Iframe面板1.置内容加载完毕回调((源对象) => { ... })
向父页面发送数据发送数据(内容, 目标域名)Iframe面板1.发送数据("hello", "https://parent.com")
获取子页面对象取面板内容对象()变量 子窗口 = Iframe面板1.取面板内容对象()
设置背景色(加载时显示)背景颜色Iframe面板1.背景颜色 = "#f5f5f5"

样式美化参考

Iframe面板的外观可通过继承的视图属性进行调整:

边框与圆角:

  • 有边框:边框 = "1px solid #d9d9d9"边框圆角 = "8px"
  • 无边框:边框 = "none",适合全屏嵌入场景
  • 圆角面板:边框圆角 = "12px"溢出隐藏 = "hidden"

尺寸与背景:

  • 固定尺寸:宽度 = 800高度 = 600
  • 自适应:宽度 = "100%"高度 = "100%"
  • 加载背景:背景颜色 = "#f5f5f5"(页面加载时显示)

常用样式组合:

' 带阴影的卡片样式
Iframe面板1.边框 = "1px solid #e8e8e8"
Iframe面板1.边框圆角 = "8px"
Iframe面板1.背景颜色 = "#ffffff"
Iframe面板1.追加内联样式("box-shadow: 0 2px 8px rgba(0,0,0,0.1);")

基础示例

创建一个基本的Iframe面板,嵌入一个外部网页。

变量 Iframe面板1 = 创建 Iframe面板()
Iframe面板1.左边 = 50
Iframe面板1.顶边 = 50
Iframe面板1.宽度 = 800
Iframe面板1.高度 = 500
Iframe面板1.地址 = "https://www.example.com"
Iframe面板1.边框 = "1px solid #d9d9d9"
Iframe面板1.边框圆角 = "8px"
Iframe面板1.背景颜色 = "#f5f5f5"

Iframe面板1.置内容加载完毕回调((源对象) => {
    调试输出("页面加载完成")
    弹出提示("内容已加载")
})

添加组件(Iframe面板1)

综合示例:嵌入地图服务

本示例展示如何使用Iframe面板嵌入在线地图(如高德地图),并演示加载状态反馈。

' ========== 创建标题 ==========
变量 标题 = 创建 标签()
标题.左边 = 30
标题.顶边 = 30
标题.文本 = "📍 位置地图"
标题.字体大小 = "20px"
标题.字体粗细 = "bold"
添加组件(标题)

' ========== 创建加载状态标签 ==========
变量 状态标签 = 创建 标签()
状态标签.左边 = 30
状态标签.顶边 = 70
状态标签.文本 = "⏳ 加载中..."
状态标签.字体大小 = "14px"
状态标签.文本颜色 = "#999"
添加组件(状态标签)

' ========== 创建Iframe面板 ==========
变量 地图面板 = 创建 Iframe面板()
地图面板.左边 = 30
地图面板.顶边 = 100
地图面板.宽度 = 800
地图面板.高度 = 500
地图面板.边框 = "1px solid #e8e8e8"
地图面板.边框圆角 = "12px"
地图面板.溢出隐藏 = "hidden"

' 高德地图嵌入示例(需替换为自己的key)
地图面板.地址 = "https://uri.amap.com/marker?position=116.397428,39.90923&name=北京"

' 加载完成回调
地图面板.置内容加载完毕回调((源对象) => {
    状态标签.文本 = "✅ 地图加载完成"
    状态标签.文本颜色 = "#52c41a"
    调试输出("地图加载完成")
})

' 添加加载超时处理(延时5秒后仍显示加载中,提示用户检查网络)
变量 超时时钟 = 创建时钟(() => {
    如果(状态标签.文本 == "⏳ 加载中...")
        状态标签.文本 = "⚠️ 加载超时,请检查网络"
        状态标签.文本颜色 = "#ff4d4f"
    结束 如果
    销毁时钟(超时时钟)
}, 5000)

添加组件(地图面板)

属性详解

地址

  • 类型: 文本型
  • 说明: 设置或获取Iframe中加载的页面URL地址。支持绝对路径和相对路径。当设置此属性时,Iframe会自动加载该地址。

函数详解

发送数据(内容, 目标域名)

  • 功能: 向Iframe的父页面发送数据(通过 postMessage API)。通常用于子页面与父页面之间的跨文档通信。
  • 参数:
    • 内容:文本型,要发送的数据。
    • 目标域名:文本型,指定接收消息的父页面域名(如 "https://parent.com"),用于安全限制。可设为 "*" 表示不限制(不推荐)。
  • 返回值: 无。
  • 示例: Iframe面板1.发送数据("刷新", "https://example.com")

取面板内容对象()

  • 功能: 获取Iframe的 contentWindow 对象,可通过该对象调用子页面中的 JavaScript 函数或访问子页面的变量。注意: 仅当子页面与父页面同源时,才能访问子页面的完整内容。
  • 返回值: contentWindow 对象(原生)。
  • 示例:
    变量 子窗口 = Iframe面板1.取面板内容对象()
    如果(子窗口 != 空)
        ' 调用子页面中的函数(需同源)
        子窗口.someFunction()
    结束 如果
    

置内容加载完毕回调(回调函数)

  • 功能: 设置当Iframe内容加载完成时的回调函数。
  • 参数: 回调函数,格式为 (源对象) => { ... }源对象 为Iframe面板组件本身。
  • 返回值: 无。
  • 示例:
    Iframe面板1.置内容加载完毕回调((源对象) => {
        调试输出("加载完成")
    })
    

事件说明

内容加载完毕(源对象)

  • 功能:置内容加载完毕回调 等效,适用于设计文件(.spldg)中定义的组件。
  • 示例:
    事件 Iframe面板1.内容加载完毕(源对象)
        调试输出("Iframe内容加载完成")
    结束 事件
    

⚠️ 注意事项

  1. 跨域限制:当Iframe加载的页面与父页面不同源时,浏览器会阻止父页面访问子页面的DOM内容(如 取面板内容对象 的返回值受限),但 发送数据置内容加载完毕回调 仍然可用。
  2. 内容加载完毕的触发时机:该事件在Iframe的 onload 事件触发时调用,表示所有资源(包括样式、图片、脚本)加载完成,可能需要较长时间。
  3. 地址格式地址 支持绝对路径(如 https://example.com)和相对路径(如 /page.html)。若为相对路径,将相对于当前页面地址解析。
  4. 嵌套层级:Iframe面板可以嵌套多层,但过多的嵌套会影响性能和用户体验,建议不超过2层。
  5. 移动端适配:Iframe面板在移动端可能无法自适应,建议根据屏幕尺寸动态设置 宽度高度,或使用百分比值。
  6. 安全策略:部分网站禁止通过Iframe嵌入(通过 X-Frame-Options 响应头),此时Iframe将显示空白或错误页面。可在加载失败时给出提示。
  7. 性能影响:每个Iframe都会独立加载一个完整的页面,会消耗额外的内存和网络资源,建议合理使用。
  8. 滚动条:Iframe内部的滚动条由子页面控制,若需隐藏滚动条,可在子页面中设置 body { overflow: hidden; }
  9. URL参数传递:可通过 地址 的查询字符串(?key=value)向子页面传递参数。
  10. 加载URL 的区别加载URL 是对话框组件的方法,用于在对话框中加载页面;而Iframe面板是独立的可视组件,直接嵌入页面布局中。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档布局类组件_绝对布局 —— 配合定位Iframe
  • 文档布局类组件_弹性布局 —— 配合布局Iframe
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、事件处理等
  • 文档综合演示:嵌入地图 —— 实际应用示例

组件:弹性布局

弹性布局组件是基于 CSS Flexbox 模型封装的容器型组件,用于灵活排列子组件。它支持设置排列方向、换行模式、主轴/侧轴对齐方式、整体对齐以及子项间距,是实现水平/垂直居中、等距分布、自适应空间等布局需求的常用工具。

典型使用场景:

  • 水平导航栏(Logo + 菜单项 + 用户头像)
  • 垂直表单布局(标签 + 输入框 + 按钮)
  • 卡片列表(水平排列多个卡片,自动换行)
  • 居中对齐内容(登录框、加载提示)
  • 工具栏(按钮组、搜索框)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置子组件排列方向方向弹性布局1.方向 = "column"
设置子组件换行模式换行模式弹性布局1.换行模式 = "wrap"
设置主轴对齐方式主轴对齐弹性布局1.主轴对齐 = "center"
设置侧轴对齐方式侧轴对齐弹性布局1.侧轴对齐 = "center"
设置多行整体对齐整体对齐弹性布局1.整体对齐 = "center"
设置子项间距(行列间距)子项间距弹性布局1.子项间距 = "16px"
添加子组件添加组件(组件)弹性布局1.添加组件(按钮1)
获取子组件数量取子组件数()变量 数量 = 弹性布局1.取子组件数()
获取指定索引的子组件取子组件(索引)变量 组件 = 弹性布局1.取子组件(0)
根据类名查找子元素取子元素By类名(类名)变量 列表 = 弹性布局1.取子元素By类名("item")

样式美化参考

弹性布局的样式可通过继承的视图属性以及专用布局属性进行调整:

基础容器样式:

  • 背景与边框:背景颜色 = "#fafafa"边框 = "1px solid #e8e8e8"边框圆角 = "8px"
  • 内边距:内边距 = "16px"(让子组件与容器边缘保持距离)
  • 尺寸控制:宽度 = "100%"高度 = "auto"

常用布局模式:

布局模式属性组合
水平居中布局方向 = "row"主轴对齐 = "center"侧轴对齐 = "center"
垂直居中布局方向 = "column"主轴对齐 = "center"侧轴对齐 = "center"
水平等距分布方向 = "row"主轴对齐 = "space-between"侧轴对齐 = "center"
顶部导航栏方向 = "row"主轴对齐 = "space-between"侧轴对齐 = "center"内边距 = "0 16px"
网格卡片布局方向 = "row"换行模式 = "wrap"子项间距 = "16px"主轴对齐 = "flex-start"
垂直表单布局方向 = "column"子项间距 = "12px"侧轴对齐 = "stretch"
底部工具栏方向 = "row"主轴对齐 = "flex-end"侧轴对齐 = "center"内边距 = "8px 16px"

子项等宽/等高:

  • 设置子组件的 宽度 = "flex-grow"高度 = "flex-grow" 可让子项自动拉伸填满剩余空间。
  • 等宽子项:所有子组件 宽度 = "flex-grow"(需确保布局方向为 "row"
  • 等高子项:所有子组件 高度 = "flex-grow"(需确保布局方向为 "column"

基础示例

创建一个水平排列的按钮组,居中对齐。

变量 弹性布局1 = 创建 弹性布局()
弹性布局1.左边 = 100
弹性布局1.顶边 = 100
弹性布局1.宽度 = 400
弹性布局1.高度 = 60
弹性布局1.方向 = "row"
弹性布局1.主轴对齐 = "center"
弹性布局1.侧轴对齐 = "center"
弹性布局1.背景颜色 = "#f5f5f5"
弹性布局1.边框圆角 = "8px"
弹性布局1.子项间距 = "12px"

' 添加子组件
变量 按钮1 = 创建 按钮()
按钮1.文本 = "按钮1"
弹性布局1.添加组件(按钮1)

变量 按钮2 = 创建 按钮()
按钮2.文本 = "按钮2"
弹性布局1.添加组件(按钮2)

变量 按钮3 = 创建 按钮()
按钮3.文本 = "按钮3"
弹性布局1.添加组件(按钮3)

添加组件(弹性布局1)

综合示例:商品展示网格

本示例创建一个商品展示卡片网格,使用弹性布局的换行功能,自动排列多个商品卡片。

' ========== 创建标题 ==========
变量 标题 = 创建 标签()
标题.左边 = 50
标题.顶边 = 30
标题.文本 = "🛍️ 商品推荐"
标题.字体大小 = "20px"
标题.字体粗细 = "bold"
添加组件(标题)

' ========== 创建弹性布局(商品网格) ==========
变量 商品网格 = 创建 弹性布局()
商品网格.左边 = 50
商品网格.顶边 = 70
商品网格.宽度 = 700
商品网格.高度 = 400
商品网格.方向 = "row"
商品网格.换行模式 = "wrap"
商品网格.子项间距 = "16px"
商品网格.主轴对齐 = "flex-start"
商品网格.侧轴对齐 = "flex-start"
商品网格.背景颜色 = "#fafafa"
商品网格.边框 = "1px solid #e8e8e8"
商品网格.边框圆角 = "8px"
商品网格.内边距 = "16px"
添加组件(商品网格)

' ========== 创建商品卡片 ==========
函数 创建商品卡片(名称, 价格, 图标)
    变量 卡片 = 创建 弹性布局()
    卡片.方向 = "column"
    卡片.侧轴对齐 = "center"
    卡片.主轴对齐 = "center"
    卡片.宽度 = 150
    卡片.高度 = 180
    卡片.背景颜色 = "#ffffff"
    卡片.边框 = "1px solid #e8e8e8"
    卡片.边框圆角 = "8px"
    卡片.内边距 = "12px"
    
    变量 图标标签 = 创建 标签()
    图标标签.文本 = 图标
    图标标签.字体大小 = "32px"
    卡片.添加组件(图标标签)
    
    变量 名称标签 = 创建 标签()
    名称标签.文本 = 名称
    名称标签.字体大小 = "14px"
    名称标签.字体粗细 = "bold"
    名称标签.内边距 = "8px 0 4px"
    卡片.添加组件(名称标签)
    
    变量 价格标签 = 创建 标签()
    价格标签.文本 = "¥" + 价格
    价格标签.字体大小 = "16px"
    价格标签.文本颜色 = "#ff4d4f"
    卡片.添加组件(价格标签)
    
    返回 卡片
结束 函数

' 添加商品卡片
商品网格.添加组件(创建商品卡片("无线耳机", 299, "🎧"))
商品网格.添加组件(创建商品卡片("运动手表", 599, "⌚"))
商品网格.添加组件(创建商品卡片("蓝牙音箱", 199, "🔊"))
商品网格.添加组件(创建商品卡片("手机支架", 49, "📱"))
商品网格.添加组件(创建商品卡片("充电宝", 129, "🔋"))
商品网格.添加组件(创建商品卡片("智能手环", 399, "💪"))

属性详解

方向

  • 类型: 文本型
  • 说明: 设置或获取子组件的排列方向。可选值:
    • "row"(默认):水平从左到右
    • "row-reverse":水平从右到左
    • "column":垂直从上到下
    • "column-reverse":垂直从下到上

换行模式

  • 类型: 文本型
  • 说明: 设置或获取子组件超出容器宽度/高度时是否换行。可选值:
    • "nowrap"(默认):不换行,子组件可能会溢出
    • "wrap":换行
    • "wrap-reverse":换行且顺序反转

主轴对齐

  • 类型: 文本型
  • 说明: 设置或获取子组件在主轴方向上的对齐方式。可选值:
    • "flex-start":起始端对齐
    • "flex-end":末端对齐
    • "center":居中对齐
    • "space-between":两端对齐,项目间等距
    • "space-around":项目两侧间隔相等
    • "space-evenly":项目均匀分布,两端与边缘距离相等

侧轴对齐

  • 类型: 文本型
  • 说明: 设置或获取子组件在侧轴方向上的对齐方式。可选值:
    • "stretch"(默认):拉伸填充
    • "flex-start":起始端对齐
    • "flex-end":末端对齐
    • "center":居中对齐
    • "baseline":基线对齐

整体对齐

  • 类型: 文本型
  • 说明: 设置或获取多根轴线(多行/多列)在侧轴方向上的对齐方式。可选值同 主轴对齐,默认为 "stretch"

子项间距

  • 类型: 文本型
  • 说明: 设置或获取子组件之间的间距,支持像素值(如 "16px")。该间距同时作用于行和列,是 gap 属性的封装。

函数详解

添加组件(组件)

  • 功能: 向布局中添加一个子组件,子组件会按照布局规则自动排列。
  • 参数: 组件,继承自 视图 的组件实例。
  • 返回值: 无。
  • 示例: 弹性布局1.添加组件(按钮1)

取子组件数()

  • 功能: 获取当前布局中的子组件数量。
  • 返回值: 数值型。
  • 示例: 变量 数量 = 弹性布局1.取子组件数()

取子组件(索引)

  • 功能: 获取指定索引位置的子组件对象。
  • 参数: 索引(数值型),从 0 开始。
  • 返回值: 视图组件对象,若索引无效则返回
  • 示例: 变量 第一个组件 = 弹性布局1.取子组件(0)

取子元素By类名(类名)

  • 功能: 根据 CSS 类名获取所有匹配的子元素(原生 DOM 元素,非视图组件)。
  • 参数: 类名(文本型)。
  • 返回值: DOM 元素数组。
  • 示例: 变量 列表 = 弹性布局1.取子元素By类名("item")

取子元素By标签(标签名)

  • 功能: 根据 HTML 标签名获取所有匹配的子元素。
  • 参数: 标签名(文本型)。
  • 返回值: DOM 元素数组。
  • 示例: 变量 按钮列表 = 弹性布局1.取子元素By标签("button")

有子节点()

  • 功能: 判断当前布局是否有子节点(包含文本节点等)。
  • 返回值: 逻辑型。
  • 示例: 如果(弹性布局1.有子节点()) 调试输出("有子节点")

取末端子节点()

  • 功能: 获取最后一个子节点(可能包含文本节点)。
  • 返回值: 原生 DOM 节点。
  • 示例: 变量 最后节点 = 弹性布局1.取末端子节点()

取末端子元素()

  • 功能: 获取最后一个子元素(仅元素节点)。
  • 返回值: 原生 DOM 元素。
  • 示例: 变量 最后元素 = 弹性布局1.取末端子元素()

查询子节点(选择器)

  • 功能: 根据 CSS 选择器查询第一个匹配的子节点。
  • 参数: 选择器(文本型)。
  • 返回值: 原生 DOM 节点。
  • 示例: 变量 节点 = 弹性布局1.查询子节点(".active")

查询子节点全部(选择器)

  • 功能: 根据 CSS 选择器查询所有匹配的子节点。
  • 参数: 选择器(文本型)。
  • 返回值: DOM 节点数组。
  • 示例: 变量 列表 = 弹性布局1.查询子节点全部(".item")

事件说明

弹性布局本身不定义特有事件,但继承自 视图 的所有事件均可使用(如 置被单击回调)。


⚠️ 注意事项

  1. 方向与主轴方向 决定了主轴方向,主轴对齐侧轴对齐 基于主轴/侧轴生效,注意区分。
  2. 子项间距外边距 的区别子项间距 作用于所有子项之间,统一且易用;而子项自身的 外边距 可单独控制,两者可叠加。
  3. 换行与溢出:当 换行模式 = "wrap" 且子项总宽度超出容器宽度时,会自动换行;若 换行模式 = "nowrap",子项会溢出或挤压。
  4. 子项宽度/高度:子组件的 宽度高度 可设为 "flex-grow" 以填充剩余空间,或 "flex-shrink" 在空间不足时收缩。
  5. 嵌套布局:弹性布局可任意嵌套,实现复杂布局结构(如水平导航栏中嵌套垂直菜单)。
  6. 绝对布局 的区别弹性布局 自动管理子项位置,适合响应式布局;绝对布局 需要手动设置每个子项的位置(左边顶边),适合精确控制场景。
  7. 性能:弹性布局是纯 CSS 布局,性能优秀,适合大多数场景。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档布局类组件_绝对布局 —— 精确定位布局
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、循环语句等
  • 文档综合演示:商品展示网格 —— 实际应用示例

组件:绝对布局

绝对布局组件是一个容器型组件,允许子组件通过 左边顶边(或 右边底边)属性进行精确的像素级定位。它适合需要自由控制每个子组件位置的场景,如仪表盘、表单布局、卡片设计等。注意: 子组件需要设置 定位 = "absolute"定位 = "relative" 才能相对于父容器进行定位。

典型使用场景:

  • 仪表盘布局(图表、指标卡自由摆放)
  • 表单布局(标签与输入框精确对齐)
  • 卡片设计(多个元素叠加或精确排列)
  • 弹窗/对话框内部布局
  • 游戏界面或自定义绘图区域

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置容器尺寸宽度 / 高度绝对布局1.宽度 = 600绝对布局1.高度 = 400
设置容器背景背景颜色绝对布局1.背景颜色 = "#fafafa"
添加子组件添加组件(组件)绝对布局1.添加组件(按钮1)
子组件定位(相对于容器)左边 / 顶边(子组件上设置)按钮1.左边 = 20按钮1.顶边 = 20
子组件定位(相对于容器右下)右边 / 底边(子组件上设置)按钮1.右边 = 20按钮1.底边 = 20
获取子组件数量取子组件数()变量 数量 = 绝对布局1.取子组件数()
获取指定子组件取子组件(索引)变量 组件 = 绝对布局1.取子组件(0)
转为弹性布局转为弹性布局(方向)绝对布局1.转为弹性布局("row")

样式美化参考

绝对布局的样式可通过继承的视图属性进行调整:

容器样式:

  • 背景与边框:背景颜色 = "#ffffff"边框 = "1px solid #e8e8e8"边框圆角 = "8px"
  • 阴影效果:追加内联样式("box-shadow: 0 2px 12px rgba(0,0,0,0.08);")
  • 尺寸控制:宽度 = 600高度 = 400(或 宽度 = "100%"高度 = "100%"

子组件定位:

  • 子组件需设置 定位 = "absolute"(相对于父容器定位)或 定位 = "relative"(相对于自身正常位置偏移)
  • 使用 左边顶边 定位左上角:按钮1.左边 = 20按钮1.顶边 = 20
  • 使用 右边底边 定位右下角:按钮1.右边 = 20按钮1.底边 = 20
  • 混合定位:左边 = 20底边 = 20(左下角)

基础示例

创建一个简单的绝对布局,包含一个标题标签和一个按钮,精确控制它们的位置。

' 1. 创建绝对布局
变量 绝对布局1 = 创建 绝对布局()
绝对布局1.左边 = 50
绝对布局1.顶边 = 50
绝对布局1.宽度 = 400
绝对布局1.高度 = 300
绝对布局1.背景颜色 = "#f5f5f5"
绝对布局1.边框 = "1px solid #e8e8e8"
绝对布局1.边框圆角 = "8px"

' 2. 添加子组件(需设置定位方式)
变量 标题 = 创建 标签()
标题.定位 = "absolute"
标题.左边 = 20
标题.顶边 = 20
标题.文本 = "📌 绝对布局示例"
标题.字体大小 = "18px"
标题.字体粗细 = "bold"
绝对布局1.添加组件(标题)

变量 按钮1 = 创建 按钮()
按钮1.定位 = "absolute"
按钮1.右边 = 20
按钮1.底边 = 20
按钮1.文本 = "确定"
按钮1.宽度 = 80
按钮1.高度 = 36
按钮1.背景颜色 = "#1890ff"
按钮1.文本颜色 = "#ffffff"
按钮1.边框圆角 = "4px"
绝对布局1.添加组件(按钮1)

' 3. 添加到父容器
添加组件(绝对布局1)

综合示例:登录表单卡片

本示例使用绝对布局制作一个登录表单卡片,精确控制标题、输入框、按钮的位置,适合固定尺寸的弹窗或卡片场景。

' ========== 创建卡片容器 ==========
变量 登录卡片 = 创建 绝对布局()
登录卡片.左边 = 100
登录卡片.顶边 = 50
登录卡片.宽度 = 360
登录卡片.高度 = 280
登录卡片.背景颜色 = "#ffffff"
登录卡片.边框 = "1px solid #e8e8e8"
登录卡片.边框圆角 = "12px"
登录卡片.追加内联样式("box-shadow: 0 4px 20px rgba(0,0,0,0.1);")
添加组件(登录卡片)

' 标题
变量 标题 = 创建 标签()
标题.定位 = "absolute"
标题.左边 = 30
标题.顶边 = 24
标题.文本 = "🔐 用户登录"
标题.字体大小 = "20px"
标题.字体粗细 = "bold"
标题.文本颜色 = "#333"
登录卡片.添加组件(标题)

' 用户名输入框
变量 用户标签 = 创建 标签()
用户标签.定位 = "absolute"
用户标签.左边 = 30
用户标签.顶边 = 76
用户标签.文本 = "用户名"
用户标签.字体大小 = "14px"
用户标签.文本颜色 = "#666"
登录卡片.添加组件(用户标签)

变量 用户名输入 = 创建 单行输入框()
用户名输入.定位 = "absolute"
用户名输入.左边 = 30
用户名输入.顶边 = 100
用户名输入.宽度 = 300
用户名输入.高度 = 36
用户名输入.提示文本 = "请输入用户名"
用户名输入.边框 = "1px solid #d9d9d9"
用户名输入.边框圆角 = "4px"
用户名输入.内边距 = "8px 12px"
登录卡片.添加组件(用户名输入)

' 密码输入框
变量 密码标签 = 创建 标签()
密码标签.定位 = "absolute"
密码标签.左边 = 30
密码标签.顶边 = 152
密码标签.文本 = "密码"
密码标签.字体大小 = "14px"
密码标签.文本颜色 = "#666"
登录卡片.添加组件(密码标签)

变量 密码输入 = 创建 密码输入框()
密码输入.定位 = "absolute"
密码输入.左边 = 30
密码输入.顶边 = 176
密码输入.宽度 = 300
密码输入.高度 = 36
密码输入.占位提示 = "请输入密码"
密码输入.边框 = "1px solid #d9d9d9"
密码输入.边框圆角 = "4px"
密码输入.内边距 = "8px 12px"
登录卡片.添加组件(密码输入)

' 登录按钮
变量 登录按钮 = 创建 按钮()
登录按钮.定位 = "absolute"
登录按钮.左边 = 30
登录按钮.底边 = 24
登录按钮.宽度 = 300
登录按钮.高度 = 40
登录按钮.文本 = "登 录"
登录按钮.背景颜色 = "#1890ff"
登录按钮.文本颜色 = "#ffffff"
登录按钮.边框圆角 = "6px"
登录按钮.字体大小 = "16px"
登录卡片.添加组件(登录按钮)

' 登录按钮事件
登录按钮.置被单击回调((源对象, 事件对象) => {
    变量 用户名 = 删首尾空(用户名输入.内容)
    变量 密码 = 密码输入.取值()
    如果(用户名 == "" 或 密码 == "")
        弹出提示("请输入用户名和密码")
        返回
    结束 如果
    弹出提示("登录成功!欢迎 " + 用户名)
})

函数详解

添加组件(组件)

  • 功能: 向布局中添加一个子组件。子组件需设置 定位 = "absolute"定位 = "relative",并通过 左边顶边右边底边 属性定位。
  • 参数: 组件,继承自 视图 的组件实例。
  • 返回值: 无。
  • 示例: 绝对布局1.添加组件(按钮1)

取子组件数()

  • 功能: 获取当前布局中的子组件数量。
  • 返回值: 数值型。
  • 示例: 变量 数量 = 绝对布局1.取子组件数()

取子组件(索引)

  • 功能: 获取指定索引位置的子组件对象。
  • 参数: 索引(数值型),从 0 开始。
  • 返回值: 视图组件对象,若索引无效则返回
  • 示例: 变量 第一个组件 = 绝对布局1.取子组件(0)

取子元素By类名(类名)

  • 功能: 根据 CSS 类名获取所有匹配的子元素(原生 DOM 元素,非视图组件)。
  • 参数: 类名(文本型)。
  • 返回值: DOM 元素数组。
  • 示例: 变量 列表 = 绝对布局1.取子元素By类名("item")

取子元素By标签(标签名)

  • 功能: 根据 HTML 标签名获取所有匹配的子元素。
  • 参数: 标签名(文本型)。
  • 返回值: DOM 元素数组。
  • 示例: 变量 按钮列表 = 绝对布局1.取子元素By标签("button")

有子节点()

  • 功能: 判断当前布局是否有子节点(包含文本节点等)。
  • 返回值: 逻辑型。
  • 示例: 如果(绝对布局1.有子节点()) 调试输出("有子节点")

取末端子节点()

  • 功能: 获取最后一个子节点(可能包含文本节点)。
  • 返回值: 原生 DOM 节点。
  • 示例: 变量 最后节点 = 绝对布局1.取末端子节点()

取末端子元素()

  • 功能: 获取最后一个子元素(仅元素节点)。
  • 返回值: 原生 DOM 元素。
  • 示例: 变量 最后元素 = 绝对布局1.取末端子元素()

查询子节点(选择器)

  • 功能: 根据 CSS 选择器查询第一个匹配的子节点。
  • 参数: 选择器(文本型)。
  • 返回值: 原生 DOM 节点。
  • 示例: 变量 节点 = 绝对布局1.查询子节点(".active")

查询子节点全部(选择器)

  • 功能: 根据 CSS 选择器查询所有匹配的子节点。
  • 参数: 选择器(文本型)。
  • 返回值: DOM 节点数组。
  • 示例: 变量 列表 = 绝对布局1.查询子节点全部(".item")

转为弹性布局(方向)

  • 功能: 将当前绝对布局转换为弹性布局,子组件将按照弹性布局规则重新排列,原有的 左边顶边 等定位属性将失效。
  • 参数: 方向(文本型),可选值 "row"(水平排列)或 "column"(垂直排列)。
  • 返回值: 无。
  • 示例: 绝对布局1.转为弹性布局("row")

事件说明

绝对布局本身不定义特有事件,但继承自 视图 的所有事件均可使用(如 置被单击回调)。


⚠️ 注意事项

  1. 子组件定位方式:子组件必须设置 定位 = "absolute"定位 = "relative",否则 左边顶边 等属性不会相对于父容器生效。
  2. 容器尺寸:绝对布局本身需要有明确的 宽度高度,否则子组件的百分比定位可能无法正确计算。
  3. 响应式限制:绝对布局适合固定尺寸场景,在响应式布局中可能表现不佳。如需自适应,考虑使用 弹性布局
  4. 与弹性布局的转换转为弹性布局 会改变容器的布局模式,子组件的 左边顶边 等属性将不再生效,需重新调整子组件属性。
  5. 定位冲突:同时设置 左边右边 时,左边 优先(取决于 direction);同时设置 顶边底边 时,顶边 优先。
  6. 层级控制:子组件的叠放顺序由 显示层级(z-index)控制,数值越大越在上层。
  7. 内边距的影响:容器的 内边距 会影响子组件的定位基准点,子组件的 左边 是相对于容器内容区域(即 内边距 内侧)计算的。
  8. 性能:绝对布局使用 position: absolute,不会影响其他元素的布局,性能良好,适合大量子组件的场景。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档布局类组件_弹性布局 —— 自适应排列布局
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、条件判断等
  • 文档综合演示:登录表单卡片 —— 实际应用示例

组件:按钮

按钮组件是轻语言中最常用的交互组件之一,用于触发用户操作,支持丰富的样式定制和事件回调。它继承自 视图 类,拥有所有视图的通用属性和方法,并额外提供了单击、双击、鼠标悬停、焦点等交互事件。适用于表单提交、功能触发、页面导航、确认/取消等几乎所有需要点击交互的场景。

典型使用场景:

  • 表单提交(登录、注册、保存、重置)
  • 功能触发(打开对话框、切换状态、发送请求)
  • 确认/取消操作(删除确认、操作取消)
  • 页面导航(跳转、返回、切换页面)
  • 数据操作(添加、编辑、删除)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置按钮文本文本按钮1.文本 = "提交"
设置按钮尺寸宽度 / 高度按钮1.宽度 = 120按钮1.高度 = 40
设置背景色背景颜色按钮1.背景颜色 = "#1890ff"
设置文字颜色文本颜色按钮1.文本颜色 = "#ffffff"
设置圆角边框圆角按钮1.边框圆角 = "6px"
禁用/启用禁用按钮1.禁用 = 真
设置单击回调置被单击回调(回调函数)按钮1.置被单击回调((源对象, 事件对象) => { ... })
设置双击回调置被双击回调(回调函数)按钮1.置被双击回调((源对象, 事件对象) => { ... })
模拟点击执行单击()按钮1.执行单击()
设置鼠标悬停效果置鼠标被进入回调 / 置鼠标被移出回调见下方样式美化参考
设置键盘快捷键置键盘被按下回调按钮1.置键盘被按下回调((源对象, 事件对象) => { if (事件对象.keyCode == 13) { 执行单击() } })

样式美化参考

以下为常用样式组合示例,可根据实际需求调整:

按钮样式变体:

变体属性组合
主要按钮(Primary)背景颜色 = "#1890ff"文本颜色 = "#ffffff"
成功按钮(Success)背景颜色 = "#52c41a"文本颜色 = "#ffffff"
危险按钮(Danger)背景颜色 = "#ff4d4f"文本颜色 = "#ffffff"
警告按钮(Warning)背景颜色 = "#faad14"文本颜色 = "#ffffff"
文本按钮(Text)背景颜色 = "透明"文本颜色 = "#1890ff"边框 = "none"
边框按钮(Outline)背景颜色 = "透明"文本颜色 = "#1890ff"边框 = "1px solid #1890ff"
圆角按钮边框圆角 = "20px"(或 "50%" 实现胶囊效果)
大尺寸按钮宽度 = 280高度 = 48字体大小 = "18px"
小尺寸按钮宽度 = 80高度 = 28字体大小 = "12px"
禁用状态禁用 = 真光标样式 = "not-allowed"透明度 = 0.6
加载状态禁用 = 真文本 = "处理中..."

动态悬停效果:

通过 置鼠标被进入回调置鼠标被移出回调 可轻松实现悬停变色:

按钮1.置鼠标被进入回调((源对象, 事件对象) => {
    按钮1.背景颜色 = "#096dd9"   ' 悬停时变深
})
按钮1.置鼠标被移出回调((源对象, 事件对象) => {
    按钮1.背景颜色 = "#1890ff"   ' 恢复原色
})

自定义阴影与过渡:

使用 追加内联样式 添加 CSS 效果:

按钮1.追加内联样式("box-shadow: 0 2px 8px rgba(24,144,255,0.4); transition: all 0.3s;")
按钮1.置鼠标被进入回调((源对象) => {
    源对象.追加内联样式("transform: scale(1.02); box-shadow: 0 4px 16px rgba(24,144,255,0.6);")
})
按钮1.置鼠标被移出回调((源对象) => {
    源对象.追加内联样式("transform: scale(1); box-shadow: 0 2px 8px rgba(24,144,255,0.4);")
})

基础示例

一个最简单的按钮,点击弹出提示:

变量 按钮1 = 创建 按钮()
按钮1.左边 = 100
按钮1.顶边 = 100
按钮1.宽度 = 120
按钮1.高度 = 40
按钮1.文本 = "点击我"
按钮1.背景颜色 = "#1890ff"
按钮1.文本颜色 = "#ffffff"
按钮1.边框圆角 = "4px"

按钮1.置被单击回调((源对象, 事件对象) => {
    弹出提示("按钮被点击了!")
})

添加组件(按钮1)

综合示例:登录表单按钮(带加载状态与键盘回车)

一个完整的登录按钮,包含表单校验、加载状态、请求接口、键盘回车支持,并附带动画悬停效果。

' ========== 创建用户名编辑框 ==========
变量 编辑框_用户名 = 创建 编辑框()
编辑框_用户名.左边 = 20
编辑框_用户名.顶边 = 60
编辑框_用户名.宽度 = 200
编辑框_用户名.高度 = 36
编辑框_用户名.提示文本 = "请输入用户名"
添加组件(编辑框_用户名)

' ========== 创建密码编辑框 ==========
变量 编辑框_密码 = 创建 编辑框()
编辑框_密码.左边 = 20
编辑框_密码.顶边 = 110
编辑框_密码.宽度 = 200
编辑框_密码.高度 = 36
编辑框_密码.提示文本 = "请输入密码"
编辑框_密码.类型 = "password"
添加组件(编辑框_密码)

' ========== 创建登录按钮(带高级样式) ==========
变量 登录按钮 = 创建 按钮()
登录按钮.左边 = 20
登录按钮.顶边 = 160
登录按钮.宽度 = 200
登录按钮.高度 = 44
登录按钮.文本 = "登录"
登录按钮.背景颜色 = "#52c41a"
登录按钮.文本颜色 = "#ffffff"
登录按钮.边框圆角 = "6px"
登录按钮.字体大小 = "16px"
登录按钮.字体粗细 = "bold"
登录按钮.光标样式 = "pointer"
' 添加阴影和过渡动画
登录按钮.追加内联样式("box-shadow: 0 2px 8px rgba(82,196,26,0.4); transition: all 0.3s;")

' 悬停效果
登录按钮.置鼠标被进入回调((源对象) => {
    源对象.背景颜色 = "#389e0d"
    源对象.追加内联样式("transform: scale(1.02); box-shadow: 0 4px 16px rgba(82,196,26,0.6);")
})
登录按钮.置鼠标被移出回调((源对象) => {
    源对象.背景颜色 = "#52c41a"
    源对象.追加内联样式("transform: scale(1); box-shadow: 0 2px 8px rgba(82,196,26,0.4);")
})

' 单击事件
登录按钮.置被单击回调((源对象, 事件对象) => {
    ' 获取输入内容
    变量 用户名 = 编辑框_用户名.内容
    变量 密码 = 编辑框_密码.内容

    ' 前端校验
    如果(删首尾空(用户名) == "" 或 删首尾空(密码) == "")
        弹出提示("请输入用户名和密码")
        编辑框_用户名.获取焦点()
        返回
    结束 如果

    ' 进入加载状态
    登录按钮.禁用 = 真
    登录按钮.文本 = "登录中..."
    登录按钮.追加内联样式("opacity: 0.7;")

    ' 模拟请求(实际项目中替换为 请求接口)
    变量 待提交数据 = "username=" + URL编码(用户名) + "&password=" + URL编码(密码)
    延时执行(() => {
        ' 模拟响应
        变量 模拟成功 = 取随机整数(0, 1) == 1
        如果(模拟成功)
            保存配置("token", "mock_token_" + 取现行时间戳())
            弹出提示("登录成功!")
            切换页面("首页")
        否则
            弹出提示("登录失败:用户名或密码错误")
        结束 如果

        ' 恢复按钮状态
        登录按钮.禁用 = 假
        登录按钮.文本 = "登录"
        登录按钮.追加内联样式("opacity: 1;")
    }, 1500)
})

' 键盘回车触发登录(在密码框上按回车键)
编辑框_密码.置键盘被按下回调((源对象, 事件对象) => {
    如果(事件对象.keyCode == 13)  ' 回车键
        登录按钮.执行单击()
    结束 如果
})

添加组件(登录按钮)

属性详解(除继承外无专属属性)

按钮组件本身没有专属属性,所有样式和行为均通过继承自 视图 的属性实现。以下是常用属性的特别说明:

属性说明
文本按钮上显示的文字,支持纯文本。如需显示图标,可使用 InnerHTML图标(轻语言常量)。
禁用设为 时,按钮不可点击,样式自动变灰。注意:禁用后 置被单击回调 不会触发。
边框圆角支持数值(如 6)或带单位的字符串(如 "6px"),可设置为 "50%" 实现圆形按钮(需配合正方形尺寸)。
光标样式推荐设为 "pointer" 以增强交互感。禁用时自动变为 "not-allowed"
显示模式默认 "行内块",可设为 "块级" 使其独占一行。

函数详解

按钮组件除继承自视图的方法外,额外提供了 执行单击() 用于模拟点击。

执行单击()

  • 功能: 以编程方式触发按钮的单击事件,效果等同于用户点击。会调用所有已绑定的单击回调。
  • 返回值: 无。
  • 示例:
    按钮1.执行单击()
    

其他常用方法(继承自视图):

  • 置被单击回调(回调函数):绑定单击事件,回调参数为 (源对象, 事件对象)
  • 置被双击回调(回调函数):绑定双击事件。
  • 置鼠标被进入回调(回调函数):鼠标进入按钮时触发。
  • 置鼠标被移出回调(回调函数):鼠标移出按钮时触发。
  • 置键盘被按下回调(回调函数):键盘按键在按钮获得焦点时触发,可用于快捷键。

事件说明

按钮组件的所有事件均继承自 视图,无专属事件。常用事件如下:

事件触发时机
被单击(源对象,事件源)用户单击按钮
被双击(源对象,事件源)用户双击按钮
鼠标被进入(源对象,事件源)鼠标进入按钮区域
鼠标被移出(源对象,事件源)鼠标移出按钮区域
键盘被按下(源对象,事件源)按钮聚焦时按下键盘按键

💡 事件回调中的 事件源 包含详细信息(如鼠标坐标、按键码等),可通过 取属性值 获取。


⚠️ 注意事项

  1. 禁用状态禁用 = 真 时,按钮不会触发任何交互事件(单击、双击、鼠标事件均被阻止),但键盘事件可能仍会触发(取决于浏览器),建议在回调中额外判断。
  2. 加载状态:在执行耗时操作时,建议将按钮设为禁用并修改文本(如“加载中...”),防止用户重复点击。
  3. 事件回调中的 源对象源对象 就是按钮自身,可以直接修改其属性(如 源对象.文本 = "新文本"),无需通过外部变量。
  4. 执行单击() 的副作用:该方法会触发所有 置被单击回调,但不会触发双击或鼠标事件。
  5. 样式优先级:通过 追加内联样式 添加的 CSS 会覆盖属性设置的样式,注意优先级。
  6. 圆角与形状:设置 边框圆角 = "50%" 并要求按钮为正方形(宽度 = 高度)可实现圆形按钮。
  7. 键盘快捷键:可以通过 置键盘被按下回调 实现快捷键,例如在登录表单中按回车提交。
  8. 按钮 组件的区别:轻语言中 按钮 组件是标准交互组件,而 超链接 用于页面跳转,两者不要混淆。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档文本类组件_标签 —— 配合显示辅助文本
  • 文档文本类组件_编辑框 —— 配合输入框使用
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、条件判断等
  • 文档综合演示:登录表单 —— 完整应用示例

组件:标签

标签组件用于显示静态文本或动态变量内容,支持通过字体、字体大小、文本颜色、内容水平对齐方式、首行缩进等样式调整,常用于界面标题、表单标签、状态提示及说明文字场景。

典型使用场景:

  • 页面标题(主标题、副标题、章节标题)
  • 表单标签(用户名、密码、邮箱等字段标签)
  • 状态提示(成功、警告、错误信息)
  • 说明文字(帮助文本、提示信息)
  • 数值显示(统计数字、价格展示)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图

常用操作速查

操作属性/方法示例
设置标签文本文本标签1.文本 = "用户名:"
设置字体大小字体大小标签1.字体大小 = "16px"
设置文本颜色文本颜色标签1.文本颜色 = "#333333"
设置字体粗细字体粗细标签1.字体粗细 = "粗体"
设置文本对齐内容水平对齐方式标签1.内容水平对齐方式 = "center"
设置首行缩进首行缩进标签1.首行缩进 = "2em"
设置背景颜色背景颜色标签1.背景颜色 = "#f0f0f0"
设置禁用状态禁用标签1.禁用 = 真

样式美化参考

以下为常用样式组合示例,可根据实际需求调整:

标题样式变体:

  • 主标题:字体大小 = "24px"字体粗细 = "粗体"文本颜色 = "#333333"
  • 副标题:字体大小 = "18px"字体粗细 = "粗体"文本颜色 = "#666666"
  • 小标题:字体大小 = "16px"字体粗细 = "粗体"文本颜色 = "#999999"

状态样式:

  • 成功状态:文本颜色 = "#52c41a"文本 = "✓"(前缀图标)
  • 警告状态:文本颜色 = "#faad14"文本 = "⚠"(前缀图标)
  • 错误状态:文本颜色 = "#ff4d4f"文本 = "✗"(前缀图标)
  • 信息状态:文本颜色 = "#1890ff"文本 = "i"(前缀图标)

尺寸样式:

  • 大尺寸标签:字体大小 = "20px"高度 = 48行高 = "48px"
  • 中尺寸标签:字体大小 = "16px"高度 = 36行高 = "36px"
  • 小尺寸标签:字体大小 = "12px"高度 = 24行高 = "24px"

对齐样式:

  • 左对齐:内容水平对齐方式 = "left"(默认)
  • 居中对齐:内容水平对齐方式 = "center"
  • 右对齐:内容水平对齐方式 = "right"

交互效果:

  • 鼠标悬浮:通过 置鼠标被进入回调 改变颜色,例如:
    标签1.置鼠标被进入回调((源对象, 事件对象) => {
      标签1.文本颜色 = "#1890ff"
    })
    标签1.置鼠标被移出回调((源对象, 事件对象) => {
      标签1.文本颜色 = "#333333"
    })
    

基础示例

简单场景内完整的标签使用演示

' 1. 创建标签
变量 标签1 = 创建 标签()
' 2. 设置属性
标签1.左边 = 100
标签1.顶边 = 100
标签1.宽度 = 200
标签1.高度 = 36
标签1.文本 = "这是一段说明文本"
标签1.字体大小 = "16px"
标签1.文本颜色 = "#333333"
标签1.字体粗细 = "粗体"
标签1.内容水平对齐方式 = "center"
' 3. 设置事件回调(可选)
标签1.置被单击回调((源对象, 事件对象) => {
    弹出提示("标签被点击了!")
})
' 4. 添加到父容器
添加组件(标签1)

综合示例:用户信息卡片

本示例展示标签与编辑框、按钮配合使用的完整用户信息展示场景,所有组件均在代码中创建,不依赖外部 XML 定义。

' ========== 创建用户信息卡片容器 ==========
变量 卡片容器 = 创建 标签()
卡片容器.左边 = 20
卡片容器.顶边 = 20
卡片容器.宽度 = 360
卡片容器.高度 = 200
卡片容器.背景颜色 = "#ffffff"
卡片容器.边框圆角 = "8px"
卡片容器.边框 = "1px solid #e8e8e8"
卡片容器.内边距 = "16px"
添加组件(卡片容器)

' ========== 创建用户头像标签 ==========
变量 标签_头像 = 创建 标签()
标签_头像.左边 = 20
标签_头像.顶边 = 20
标签_头像.宽度 = 60
标签_头像.高度 = 60
标签_头像.文本 = "👤"
标签_头像.字体大小 = "32px"
标签_头像.内容水平对齐方式 = "center"
标签_头像.行高 = "60px"
添加组件(标签_头像)

' ========== 创建用户名标签 ==========
变量 标签_用户名 = 创建 标签()
标签_用户名.左边 = 100
标签_用户名.顶边 = 20
标签_用户名.宽度 = 200
标签_用户名.高度 = 30
标签_用户名.文本 = "张三"
标签_用户名.字体大小 = "18px"
标签_用户名.字体粗细 = "粗体"
标签_用户名.文本颜色 = "#333333"
添加组件(标签_用户名)

' ========== 创建邮箱标签 ==========
变量 标签_邮箱 = 创建 标签()
标签_邮箱.左边 = 100
标签_邮箱.顶边 = 55
标签_邮箱.宽度 = 220
标签_邮箱.高度 = 24
标签_邮箱.文本 = "zhangsan@example.com"
标签_邮箱.字体大小 = "14px"
标签_邮箱.文本颜色 = "#666666"
添加组件(标签_邮箱)

' ========== 创建用户状态标签 ==========
变量 标签_状态 = 创建 标签()
标签_状态.左边 = 100
标签_状态.顶边 = 85
标签_状态.宽度 = 100
标签_状态.高度 = 24
标签_状态.文本 = "✓ 在线"
标签_状态.字体大小 = "12px"
标签_状态.文本颜色 = "#52c41a"
添加组件(标签_状态)

' ========== 创建用户等级标签 ==========
变量 标签_等级 = 创建 标签()
标签_等级.左边 = 220
标签_等级.顶边 = 85
标签_等级.宽度 = 80
标签_等级.高度 = 24
标签_等级.文本 = "VIP 3"
标签_等级.字体大小 = "12px"
标签_等级.文本颜色 = "#faad14"
标签_等级.背景颜色 = "#fff7e6"
标签_等级.边框圆角 = "12px"
标签_等级.内容水平对齐方式 = "center"
标签_等级.行高 = "24px"
添加组件(标签_等级)

' ========== 创建分隔线标签 ==========
变量 标签_分隔线 = 创建 标签()
标签_分隔线.左边 = 20
标签_分隔线.顶边 = 120
标签_分隔线.宽度 = 320
标签_分隔线.高度 = 1
标签_分隔线.背景颜色 = "#f0f0f0"
添加组件(标签_分隔线)

' ========== 创建创建时间标签 ==========
变量 标签_时间 = 创建 标签()
标签_时间.左边 = 20
标签_时间.顶边 = 130
标签_时间.宽度 = 150
标签_时间.高度 = 20
标签_时间.文本 = "注册时间:2023-01-01"
标签_时间.字体大小 = "12px"
标签_时间.文本颜色 = "#999999"
添加组件(标签_时间)

' ========== 创建最后登录标签 ==========
变量 标签_登录 = 创建 标签()
标签_登录.左边 = 200
标签_登录.顶边 = 130
标签_登录.宽度 = 140
标签_登录.高度 = 20
标签_登录.文本 = "最后登录:今天"
标签_登录.字体大小 = "12px"
标签_登录.文本颜色 = "#999999"
添加组件(标签_登录)

' ========== 创建编辑按钮 ==========
变量 按钮_编辑 = 创建 按钮()
按钮_编辑.左边 = 280
按钮_编辑.顶边 = 125
按钮_编辑.宽度 = 60
按钮_编辑.高度 = 30
按钮_编辑.文本 = "编辑"
按钮_编辑.字体大小 = "12px"
按钮_编辑.背景颜色 = "transparent"
按钮_编辑.文本颜色 = "#1890ff"
按钮_编辑.边框 = "1px solid #1890ff"
按钮_编辑.边框圆角 = "4px"
按钮_编辑.置被单击回调((源对象, 事件对象) => {
    弹出提示("编辑用户信息")
})
添加组件(按钮_编辑)

属性:文本

  • 类型: 文本型
  • 说明: 设置或获取标签显示的文本内容。

属性:文本颜色

  • 类型: 文本型
  • 说明: 设置或获取标签文本的颜色,支持颜色名称(如 "red")或十六进制值(如 "#ff0000")。

属性:字体大小

  • 类型: 文本型
  • 说明: 设置或获取标签文本的字体大小,支持像素值(如 "16px")或相对值(如 "1em")。

属性:字体粗细

  • 类型: 文本型
  • 说明: 设置或获取标签文本的字体粗细,支持 "normal"(正常)、"bold"(粗体)、"lighter"(细体)等。

属性:内容水平对齐方式

  • 类型: 文本型
  • 说明: 设置或获取标签文本的水平对齐方式,支持 "left"(左对齐)、"center"(居中对齐)、"right"(右对齐)。

属性:首行缩进

  • 类型: 文本型
  • 说明: 设置或获取标签文本首行的缩进距离,支持像素值(如 "20px")或相对值(如 "2em")。

⚠️ 注意事项

  1. 文本换行:标签默认不自动换行,如需多行文本可设置 宽度 属性限制宽度。
  2. HTML内容:可通过 InnerHTML 属性设置包含HTML标签的内容。
  3. 样式继承:标签继承视图类的所有样式属性,可使用 内联样式 设置自定义CSS。
  4. 事件支持:标签支持鼠标和键盘事件,可添加交互功能。
  5. 性能优化:大量标签时建议使用 文本 属性而非 InnerHTML,性能更好。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档文本类组件_按钮 —— 与标签配合使用的按钮组件
  • 文档文本类组件_编辑框 —— 与标签配合使用的编辑框组件
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式语法规则
  • 文档综合演示:用户信息卡片 —— 完整卡片布局示例

组件:编辑框

编辑框组件用于接收用户输入的多行文本内容,是轻语言中常用的文本输入组件之一。支持设置内容、提示文本、置内容被改变回调、追加文本、追加文本行等特性,常用于意见反馈、备注说明、长文本输入、文章编辑等多行编辑场景。

典型使用场景:

  • 意见反馈(用户留言、投诉建议)
  • 备注说明(订单备注、商品描述)
  • 长文本输入(文章内容、产品介绍)
  • 评论/回复内容输入(用户评论、回复)
  • 文章编辑(用户编辑文章内容)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图

常用操作速查

操作属性/方法示例
设置/获取编辑框内容内容编辑框1.内容 = "新内容"
设置提示占位文本提示文本编辑框1.提示文本 = "请输入备注"
尾部追加文本追加文本(内容)编辑框1.追加文本("新内容")
尾部追加一行追加文本行(内容)编辑框1.追加文本行("新行")
设置内容改变回调置内容被改变回调(回调)编辑框1.置内容被改变回调((源对象, 新内容) => { ... })

样式美化参考

以下为常用样式组合示例,可根据实际需求调整:

编辑框样式变体:

  • 默认风格:边框圆角 = 6边框 = "1px solid #d9d9d9"内边距 = "8px 12px"
  • 圆角风格:边框圆角 = 20边框 = "1px solid #d9d9d9"内边距 = "10px 16px"
  • 无边框风格:边框 = "none"背景颜色 = "#f5f5f5"边框圆角 = 6
  • 下划线风格:边框 = "none"边框底边 = "2px solid #d9d9d9"边框圆角 = 0
  • 阴影风格:边框圆角 = 6边框 = "1px solid #d9d9d9"置内联样式("box-shadow", "0 2px 8px rgba(0,0,0,0.1)")
  • 大尺寸编辑框:宽度 = 400高度 = 200字体大小 = 16内边距 = "12px 16px"
  • 小尺寸编辑框:宽度 = 160高度 = 32字体大小 = 12内边距 = "4px 8px"

编辑框状态样式:

  • 聚焦效果:通过 置被获得焦点回调 动态修改 边框 = "2px solid #1890ff"
    编辑框1.置被获得焦点回调((源对象, 事件对象) => {
        编辑框1.边框 = "2px solid #1890ff"
    })
    
  • 只读状态:禁用 = 真背景颜色 = "#f5f5f5"光标样式 = "default"
  • 内容统计:通过 置内容被改变回调 实时统计字符数并更新标签文本,例如:
    编辑框1.置内容被改变回调((源对象, 新内容) => {
        标签_统计.文本 = "已输入 " + 新内容.长度 + " 个字符"
    })
    
  • 自动高度:通过 置内容被改变回调 动态设置 高度 = "auto"
    编辑框1.置内容被改变回调((源对象, 新内容) => {
        编辑框1.高度 = "auto"
    })
    

基础示例

' 1. 创建编辑框
变量 编辑框1 = 创建 编辑框()

' 2. 设置属性
编辑框1.左边 = 100
编辑框1.顶边 = 100
编辑框1.宽度 = 300
编辑框1.高度 = 120
编辑框1.提示文本 = "请输入内容"
编辑框1.内容 = "默认文本"

' 3. 设置事件回调
编辑框1.置内容被改变回调((源对象, 新内容) => {
    调试输出("新内容:" + 新内容)
})

' 4. 添加到父容器
添加组件(编辑框1)

综合示例:意见反馈表单

本示例展示编辑框与标签、按钮配合使用的完整意见反馈场景,所有组件均在代码中创建,不依赖外部 XML 定义。

' ========== 创建标题标签 ==========
变量 标签_标题 = 创建 标签()
标签_标题.左边 = 20
标签_标题.顶边 = 20
标签_标题.宽度 = 300
标签_标题.高度 = 36
标签_标题.文本 = "📝 意见反馈"
标签_标题.字体大小 = "20px"
标签_标题.字体粗细 = "粗体"
添加组件(标签_标题)

' ========== 创建提示标签 ==========
变量 标签_提示 = 创建 标签()
标签_提示.左边 = 20
标签_提示.顶边 = 65
标签_提示.宽度 = 300
标签_提示.高度 = 24
标签_提示.文本 = "请详细描述您的意见或建议:"
标签_提示.文本颜色 = "#666666"
标签_提示.字体大小 = "14px"
添加组件(标签_提示)

' ========== 创建意见内容编辑框 ==========
变量 编辑框_意见 = 创建 编辑框()
编辑框_意见.左边 = 20
编辑框_意见.顶边 = 95
编辑框_意见.宽度 = 350
编辑框_意见.高度 = 150
编辑框_意见.提示文本 = "请输入您的意见或建议..."
编辑框_意见.边框圆角 = "6px"
编辑框_意见.边框 = "1px solid #ddd"
添加组件(编辑框_意见)

' ========== 创建字符统计标签 ==========
变量 标签_统计 = 创建 标签()
标签_统计.左边 = 20
标签_统计.顶边 = 255
标签_统计.宽度 = 200
标签_统计.高度 = 24
标签_统计.文本 = "已输入 0 字符"
标签_统计.文本颜色 = "#999999"
标签_统计.字体大小 = "12px"
添加组件(标签_统计)

' ========== 创建提交按钮 ==========
变量 按钮_提交 = 创建 按钮()
按钮_提交.左边 = 280
按钮_提交.顶边 = 250
按钮_提交.宽度 = 90
按钮_提交.高度 = 36
按钮_提交.文本 = "提交反馈"
按钮_提交.背景颜色 = "#1890ff"
按钮_提交.文本颜色 = "#ffffff"
按钮_提交.边框圆角 = "6px"
按钮_提交.字体大小 = "16px"
添加组件(按钮_提交)

' ========== 内容改变事件 ==========
编辑框_意见.置内容被改变回调((源对象, 新内容) => {
    ' 更新字符统计
    变量 长度 = 取文本长度(新内容)
    标签_统计.文本 = "已输入 " + 长度 + " 字符"
})

' ========== 提交按钮点击事件 ==========
按钮_提交.置被单击回调((源对象, 事件对象) => {
    变量 意见内容 = 编辑框_意见.内容

    如果(意见内容 == "" 或 删首尾空(意见内容) == "")
        弹出提示("请先输入意见内容!")
        返回
    结束 如果

    按钮_提交.禁用 = 真
    按钮_提交.文本 = "提交中..."

    ' 模拟提交(实际开发中替换为请求接口)
    延时执行(() => {
        按钮_提交.禁用 = 假
        按钮_提交.文本 = "提交反馈"
        弹出提示("✅ 意见提交成功,感谢您的反馈!")
        编辑框_意见.内容 = ""
        标签_统计.文本 = "已输入 0 字符"
    }, 1500)
})

属性:内容

  • 类型: 文本型
  • 说明: 设置或获取当前编辑框的内容。

属性:提示文本

  • 类型: 文本型
  • 说明: 设置或获取当前编辑框的提示文本。

函数:追加文本(内容)

在编辑框内容的尾部追加一段文本内容。

函数:追加文本行(内容)

在编辑框的内容尾部追加一行内容;换行符在追加的文本后面。

函数:置内容被改变回调(回调函数)

功能: 设置当编辑框内容被改变时的回调函数。每当用户输入、删除或粘贴文本时,系统会自动调用传入的回调函数。

参数:

  • 回调函数:拉姆达表达式,格式为 (源对象, 新内容) => { 代码体 }
    • 源对象:触发事件的编辑框组件本身
    • 新内容:当前编辑框中的完整文本内容

返回值:

示例:

编辑框1.置内容被改变回调((源对象, 新内容) => {
    调试输出("内容变为:" + 新内容)
})

事件:内容被改变(源对象,新内容)

功能: 当编辑框内容被改变时触发并回调该事件。

参数:

  • 源对象:触发事件的编辑框组件本身
  • 新内容:当前编辑框中的完整文本内容

示例:

仅支持 .spldg 文件中定义的组件通过事件语句使用(VB6风格):

事件 编辑框1.内容被改变(源对象, 新内容)
    调试输出("内容变为:" + 新内容)
结束 事件

⚠️ 注意事项

  1. 多行文本:编辑框支持多行文本输入,按回车键可换行。
  2. 内容长度:编辑框没有内置的最大长度限制,如需限制可使用 取文本长度(编辑框1.内容) 自行校验。
  3. 提示文本提示文本 仅在编辑框为空且未获得焦点时显示,输入内容后会消失。
  4. 事件回调置内容被改变回调 在每次内容变化时都会触发(包括输入、删除、粘贴等操作),回调中应避免执行耗时操作。
  5. 追加文本追加文本行 会在文本末尾自动添加换行符(\n),适合批量添加多行内容。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档文本类组件_标签 —— 与编辑框配合使用的标签组件
  • 文档文本类组件_按钮 —— 与编辑框配合使用的按钮组件
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式语法规则
  • 文档综合演示:意见反馈表单 —— 完整反馈表单示例

组件:单行输入框

单行输入框组件用于接收用户输入的单行数据,支持设置内容、提示文本、类型、禁用、只读、选中、最大长度、名称、清空等特性,常用于用户名输入、搜索框、单行文本采集等场景。

典型使用场景:

  • 用户登录(用户名、密码输入)
  • 搜索功能(关键词搜索、条件筛选)
  • 信息录入(姓名、电话、邮箱等)
  • 参数设置(配置项、偏好设置)
  • 数据验证(格式检查、实时反馈)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对-align到左(目标组件, 偏移量)、左侧对-align到右(目标组件, 偏移量)、底边对-align到顶(目标组件, 偏移量)、顶边对-align到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图

常用操作速查

操作属性/方法示例
设置/获取输入内容内容单行输入框1.内容 = "张三"
设置提示文本提示文本单行输入框1.提示文本 = "请输入用户名"
设置输入类型类型单行输入框1.类型 = "email"
设置禁用状态禁用单行输入框1.禁用 = 真
设置只读状态只读单行输入框1.只读 = 真
选中/取消选中选中单行输入框1.选中 = 真
设置最大长度最大长度单行输入框1.最大长度 = 20
设置输入名称名称单行输入框1.名称 = "username"
清空输入内容清空()单行输入框1.清空()
设置内容改变回调置内容被改变回调(回调)单行输入框1.置内容被改变回调((源对象, 新内容) => { ... })

样式美化参考

以下为常用样式组合示例,可根据实际需求调整:

输入框样式变体:

  • 标准输入框:边框圆角 = 6边框 = "1px solid #d9d9d9"内边距 = "8px 12px"背景颜色 = "#ffffff"
  • 圆角输入框:边框圆角 = 20边框 = "1px solid #d9d9d9"内边距 = "10px 16px"
  • 下划线输入框:边框 = "none"边框底边 = "2px solid #d9d9d9"边框圆角 = 0
  • 阴影输入框:边框圆角 = 6边框 = "1px solid #d9d9d9"置内联样式("box-shadow", "0 2px 8px rgba(0,0,0,0.1)")

状态样式:

  • 正常状态:边框 = "1px solid #d9d9d9"
  • 聚焦状态:边框 = "2px solid #1890ff"
  • 错误状态:边框 = "1px solid #ff4d4f"
  • 成功状态:边框 = "1px solid #52c41a"
  • 禁用状态:背景颜色 = "#f5f5f5"光标样式 = "not-allowed"透明度 = 0.6
  • 只读状态:背景颜色 = "#fafafa"光标样式 = "default"

尺寸样式:

  • 大尺寸输入框:宽度 = 400高度 = 48字体大小 = 16内边距 = "12px 16px"
  • 中尺寸输入框:宽度 = 300高度 = 36字体大小 = 14内边距 = "8px 12px"
  • 小尺寸输入框:宽度 = 160高度 = 28字体大小 = 12内边距 = "4px 8px"

特殊类型样式:

  • 密码输入框:类型 = "password"字体大小 = "14px"
  • 数字输入框:类型 = "number"内容水平对齐方式 = "right"
  • 搜索输入框:类型 = "search"置内联样式("background-image", "url('search-icon.png')")
  • 邮箱输入框:类型 = "email"边框 = "1px solid #d9d9d9"

搜索框样式:

  • 基础搜索:类型 = "search"提示文本 = "请输入搜索关键词"
  • 带图标搜索:置内联样式("background-image", "url('search-icon.png')")置内联样式("background-position", "12px center")
  • 搜索按钮组合:宽度 = 200边框圆角 = "20px"置内联样式("padding-left", "40px")

验证状态样式:

  • 实时验证:通过 置内容被改变回调 动态改变边框颜色
    单行输入框1.置内容被改变回调((源对象, 新内容) => {
      如果(为空(新内容))
          单行输入框1.边框 = "1px solid #ff4d4f"  ' 错误状态
      否则
          单行输入框1.边框 = "1px solid #52c41a"  ' 成功状态
      结束 如果
    })
    

基础示例

简单场景内完整的单行输入框使用演示

' 1. 创建单行输入框
变量 单行输入框1 = 创建 单行输入框()
' 2. 设置属性
单行输入框1.左边 = 100
单行输入框1.顶边 = 100
单行输入框1.宽度 = 300
单行输入框1.高度 = 36
单行输入框1.类型 = "text"
单行输入框1.提示文本 = "请输入用户名"
单行输入框1.最大长度 = 20
单行输入框1.内容 = "张三"
单行输入框1.名称 = "username"
单行输入框1.边框圆角 = "6px"
单行输入框1.边框 = "1px solid #d9d9d9"
单行输入框1.内边距 = "8px 12px"
' 3. 设置事件回调
单行输入框1.置内容被改变回调((源对象, 新内容) => {
    ' 实时验证用户名格式
    变量 长度 = 取文本长度(新内容)
    如果(长度 < 2 或 长度 > 20)
        单行输入框1.边框 = "1px solid #ff4d4f"
        单行输入框1.提示文本 = "用户名长度应在2-20位之间"
    否则
        单行输入框1.边框 = "1px solid #52c41a"
        单行输入框1.提示文本 = "用户名格式正确"
    结束 如果
    
    调试输出("用户名:" + 新内容)
})
' 4. 设置焦点事件
单行输入框1.置被获得焦点回调((源对象, 事件对象) => {
    单行输入框1.边框 = "2px solid #1890ff"
})
单行输入框1.置被失去焦点回调((源对象, 事件对象) => {
    单行输入框1.边框 = "1px solid #d9d9d9"
})
' 5. 添加到父容器
添加组件(单行输入框1)

综合示例:用户登录表单

本示例展示单行输入框在登录表单中的综合应用,包含用户名、密码输入,实时验证,焦点状态管理等功能。

' ========== 创建登录表单容器 ==========
变量 登录容器 = 创建 标签()
登录容器.左边 = 50
登录容器.顶边 = 50
登录容器.宽度 = 400
登录容器.高度 = 300
登录容器.背景颜色 = "#ffffff"
登录容器.边框圆角 = "8px"
登录容器.边框 = "1px solid #e8e8e8"
登录容器.内边距 = "32px"
添加组件(登录容器)

' ========== 创建登录标题 ==========
变量 标题 = 创建 标签()
标题.左边 = 0
标题.顶边 = 0
标题.宽度 = 100%
标题.高度 = 48
标题.文本 = "用户登录"
标题.字体大小 = "24px"
标题.字体粗细 = "粗体"
标题.文本颜色 = "#333333"
标题.内容水平对齐方式 = "center"
添加组件(标题)

' ========== 创建用户名输入框 ==========
变量 输入框_用户名 = 创建 单行输入框()
输入框_用户名.左边 = 0
输入框_用户名.顶边 = 60
输入框_用户名.宽度 = 100%
输入框_用户名.高度 = 44
输入框_用户名.类型 = "text"
输入框_用户名.提示文本 = "请输入用户名"
输入框_用户名.最大长度 = 20
输入框_用户名.边框圆角 = "6px"
输入框_用户名.边框 = "1px solid #d9d9d9"
输入框_用户名.内边距 = "0 12px"
输入框_用户名.置内容被改变回调((源对象, 新内容) => {
    ' 用户名验证
    变量 长度 = 取文本长度(新内容)
    如果(长度 < 2 或 长度 > 20)
        输入框_用户名.边框 = "1px solid #ff4d4f"
    否则
        输入框_用户名.边框 = "1px solid #d9d9d9"
    结束 如果
})
输入框_用户名.置被获得焦点回调((源对象, 事件对象) => {
    输入框_用户名.边框 = "2px solid #1890ff"
})
输入框_用户名.置被失去焦点回调((源对象, 事件对象) => {
    输入框_用户名.边框 = "1px solid #d9d9d9"
})
添加组件(输入框_用户名)

' ========== 创建密码输入框 ==========
变量 输入框_密码 = 创建 单行输入框()
输入框_密码.左边 = 0
输入框_密码.顶边 = 116
输入框_密码.宽度 = 100%
输入框_密码.高度 = 44
输入框_密码.类型 = "password"
输入框_密码.提示文本 = "请输入密码"
输入框_密码.最大长度 = 20
输入框_密码.边框圆角 = "6px"
输入框_密码.边框 = "1px solid #d9d9d9"
输入框_密码.内边距 = "0 12px"
输入框_密码.置内容被改变回调((源对象, 新内容) => {
    ' 密码强度检测
    变量 长度 = 取文本长度(新内容)
    如果(长度 < 6)
        输入框_密码.边框 = "1px solid #ff4d4f"
    否则 如果(长度 >= 8)
        输入框_密码.边框 = "1px solid #52c41a"
    否则
        输入框_密码.边框 = "1px solid #faad14"
    结束 如果
})
输入框_密码.置被获得焦点回调((源对象, 事件对象) => {
    输入框_密码.边框 = "2px solid #1890ff"
})
输入框_密码.置被失去焦点回调((源对象, 事件对象) => {
    输入框_密码.边框 = "1px solid #d9d9d9"
})
添加组件(输入框_密码)

' ========== 创建记住密码复选框 ==========
变量 复选框_记住 = 创建 标签()
复选框_记住.左边 = 0
复选框_记住.顶边 = 172
复选框_记住.宽度 = 200
复选框_记住.高度 = 24
复选框_记住.文本 = "记住密码"
复选框_记住.字体大小 = "14px"
复选框_记住.文本颜色 = "#666666"
添加组件(复选框_记住)

' ========== 创建登录按钮 ==========
变量 按钮_登录 = 创建 按钮()
按钮_登录.左边 = 0
按钮_登录.顶边 = 208
按钮_登录.宽度 = 100%
按钮_登录.高度 = 44
按钮_登录.文本 = "登录"
按钮_登录.背景颜色 = "#1890ff"
按钮_登录.文本颜色 = "#ffffff"
按钮_登录.边框圆角 = "6px"
按钮_登录.字体大小 = "16px"
按钮_登录.置被单击回调((源对象, 事件对象) => {
    ' 验证输入
    如果(输入框_用户名.内容 == "" 或 输入框_密码.内容 == "")
        弹出提示("请输入用户名和密码")
        返回
    结束 如果
    
    ' 模拟登录
    按钮_登录.禁用 = 真
    按钮_登录.文本 = "登录中..."
    
    延时执行(() => {
        按钮_登录.禁用 = 假
        按钮_登录.文本 = "登录"
        
        如果(输入框_用户名.内容 == "admin" 且 输入框_密码.内容 == "123456")
            弹出提示("登录成功!")
            ' 这里可以添加页面跳转逻辑
        否则
            弹出提示("用户名或密码错误")
        结束 如果
    }, 1500)
})
添加组件(按钮_登录)

' ========== 创建忘记密码链接 ==========
变量 链接_忘记 = 创建 超链接()
链接_忘记.左边 = 0
链接_忘记.顶边 = 264
链接_忘记.宽度 = 100%
链接_忘记.高度 = 24
链接_忘记.文本 = "忘记密码?"
链接_忘记.文本颜色 = "#1890ff"
链接_忘记.字体大小 = "14px"
链接_忘记.内容水平对齐方式 = "right"
链接_忘记.置被单击回调((源对象, 事件对象) => {
    弹出提示("跳转到密码重置页面")
})
添加组件(链接_忘记)

属性:内容

  • 类型: 文本型
  • 说明: 设置或获取当前输入框中的文本内容。

属性:提示文本

  • 类型: 文本型
  • 说明: 设置或获取当前输入框的提示文本,当输入框为空时显示。

属性:类型

  • 类型: 文本型
  • 说明: 设置或获取当前输入框接收输入的类型,支持:
    • text:普通文本输入(默认)
    • password:密码输入(显示为圆点)
    • email:邮箱输入
    • tel:电话号码输入
    • number:数字输入
    • search:搜索输入框
    • url:URL地址输入
    • date:日期选择
    • time:时间选择

属性:禁用

  • 类型: 逻辑型
  • 说明: 设置或获取当前输入框是否禁用,禁用后用户无法输入。

属性:只读

  • 类型: 逻辑型
  • 说明: 设置或获取当前输入框是否为只读状态,只读状态下用户无法修改内容但可以查看。

属性:选中

  • 类型: 逻辑型
  • 说明: 设置或获取当前输入框是否被选中(高亮显示)。

属性:最大长度

  • 类型: 数值型
  • 说明: 设置或获取当前输入框允许输入的最大字符数。

属性:名称

  • 类型: 文本型
  • 说明: 设置或获取当前输入框的名称,用于表单提交时标识数据。

函数:清空()

清空当前输入框中的文本内容。

示例:

' 清空输入框
单行输入框1.清空()

函数:置内容被改变回调(回调函数)

设置当输入框内容被改变时的回调函数,回调函数返回两个参数:(事件对象, 新内容)

回调函数格式:

单行输入框1.置内容被改变回调((源对象, 新内容) => {
    ' 处理内容变化
    调试输出("新内容:" + 新内容)
})

事件:内容被改变(源对象,新内容)

当输入框内容被改变时触发并回调该事件。

事件处理示例:

事件 单行输入框1.内容被改变(源对象, 新内容)
    调试输出("内容变为:" + 新内容)
结束 事件

⚠️ 注意事项

  1. 输入验证:建议在 置内容被改变回调 中添加实时验证逻辑,提升用户体验。
  2. 类型限制:不同输入类型有不同的验证规则,如 email 会自动验证邮箱格式。
  3. 性能优化:避免在回调中执行耗时操作,特别是频繁触发的内容变化事件。
  4. 移动端适配:移动端设备上,不同输入类型会显示不同的键盘布局,需考虑用户体验。
  5. 无障碍访问:建议为输入框添加适当的 aria-label 属性,提升可访问性。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档文本类组件_标签 —— 与单行输入框配合使用的标签组件
  • 文档文本类组件_按钮 —— 与单行输入框配合使用的按钮组件
  • 文档文本类组件_表单 —— 完整的表单组件
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式语法规则

组件:密码输入框

密码输入框组件用于安全的密码输入,输入内容默认以圆点或星号掩码显示,防止窥屏。支持设置占位提示、最大长度、禁用状态、明文/密文切换以及输入值改变回调。适用于用户登录、密码修改、安全验证等需要保护密码信息的场景。

典型使用场景:

  • 用户登录(账号密码输入)
  • 密码修改/重置(旧密码、新密码、确认密码)
  • 安全验证(支付密码、交易密码)
  • 表单中的敏感信息输入(身份证号、密钥)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置密码内容密码输入框1.值 = "123456"
设置占位提示文本占位提示密码输入框1.占位提示 = "请输入密码"
设置最大输入长度最大长度密码输入框1.最大长度 = 20
禁用/启用输入框禁用密码输入框1.禁用 = 真
切换密码可见性置可见(是否可见)密码输入框1.置可见(真)
获取当前密码值取值()变量 密码 = 密码输入框1.取值()
清空密码输入清空()密码输入框1.清空()
设置值改变回调置输入被改变回调(回调函数)密码输入框1.置输入被改变回调((源对象, 值) => { ... })

样式美化参考

密码输入框的外观可通过继承的视图属性进行调整:

  • 整体容器:通过 宽度高度背景颜色边框(如 "1px solid #d9d9d9")、边框圆角(建议 "6px")等属性美化。
  • 字体样式:通过 字体大小(建议 "14px")、文本颜色 控制输入文字外观。
  • 内边距:使用 内边距(如 "8px 12px")控制输入框内边距。
  • 占位提示样式:占位文本的颜色由浏览器默认控制,可通过 CSS 伪类 ::placeholder 自定义。
  • 禁用状态禁用 = 真 时,输入框变灰且不可交互。

CSS 美化示例(在项目 CSS 文件中定义):

.my-password-input {
    border: 1px solid #d9d9d9;
    border-radius: 6px;
    padding: 8px 12px;
    font-size: 14px;
    transition: border-color 0.3s;
}
.my-password-input:focus {
    border-color: #1890ff;
    outline: none;
    box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
}
.my-password-input:disabled {
    background-color: #f5f5f5;
    cursor: not-allowed;
}
.my-password-input::placeholder {
    color: #bfbfbf;
}

在代码中应用样式类:密码输入框1.添加样式类("my-password-input")


基础示例

创建一个简单的密码输入框,包含占位提示和最大长度限制。

变量 密码输入框1 = 创建 密码输入框()
密码输入框1.左边 = 50
密码输入框1.顶边 = 50
密码输入框1.宽度 = 300
密码输入框1.高度 = 36
密码输入框1.边框 = "1px solid #d9d9d9"
密码输入框1.边框圆角 = "6px"
密码输入框1.内边距 = "8px 12px"
密码输入框1.字体大小 = "14px"
密码输入框1.占位提示 = "请输入密码"
密码输入框1.最大长度 = 20
添加组件(密码输入框1)

综合示例:用户登录表单

本示例构建一个完整的登录表单,包含用户名、密码输入框,密码可见性切换功能,以及登录校验逻辑。

' ========== 创建表单容器 ==========
变量 表单容器 = 创建 绝对布局()
表单容器.左边 = 50
表单容器.顶边 = 30
表单容器.宽度 = 320
表单容器.背景颜色 = "#ffffff"
表单容器.边框 = "1px solid #e8e8e8"
表单容器.边框圆角 = "12px"
表单容器.内边距 = "24px"
添加组件(表单容器)

' 标题
变量 标题 = 创建 标签()
标题.文本 = "🔐 用户登录"
标题.字体大小 = "20px"
标题.字体粗细 = "bold"
标题.文本颜色 = "#333"
标题.内边距 = "0 0 16px 0"
表单容器.添加组件(标题)

' 用户名输入框
变量 用户标签 = 创建 标签()
用户标签.文本 = "用户名"
用户标签.字体大小 = "14px"
用户标签.文本颜色 = "#666"
用户标签.内边距 = "8px 0 4px"
表单容器.添加组件(用户标签)

变量 用户名输入 = 创建 单行输入框()
用户名输入.宽度 = 272
用户名输入.高度 = 36
用户名输入.提示文本 = "请输入用户名"
用户名输入.边框 = "1px solid #d9d9d9"
用户名输入.边框圆角 = "6px"
用户名输入.内边距 = "8px 12px"
用户名输入.字体大小 = "14px"
表单容器.添加组件(用户名输入)

' 密码输入框
变量 密码标签 = 创建 标签()
密码标签.文本 = "密码"
密码标签.字体大小 = "14px"
密码标签.文本颜色 = "#666"
密码标签.内边距 = "12px 0 4px"
表单容器.添加组件(密码标签)

变量 密码输入 = 创建 密码输入框()
密码输入.宽度 = 272
密码输入.高度 = 36
密码输入.占位提示 = "请输入密码"
密码输入.边框 = "1px solid #d9d9d9"
密码输入.边框圆角 = "6px"
密码输入.内边距 = "8px 12px"
密码输入.字体大小 = "14px"
密码输入.最大长度 = 20
表单容器.添加组件(密码输入)

' 显示密码切换按钮
变量 显示密码按钮 = 创建 按钮()
显示密码按钮.文本 = "👁"
显示密码按钮.宽度 = 32
显示密码按钮.高度 = 32
显示密码按钮.背景颜色 = "transparent"
显示密码按钮.边框 = "none"
显示密码按钮.字体大小 = "18px"
显示密码按钮.光标样式 = "pointer"
' 由于绝对布局,需要定位到密码输入框右侧
显示密码按钮.左边 = 286
显示密码按钮.顶边 = 190  ' 需要根据实际布局调整,此处简化
表单容器.添加组件(显示密码按钮)

' 登录按钮
变量 登录按钮 = 创建 按钮()
登录按钮.文本 = "登 录"
登录按钮.宽度 = 272
登录按钮.高度 = 44
登录按钮.背景颜色 = "#1890ff"
登录按钮.文本颜色 = "#ffffff"
登录按钮.边框圆角 = "6px"
登录按钮.字体大小 = "16px"
登录按钮.内边距 = "16px 0 0"
表单容器.添加组件(登录按钮)

' 错误提示标签
变量 错误提示 = 创建 标签()
错误提示.文本 = ""
错误提示.字体大小 = "14px"
错误提示.文本颜色 = "#ff4d4f"
错误提示.内边距 = "8px 0 0"
错误提示.可视 = "hidden"
表单容器.添加组件(错误提示)

' ========== 切换密码可见性 ==========
变量 密码可见 = 假
显示密码按钮.置被单击回调((源对象, 事件对象) => {
    密码可见 = !密码可见
    密码输入.置可见(密码可见)
    显示密码按钮.文本 = 密码可见 ? "🙈" : "👁"
})

' ========== 登录校验 ==========
登录按钮.置被单击回调((源对象, 事件对象) => {
    变量 用户名 = 删首尾空(用户名输入.内容)
    变量 密码 = 删首尾空(密码输入.取值())
    
    ' 校验
    如果(用户名 == "")
        错误提示.文本 = "请输入用户名"
        错误提示.可视 = "visible"
        用户名输入.获取焦点()
        返回
    结束 如果
    如果(密码 == "")
        错误提示.文本 = "请输入密码"
        错误提示.可视 = "visible"
        密码输入.获取焦点()
        返回
    结束 如果
    
    错误提示.可视 = "hidden"
    登录按钮.禁用 = 真
    登录按钮.文本 = "登录中..."
    
    ' 模拟登录请求
    延时执行(() => {
        登录按钮.禁用 = 假
        登录按钮.文本 = "登 录"
        如果(用户名 == "admin" 且 密码 == "123456")
            弹出提示("登录成功")
            切换页面("首页")
        否则
            错误提示.文本 = "用户名或密码错误"
            错误提示.可视 = "visible"
        结束 如果
    }, 1000)
})

' ========== 回车快速登录 ==========
密码输入.置键盘被按下回调((源对象, 事件对象) => {
    如果(事件对象.keyCode == 13)  ' 回车键
        登录按钮.执行单击()
    结束 如果
})

属性详解

  • 类型: 文本型
  • 说明: 设置或获取当前密码输入框中的文本内容。设置后,内容会以掩码形式显示(如圆点或星号)。

占位提示

  • 类型: 文本型
  • 说明: 设置或获取输入框为空时显示的占位提示文本,通常用于提示用户输入格式。当输入框获得焦点或开始输入后,占位文本消失。

禁用

  • 类型: 逻辑型
  • 说明: 设置或获取是否禁用输入框。禁用后,用户无法输入内容,样式变灰。默认为

最大长度

  • 类型: 数值型
  • 说明: 设置或获取输入框允许输入的最大字符数。当输入达到最大长度后,无法再输入更多字符。默认为无限制。

函数详解

置可见(是否可见)

  • 功能: 切换密码的明文/密文显示。当 是否可见 = 真 时,密码明文显示;当为 时,密码以掩码显示。
  • 参数: 是否可见(逻辑型)。
  • 返回值: 无。
  • 示例: 密码输入框1.置可见(真) 显示明文密码

取值()

  • 功能: 获取当前密码输入框中的实际文本内容(无论当前是否可见)。
  • 返回值: 文本型,当前输入框中的密码字符串。
  • 示例: 变量 密码 = 密码输入框1.取值()

清空()

  • 功能: 清空密码输入框中的所有内容。
  • 返回值: 无。
  • 示例: 密码输入框1.清空()

置输入被改变回调(回调函数)

  • 功能: 设置当密码输入框内容发生变化时的回调函数。
  • 参数: 回调函数,格式为 (源对象, 当前值) => { ... }
    • 源对象:触发事件的密码输入框组件本身。
    • 当前值:变化后的密码值(文本型)。
  • 返回值: 无。
  • 示例:
    密码输入框1.置输入被改变回调((源对象, 当前值) => {
        调试输出("密码已变更,当前长度:" + 取文本长度(当前值))
    })
    

事件说明

输入被改变(源对象, 当前值)

  • 功能:置输入被改变回调 等效,适用于设计文件(.spldg)中定义的组件。
  • 示例:
    事件 密码输入框1.输入被改变(源对象, 当前值)
        调试输出("密码:" + 当前值)
    结束 事件
    

⚠️ 注意事项

  1. 密码可见性默认关闭:组件默认以掩码形式显示密码,确保安全。可通过 置可见(真) 切换为明文,但建议仅在用户主动操作时允许。
  2. 安全处理:获取密码值后,应尽快使用并清空内存中的敏感数据,避免日志或调试输出中泄露密码。
  3. 占位提示不参与密码校验占位提示 仅用于提示用户,不会影响实际密码值。
  4. 最大长度限制最大长度 会阻止用户输入超过限制的字符,但通过代码设置 时不受此限制。
  5. 禁用状态下的行为禁用 = 真 时,输入框不可交互,且无法通过代码设置 (设置会被忽略)。但 取值() 仍可获取之前的值。
  6. 回调触发时机置输入被改变回调 会在用户每次输入、删除或粘贴内容时触发,通过代码设置 也会触发。
  7. 样式与布局:密码输入框的宽度和高度可通过 宽度高度 属性设置,建议设置合适的高度(如 36px)以保证视觉统一。
  8. 与普通输入框的区别:密码输入框专门用于敏感信息输入,具有掩码显示功能,而 单行输入框类型 = "password" 也可实现类似功能,但密码输入框提供了更便捷的可见性切换方法。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档文本类组件_单行输入框 —— 普通文本输入框
  • 文档其它通用类组件_数字输入框 —— 数字输入框组件
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、条件判断等
  • 文档综合演示:用户登录表单 —— 实际应用示例

组件:单选框

单选框(Radio Button)组件用于在一组互斥的选项中选择一项,同一组中只能有一个被选中。它支持设置标题、选中状态、禁用状态,并可通过设置相同的 name 属性(或通过 置属性值)来将多个单选框归为一组。常用于性别选择、支付方式、选项偏好等场景。

典型使用场景:

  • 性别选择(男/女/其他)
  • 支付方式选择(微信/支付宝/银行卡)
  • 订阅计划选择(免费/付费/企业版)
  • 评价等级选择(满意/一般/不满意)
  • 选项选择(是/否/不确定)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置标题文本标题单选框1.标题 = "男"
设置选中状态选中单选框1.选中 = 真
设置分组名称(需同组相同)置属性值("name", 组名)单选框1.置属性值("name", "gender")
禁用/启用组件禁用单选框1.禁用 = 真
设置选中状态改变回调置选中状态被改变回调(回调函数)单选框1.置选中状态被改变回调((源对象, 新选中状态) => { ... })

样式美化参考

单选框的外观可通过继承的视图属性以及 CSS 类进行美化:

  • 整体容器:通过 宽度高度背景颜色边框边框圆角 等属性美化。
  • 字体样式:通过 字体大小(建议 "14px")、文本颜色 控制标题文字样式。
  • 内边距:使用 内边距(如 "4px 8px")控制内容与边框的距离。
  • 选中状态:可通过 CSS 类自定义选中时的背景色、边框色。

样式变体示例:

变体属性组合
圆形单选框(默认)边框圆角 = "50%"宽度 = 20高度 = 20
方形单选框边框圆角 = "4px"宽度 = 20高度 = 20
大尺寸单选框宽度 = 24高度 = 24字体大小 = "16px"
选中状态样式背景颜色 = "#1890ff"边框 = "2px solid #1890ff"
未选中状态样式背景颜色 = "#ffffff"边框 = "1px solid #d9d9d9"
禁用状态样式背景颜色 = "#f5f5f5"边框 = "1px solid #d9d9d9"透明度 = "0.6"
水平布局(多个单选框并排)显示模式 = "行内块"外边距右 = "16px"
垂直布局(多个单选框堆叠)显示模式 = "块级"外边距底 = "8px"

单选框本身的圆形/方形由组件内部实现,通过 边框圆角 等属性可能无法直接改变形状,建议使用 CSS 类自定义。


基础示例

创建两个单选框(男/女),默认选中“男”,并设置分组名称 "gender"

' 创建男单选框
变量 单选框_男 = 创建 单选框()
单选框_男.左边 = 50
单选框_男.顶边 = 50
单选框_男.标题 = "男"
单选框_男.选中 = 真
单选框_男.置属性值("name", "gender")  ' 分组名称
添加组件(单选框_男)

' 创建女单选框
变量 单选框_女 = 创建 单选框()
单选框_女.左边 = 50
单选框_女.顶边 = 80
单选框_女.标题 = "女"
单选框_女.选中 = 假
单选框_女.置属性值("name", "gender")
添加组件(单选框_女)

' 绑定选中改变事件(可只绑定其中一个,事件会携带新状态)
单选框_男.置选中状态被改变回调((源对象, 新选中状态) => {
    如果(新选中状态)
        弹出提示("选择了:男")
    结束 如果
})

单选框_女.置选中状态被改变回调((源对象, 新选中状态) => {
    如果(新选中状态)
        弹出提示("选择了:女")
    结束 如果
})

综合示例:支付方式选择

本示例展示一个支付方式选择界面,包含三种支付方式(微信、支付宝、银行卡),选中后显示对应图标和说明,并实时更新支付方式。

' ========== 创建面板 ==========
变量 支付面板 = 创建 卡片框()
支付面板.左边 = 50
支付面板.顶边 = 50
支付面板.宽度 = 360
支付面板.标题 = "💳 选择支付方式"
支付面板.边框 = "1px solid #e8e8e8"
支付面板.边框圆角 = "12px"
支付面板.内边距 = "16px"
添加组件(支付面板)

' 提示标签
变量 提示标签 = 创建 标签()
提示标签.文本 = "请选择一种支付方式:"
提示标签.字体大小 = "14px"
提示标签.文本颜色 = "#666"
提示标签.内边距 = "0 0 12px 0"
支付面板.添加组件(提示标签)

' 方式1:微信支付
变量 支付_微信 = 创建 单选框()
支付_微信.标题 = "微信支付"
支付_微信.选中 = 真
支付_微信.置属性值("name", "payment")
支付_微信.内边距 = "6px 0"
支付面板.添加组件(支付_微信)

' 方式2:支付宝
变量 支付_支付宝 = 创建 单选框()
支付_支付宝.标题 = "支付宝"
支付_支付宝.选中 = 假
支付_支付宝.置属性值("name", "payment")
支付_支付宝.内边距 = "6px 0"
支付面板.添加组件(支付_支付宝)

' 方式3:银行卡
变量 支付_银行卡 = 创建 单选框()
支付_银行卡.标题 = "银行卡"
支付_银行卡.选中 = 假
支付_银行卡.置属性值("name", "payment")
支付_银行卡.内边距 = "6px 0"
支付面板.添加组件(支付_银行卡)

' 显示当前选择的标签
变量 选择标签 = 创建 标签()
选择标签.文本 = "当前选择:微信支付"
选择标签.字体大小 = "16px"
选择标签.字体粗细 = "bold"
选择标签.文本颜色 = "#1890ff"
选择标签.内边距 = "12px 0 0"
支付面板.添加组件(选择标签)

' ========== 绑定回调事件 ==========
' 定义统一处理函数
函数 更新支付方式(源对象, 新选中状态)
    如果(新选中状态)
        变量 文本 = 源对象.标题
        选择标签.文本 = "当前选择:" + 文本
        弹出提示("已切换至:" + 文本)
    结束 如果
结束 函数

支付_微信.置选中状态被改变回调(更新支付方式)
支付_支付宝.置选中状态被改变回调(更新支付方式)
支付_银行卡.置选中状态被改变回调(更新支付方式)

属性详解

标题

  • 类型: 文本型
  • 说明: 设置或获取单选框右侧显示的标题文本,用于描述选项内容。

选中

  • 类型: 逻辑型
  • 说明: 设置或获取当前单选框是否被选中。当设为 时,该单选框变为选中状态,同组其他单选框自动取消选中(依赖于分组名称)。

禁用

  • 类型: 逻辑型
  • 说明: 设置或获取是否禁用单选框。禁用后,用户无法点击切换,样式变灰。默认为

函数详解

置选中状态被改变回调(回调函数)

  • 功能: 设置当单选框的选中状态发生变化时的回调函数。回调会在用户点击切换(或通过代码修改 选中)时触发。
  • 参数: 回调函数,格式为 (源对象, 新选中状态) => { ... }
    • 源对象:触发事件的单选框组件本身。
    • 新选中状态:逻辑型, 表示变为选中, 表示变为未选中。
  • 返回值: 无。
  • 示例:
    单选框1.置选中状态被改变回调((源对象, 新选中状态) => {
        如果(新选中状态)
            调试输出("选中:" + 源对象.标题)
        结束 如果
    })
    

事件说明

选中状态被改变(源对象, 新选中状态)

  • 功能:置选中状态被改变回调 等效,适用于设计文件(.spldg)中定义的组件。
  • 示例:
    事件 单选框1.选中状态被改变(源对象, 新选中状态)
        调试输出("选中状态:" + 新选中状态)
    结束 事件
    

⚠️ 注意事项

  1. 分组互斥:要实现单选框的互斥效果,必须为同一组的单选框设置相同的 name 属性。可通过 置属性值("name", "组名") 或直接设置 名称 属性(如果组件支持)来实现。若 name 不同,它们不会互斥,可以同时选中多个。
  2. 选中状态自动管理:当同一个 name 组中有一个单选框被选中时,其他同 name 的单选框会自动取消选中,无需手动处理。
  3. 初始选中:建议在程序启动时为组内一个单选框设置 选中 = 真,否则组内可能全部未选中,用户交互时第一个被点击的会选中。
  4. 禁用状态禁用 = 真 的单选框不会响应用户点击,但依然可以显示选中状态。
  5. 回调触发置选中状态被改变回调 会在选中状态变化时触发,包括用户点击和代码修改。注意避免在回调中反复修改 选中 导致死循环。
  6. 标题样式:标题文本紧挨着单选框,可通过继承的 字体大小文本颜色字体粗细 控制其样式。
  7. 与多选框的区别:单选框用于互斥选择(只能选一个),多选框用于多选(可同时选多个)。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档文本类组件_多选框 —— 多选组件
  • 文档文本类组件_标签 —— 配合显示说明文字
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、条件判断等
  • 文档综合演示:支付方式选择 —— 实际应用示例

组件:多选框

多选框(Checkbox)组件用于在一组选项中实现多项勾选,每个选项独立控制选中状态。它支持设置标题、选中状态、禁用状态,并在状态变化时触发回调。常用于权限分配、偏好设置、批量选择、兴趣标签等场景。

典型使用场景:

  • 权限管理(用户角色权限分配)
  • 偏好设置(通知设置、隐私设置、显示设置)
  • 批量选择(邮件选择、文件选择、商品选择)
  • 兴趣标签(用户兴趣选择、技能标签选择)
  • 订阅服务(邮件订阅、短信订阅、推送订阅)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置多选框标题标题多选框1.标题 = "同意协议"
设置选中状态选中多选框1.选中 = 真
禁用/启用组件禁用多选框1.禁用 = 真
设置选中状态改变回调置选中状态被改变回调(回调函数)多选框1.置选中状态被改变回调((源对象, 新选中状态) => { ... })
获取当前选中状态选中变量 状态 = 多选框1.选中

样式美化参考

多选框的外观可通过继承的视图属性以及 CSS 类进行美化:

样式变体属性组合
方形多选框(默认)边框圆角 = "4px"宽度 = 20高度 = 20
圆形多选框边框圆角 = "50%"宽度 = 20高度 = 20
大尺寸多选框宽度 = 24高度 = 24字体大小 = "16px"
选中状态样式背景颜色 = "#1890ff"边框 = "2px solid #1890ff"
未选中状态样式背景颜色 = "#ffffff"边框 = "1px solid #d9d9d9"
禁用状态样式背景颜色 = "#f5f5f5"边框 = "1px solid #d9d9d9"透明度 = "0.6"
水平布局(多个并排)显示模式 = "行内块"外边距右 = "16px"
垂直布局(多个堆叠)显示模式 = "块级"外边距底 = "8px"

多选框内部的勾选标记(✓)由组件内部管理,可通过 CSS 类自定义颜色和大小。


基础示例

创建一个简单的多选框,标题为“同意用户协议”,默认选中,并在状态变化时弹出提示。

变量 多选框1 = 创建 多选框()
多选框1.左边 = 50
多选框1.顶边 = 50
多选框1.标题 = "同意用户协议"
多选框1.选中 = 真
多选框1.字体大小 = "14px"

多选框1.置选中状态被改变回调((源对象, 新选中状态) => {
    如果(新选中状态)
        弹出提示("已同意协议")
    否则
        弹出提示("已取消同意")
    结束 如果
})

添加组件(多选框1)

综合示例:权限管理面板

本示例模拟一个用户权限管理界面,包含多个权限选项(读、写、执行、删除),并提供一个“全选/取消全选”按钮,以及统计当前选中数量的标签。

' ========== 创建面板 ==========
变量 权限面板 = 创建 卡片框()
权限面板.左边 = 30
权限面板.顶边 = 30
权限面板.宽度 = 300
权限面板.标题 = "🔐 权限设置"
权限面板.边框 = "1px solid #e8e8e8"
权限面板.边框圆角 = "8px"
权限面板.内边距 = "16px"
添加组件(权限面板)

' 标题提示
变量 提示标签 = 创建 标签()
提示标签.文本 = "请为用户分配权限:"
提示标签.字体大小 = "14px"
提示标签.文本颜色 = "#666"
提示标签.内边距 = "0 0 12px 0"
权限面板.添加组件(提示标签)

' 权限选项列表
变量 权限数据 = [
    {标题: "读取", 选中: 真},
    {标题: "写入", 选中: 假},
    {标题: "执行", 选中: 假},
    {标题: "删除", 选中: 假}
]

' 存储多选框引用,以便后续操作
变量 权限多选框列表 = []

变量循环(i = 0, 取数组成员数(权限数据), 1)
    变量 项 = 权限数据[i]
    变量 多选框 = 创建 多选框()
    多选框.标题 = 项.标题
    多选框.选中 = 项.选中
    多选框.显示模式 = "块级"
    多选框.内边距 = "4px 0"
    权限面板.添加组件(多选框)
    添加成员(权限多选框列表, 多选框)
    
    ' 绑定单个多选框变化事件(用于更新统计)
    多选框.置选中状态被改变回调((源对象, 新选中状态) => {
        更新统计()
    })
结束循环

' 全选按钮
变量 全选按钮 = 创建 按钮()
全选按钮.文本 = "全选"
全选按钮.宽度 = 80
全选按钮.高度 = 32
全选按钮.背景颜色 = "#1890ff"
全选按钮.文本颜色 = "#ffffff"
全选按钮.边框圆角 = "4px"
全选按钮.内边距 = "12px 0 0"
权限面板.添加组件(全选按钮)

' 取消全选按钮
变量 取消全选按钮 = 创建 按钮()
取消全选按钮.文本 = "取消全选"
取消全选按钮.宽度 = 100
取消全选按钮.高度 = 32
取消全选按钮.背景颜色 = "#d9d9d9"
取消全选按钮.文本颜色 = "#333"
取消全选按钮.边框圆角 = "4px"
取消全选按钮.内边距 = "12px 0 0"
权限面板.添加组件(取消全选按钮)

' 统计标签
变量 统计标签 = 创建 标签()
统计标签.文本 = "已选择 1 项"
统计标签.字体大小 = "14px"
统计标签.文本颜色 = "#999"
统计标签.内边距 = "12px 0 0"
权限面板.添加组件(统计标签)

' ========== 辅助函数 ==========
函数 更新统计()
    变量 已选计数 = 0
    变量循环(i = 0, 取数组成员数(权限多选框列表), 1)
        变量 多选框 = 权限多选框列表[i]
        如果(多选框.选中)
            已选计数 = 已选计数 + 1
        结束 如果
    结束循环
    统计标签.文本 = "已选择 " + 已选计数 + " 项"
结束 函数

' 全选按钮点击
全选按钮.置被单击回调((源对象) => {
    变量循环(i = 0, 取数组成员数(权限多选框列表), 1)
        权限多选框列表[i].选中 = 真
    结束循环
    更新统计()
})

' 取消全选按钮点击
取消全选按钮.置被单击回调((源对象) => {
    变量循环(i = 0, 取数组成员数(权限多选框列表), 1)
        权限多选框列表[i].选中 = 假
    结束循环
    更新统计()
})

' 初始化统计
更新统计()

属性详解

标题

  • 类型: 文本型
  • 说明: 设置或获取多选框右侧显示的标题文本,用于描述选项内容。

选中

  • 类型: 逻辑型
  • 说明: 设置或获取当前多选框是否被选中。可以独立控制,不与其他多选框互斥。

禁用

  • 类型: 逻辑型
  • 说明: 设置或获取是否禁用多选框。禁用后,用户无法点击切换,样式变灰。默认为

函数详解

置选中状态被改变回调(回调函数)

  • 功能: 设置当多选框的选中状态发生变化时的回调函数。回调会在用户点击切换(或通过代码修改 选中)时触发。
  • 参数: 回调函数,格式为 (源对象, 新选中状态) => { ... }
    • 源对象:触发事件的多选框组件本身。
    • 新选中状态:逻辑型, 表示变为选中, 表示变为未选中。
  • 返回值: 无。
  • 示例:
    多选框1.置选中状态被改变回调((源对象, 新选中状态) => {
        如果(新选中状态)
            调试输出("选中:" + 源对象.标题)
        结束 如果
    })
    

事件说明

选中状态被改变(源对象, 新选中状态)

  • 功能:置选中状态被改变回调 等效,适用于设计文件(.spldg)中定义的组件。
  • 示例:
    事件 多选框1.选中状态被改变(源对象, 新选中状态)
        调试输出("选中状态:" + 新选中状态)
    结束 事件
    

⚠️ 注意事项

  1. 独立控制:多选框之间没有互斥关系,每个多选框的选中状态独立管理,可同时选中多个。
  2. 与单选框的区别:单选框用于互斥选择(只能选一个),多选框用于多选(可同时选多个)。
  3. 禁用状态禁用 = 真 的多选框不会响应用户点击,但依然可以显示选中状态。
  4. 回调触发置选中状态被改变回调 会在选中状态变化时触发,包括用户点击和代码修改。注意避免在回调中反复修改 选中 导致死循环。
  5. 标题样式:标题文本紧挨着多选框,可通过继承的 字体大小文本颜色字体粗细 控制其样式。
  6. 批量操作:可通过遍历多选框列表统一设置 选中 属性实现全选/取消全选功能。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档文本类组件_单选框 —— 单选组件
  • 文档文本类组件_标签 —— 配合显示说明文字
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、循环语句等
  • 文档综合演示:权限管理面板 —— 实际应用示例

组件:下拉菜单按钮

下拉菜单按钮组件用于组合主按钮和下拉菜单,支持设置主按钮文本、弹出位置、禁用状态、添加菜单项、插入分割线、置主按钮被单击回调、置菜单项被单击回调等特性,常用于操作按钮组、下拉操作菜单、功能集合等场景,支持四方向弹出。

典型使用场景:

  • 操作按钮组(新建、打开、保存、删除等操作)
  • 下拉操作菜单(更多操作、设置选项、工具选择)
  • 功能集合(文件操作、编辑操作、视图操作)
  • 用户菜单(个人中心、设置、退出登录)
  • 批量操作(批量选择、批量删除、批量编辑)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图

常用操作速查

操作属性/方法示例
设置主按钮文本标题下拉菜单按钮1.标题 = "操作"
设置弹出位置弹出位置下拉菜单按钮1.弹出位置 = "bottomLeft"
添加菜单项添加菜单项(文本, 标记值, 禁用)下拉菜单按钮1.添加菜单项("新建", "new", 假)
插入分割线插入分割线()下拉菜单按钮1.插入分割线()
设置主按钮回调置主按钮被单击回调(回调)下拉菜单按钮1.置主按钮被单击回调((源对象, 事件对象) => { ... })
设置菜单项回调置菜单项被单击回调(回调)下拉菜单按钮1.置菜单项被单击回调((源对象, 文本, 标记值) => { ... })
禁用/启用禁用下拉菜单按钮1.禁用 = 假

样式美化参考

按钮样式变体:

  • 主要按钮:背景颜色 = "#1890ff"文本颜色 = "#ffffff"边框 = "none"
  • 默认按钮:背景颜色 = "#ffffff"文本颜色 = "#333333"边框 = "1px solid #d9d9d9"
  • 危险按钮:背景颜色 = "#ff4d4f"文本颜色 = "#ffffff"边框 = "none"
  • 文本按钮:背景颜色 = "透明"文本颜色 = "#1890ff"边框 = "none"

菜单样式:

  • 默认菜单:背景颜色 = "#ffffff"边框 = "1px solid #d9d9d9"边框圆角 = "4px"阴影 = "0 2px 8px rgba(0,0,0,0.15)"
  • 卡片菜单:背景颜色 = "#ffffff"边框 = "none"边框圆角 = "8px"阴影 = "0 4px 12px rgba(0,0,0,0.15)"
  • 暗色菜单:背景颜色 = "#1f1f1f"边框 = "1px solid #434343"边框圆角 = "4px"

菜单项样式:

  • 普通项:文本颜色 = "#333333"行高 = "32px"内边距 = "0 16px"
  • 悬停项:背景颜色 = "#f0f0f0"文本颜色 = "#333333"
  • 禁用项:文本颜色 = "#d9d9d9"光标样式 = "not-allowed"
  • 分割线:背景颜色 = "#f0f0f0"高度 = "1px"外边距 = "4px 0"

弹出方向样式:

  • 向下弹出:弹出位置 = "bottomLeft",`顶边 = 40
  • 向上弹出:弹出位置 = "topLeft"底边 = 40
  • 向左弹出:弹出位置 = "leftTop"右边 = 40
  • 向右弹出:弹出位置 = "rightTop"左边 = 40

状态样式:

  • 正常状态:背景颜色 = "#ffffff"边框 = "1px solid #d9d9d9"光标样式 = "pointer"
  • 悬停状态:背景颜色 = "#e6f7ff"边框 = "1px solid #91d5ff"光标样式 = "pointer"
  • 禁用状态:背景颜色 = "#f5f5f5"边框 = "1px solid #d9d9d9"文本颜色 = "#d9d9d9"光标样式 = "not-allowed"

示例代码

' 示例:完整的下拉菜单按钮使用演示
' 1. 创建下拉菜单按钮
变量 下拉菜单按钮1 = 创建 下拉菜单按钮()
' 2. 设置属性
下拉菜单按钮1.左边 = 100
下拉菜单按钮1.顶边 = 100
下拉菜单按钮1.标题 = "操作"
下拉菜单按钮1.弹出位置 = "bottomLeft"
' 3. 添加菜单项
下拉菜单按钮1.添加菜单项("新建", "new", 假)
下拉菜单按钮1.添加菜单项("打开", "open", 假)
下拉菜单按钮1.插入分割线()
下拉菜单按钮1.添加菜单项("删除", "del", 真)
' 4. 设置事件回调
下拉菜单按钮1.置主按钮被单击回调((源对象, 事件对象) => {
	调试输出("主按钮被点击")
})
下拉菜单按钮1.置菜单项被单击回调((源对象, 文本, 标记值) => {
	调试输出("选择了:" + 文本 + ",标记:" + 标记值)
})
' 5. 添加到父容器
添加组件(下拉菜单按钮1)

属性:标题

  • 类型: 文本型
  • 说明: 设置或获取主按钮显示的文本。

属性:禁用

  • 类型: 逻辑型
  • 说明: 设置或获取是否禁用整个按钮组件,禁用后主按钮与下拉触发区均不可触发。

属性:弹出位置

  • 类型: 文本型
  • 说明: 设置或获取下拉菜单的弹出位置,可选值:bottomLeft(默认)、bottomRight、topLeft、topRight。

函数:添加菜单项(文本, 标记值, 是否禁用)

添加一个菜单项,可指定文本、标记值、是否禁用,返回添加的索引位置,标记值、是否禁用可省略。

函数:插入分割线()

在下拉菜单中插入一条分割线,返回插入位置索引。

函数:清空菜单()

清空下拉菜单中的所有菜单项与分割线。

函数:显示菜单()

手动显示下拉菜单。

函数:隐藏菜单()

手动隐藏下拉菜单。

函数:置主按钮被单击回调(回调函数)

设置主按钮被单击时的回调函数,回调函数返回两个参数:(源对象,事件对象)。

函数:置菜单项被单击回调(回调函数)

设置菜单项被单击时的回调函数,回调函数返回三个参数:(源对象,菜单文本,标记值)。

函数:销毁()

销毁组件,移除下拉菜单 DOM 与文档事件监听,防止内存泄漏。

事件:主按钮被单击(源对象,事件对象)

当主按钮被单击时触发该事件。

事件:菜单项被单击(源对象,菜单文本,标记值)

当菜单项被单击时触发该事件。

组件:分页框

分页框组件用于在数据量较大时,将数据分割成多个页面进行展示,提供页码导航、上一页/下一页、首页/末页、跳转输入等功能。它支持自定义每页条数、显示总数信息、跳转输入框,并在页码切换时触发回调事件。适用于数据表格分页、商品列表分页、搜索结果分页等场景。

典型使用场景:

  • 数据表格分页(后台管理系统数据展示)
  • 商品列表分页(电商产品列表展示)
  • 文章列表分页(博客文章分页显示)
  • 搜索结果分页(搜索结果的分页导航)
  • 评论列表分页(用户评论的分页显示)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置数据总条数总数分页框1.总数 = 100
设置每页显示条数每页条数分页框1.每页条数 = 20
设置当前页码(从1开始)当前页分页框1.当前页 = 2
显示/隐藏“共X条”信息显示总数分页框1.显示总数 = 真
显示/隐藏页码跳转输入框显示跳转分页框1.显示跳转 = 假
跳转到指定页码置当前页(页码)分页框1.置当前页(3)
设置页码切换回调置页码被切换回调(回调函数)分页框1.置页码被切换回调((源对象, 页, 每页条数) => { ... })

样式美化参考

分页框的外观可通过继承的视图属性以及内部样式进行美化:

  • 整体容器:通过 宽度高度背景颜色边框(如 "1px solid #d9d9d9")、边框圆角(建议 "6px")等属性美化。
  • 字体样式:通过 字体大小(建议 "14px")、文本颜色 控制页码和文字样式。
  • 内边距:使用 内边距(如 "8px 16px")控制内部间距。
  • 页码按钮:每个页码按钮默认具有边框和背景,可自定义当前页和悬停样式(需通过 CSS 类)。
  • 信息与跳转显示总数显示跳转 控制额外信息的显示,其样式可通过继承属性调整。

CSS 美化示例(在项目 CSS 文件中定义):

.my-pagination {
    border: 1px solid #e8e8e8;
    border-radius: 6px;
    padding: 8px 12px;
    background-color: #ffffff;
}
.my-pagination .page-item {
    border: 1px solid #d9d9d9;
    border-radius: 4px;
    padding: 4px 10px;
    margin: 0 2px;
    cursor: pointer;
}
.my-pagination .page-item.active {
    background-color: #1890ff;
    color: #ffffff;
    border-color: #1890ff;
}
.my-pagination .page-item:hover:not(.active) {
    border-color: #1890ff;
    color: #1890ff;
}

在代码中应用样式类:分页框1.添加样式类("my-pagination")


基础示例

创建一个最简单的分页框,显示100条数据,每页10条,当前第1页,启用总数和跳转功能。

变量 分页框1 = 创建 分页框()
分页框1.左边 = 50
分页框1.顶边 = 50
分页框1.总数 = 100
分页框1.每页条数 = 10
分页框1.当前页 = 1
分页框1.显示总数 = 真
分页框1.显示跳转 = 真
分页框1.边框 = "1px solid #e8e8e8"
分页框1.边框圆角 = "6px"
分页框1.内边距 = "8px 16px"
分页框1.字体大小 = "14px"

分页框1.置页码被切换回调((源对象, 当前页, 每页条数) => {
    调试输出("切换到第 " + 当前页 + " 页,每页 " + 每页条数 + " 条")
})

添加组件(分页框1)

综合示例:用户列表分页展示

本示例模拟一个用户列表,配合表格和分页框,实现数据分页展示。表格显示当前页数据,分页框控制页数变化,并联动更新表格内容。

' ========== 创建模拟数据 ==========
' 生成100条用户数据
变量 全部用户 = []
变量循环(i = 1, 101, 1)
    变量 用户 = {
        id: i,
        name: "用户" + i,
        email: "user" + i + "@example.com",
        role: 取随机整数(1, 3) == 1 ? "管理员" : (取随机整数(1, 2) == 1 ? "编辑" : "普通用户")
    }
    添加成员(全部用户, 用户)
结束循环

' ========== 创建布局 ==========
变量 主容器 = 创建 弹性布局()
主容器.方向 = "column"
主容器.间距 = 16
主容器.左边 = 30
主容器.顶边 = 30
主容器.宽度 = 800
添加组件(主容器)

' 标题
变量 标题 = 创建 标签()
标题.文本 = "👥 用户列表"
标题.字体大小 = "20px"
标题.字体粗细 = "bold"
主容器.添加组件(标题)

' 表格(使用表格组件简单展示)
变量 表格1 = 创建 表格()
表格1.宽度 = 匹配父
表格1.边框 = "1px solid #e8e8e8"
表格1.边框圆角 = "6px"
表格1.置表头("ID", "姓名", "邮箱", "角色")
主容器.添加组件(表格1)

' 分页框
变量 分页框1 = 创建 分页框()
分页框1.宽度 = 匹配父
分页框1.总数 = 取数组成员数(全部用户)
分页框1.每页条数 = 10
分页框1.当前页 = 1
分页框1.显示总数 = 真
分页框1.显示跳转 = 真
分页框1.边框 = "1px solid #e8e8e8"
分页框1.边框圆角 = "6px"
分页框1.内边距 = "8px 16px"
主容器.添加组件(分页框1)

' ========== 辅助函数:渲染表格 ==========
函数 渲染表格(页码, 每页条数)
    ' 清空表格(除表头外)
    表格1.清空()  ' 注意:清空会删除所有行,表头保留
    ' 计算起始索引
    变量 开始 = (页码 - 1) * 每页条数
    变量 结束 = 开始 + 每页条数
    如果(结束 > 取数组成员数(全部用户))
        结束 = 取数组成员数(全部用户)
    结束 如果
    ' 添加当前页数据
    变量循环(i = 开始, 结束, 1)
        变量 用户 = 全部用户[i]
        表格1.添加一行(用户.id, 用户.name, 用户.email, 用户.role)
    结束循环
结束 函数

' ========== 绑定分页事件 ==========
分页框1.置页码被切换回调((源对象, 当前页, 每页条数) => {
    渲染表格(当前页, 每页条数)
})

' ========== 初始渲染 ==========
渲染表格(1, 10)

属性详解

总数

  • 类型: 数值型
  • 说明: 设置或获取数据的总条数。分页框会根据此值计算总页数,并显示对应的页码数量。

每页条数

  • 类型: 数值型
  • 说明: 设置或获取每页显示的数据条数,默认 10。修改此值后,分页框会重新计算总页数,并可能自动调整当前页(如果当前页超出新总页数)。

当前页

  • 类型: 数值型
  • 说明: 设置或获取当前页码,从 1 开始。设置后会跳转到对应页码并触发回调。若设置的页码超出有效范围(<1 或 >总页数),会被自动修正。

显示总数

  • 类型: 逻辑型
  • 说明: 设置或获取是否在分页框左侧显示“共 X 条”的文本信息,默认为

显示跳转

  • 类型: 逻辑型
  • 说明: 设置或获取是否在分页框右侧显示“前往 [输入框] 页”的跳转功能,默认为

函数详解

置当前页(页码)

  • 功能: 以编程方式跳转到指定页码,效果等同于设置 当前页 属性。
  • 参数: 页码(数值型),从 1 开始。
  • 返回值: 无。如果页码无效,会被自动修正。
  • 示例: 分页框1.置当前页(3)

置页码被切换回调(回调函数)

  • 功能: 设置当页码发生变化时的回调函数。触发时机包括用户点击页码、上一页/下一页、首页/末页、跳转输入确认,以及通过代码修改 当前页 或调用 置当前页
  • 参数: 回调函数,格式为 (源对象, 当前页, 每页条数) => { ... }
    • 源对象:分页框组件本身。
    • 当前页:切换后的页码(数值型)。
    • 每页条数:当前每页显示条数(数值型)。
  • 返回值: 无。
  • 示例:
    分页框1.置页码被切换回调((源对象, 当前页, 每页条数) => {
        调试输出("当前页:" + 当前页 + ",每页条数:" + 每页条数)
        ' 重新加载数据
        加载数据(当前页, 每页条数)
    })
    

事件说明

页码被切换(源对象, 当前页, 每页条数)

  • 功能:置页码被切换回调 等效,适用于设计文件(.spldg)中定义的组件。
  • 示例:
    事件 分页框1.页码被切换(源对象, 当前页, 每页条数)
        调试输出("切换到第 " + 当前页 + " 页")
    结束 事件
    

⚠️ 注意事项

  1. 页码从 1 开始当前页 属性以及回调中的页码均从 1 开始计数,与数组索引(从 0 开始)不同,请务必注意转换。
  2. 总数与总页数:总页数由 总数每页条数 计算得出(向上取整)。当 总数 为 0 时,分页框可能显示为“共 0 条”,页码区域为空。
  3. 自动修正当前页:当 当前页 设置的值超出有效范围(<1 或 >总页数)时,分页框会自动将其修正为 1 或总页数,并触发回调。
  4. 回调触发时机置页码被切换回调 在页码变化时触发,包括用户交互和代码设置。注意避免在回调中再次修改 当前页 导致循环。
  5. 显示跳转输入框显示跳转 = 真 时,用户可在输入框中输入页码并按回车跳转;输入无效值(非数字或超出范围)时,会被忽略或修正。
  6. 显示总数信息显示总数 = 真 时,会显示类似“共 100 条”的文本,但不包含“当前第 X 页”信息。
  7. 每页条数修改:修改 每页条数 会触发分页框重新计算总页数,并可能自动调整当前页。建议在修改后手动设置 当前页 为 1 或保持原值。
  8. 布局与样式:分页框默认横向排列,宽度自适应。如需居中或改变布局,可通过 内容水平对齐方式 或外层弹性布局控制。
  9. 性能:分页框本身不包含数据,仅提供导航 UI。数据加载和渲染由开发者通过回调实现,因此性能取决于数据处理逻辑。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档列表类组件_表格 —— 配合分页框展示数据
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、条件判断等
  • 文档综合演示:用户列表分页 —— 实际应用示例

组件:开关

开关(Switch)组件用于在两个互斥状态(开启/关闭)之间快速切换,以滑块形式呈现,并可在右侧显示文本标签。它支持自定义选中状态、禁用状态、尺寸(默认/小尺寸)、激活与非激活颜色,并提供状态改变回调。常用于设置项开关、功能启用/禁用、偏好设置等场景。

典型使用场景:

  • 功能开关(推送通知、自动更新、夜间模式)
  • 设置项开关(隐私设置、数据同步、语言切换)
  • 偏好设置(主题颜色、字体大小、音效开关)
  • 权限控制(权限启用/禁用、功能访问控制)
  • 状态切换(开关状态、显示/隐藏、启用/禁用)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置开关状态(开/关)选中开关1.选中 = 真
设置右侧文本标签文本开关1.文本 = "启用通知"
设置开关尺寸(默认/小)尺寸开关1.尺寸 = "small"
设置开启时的轨道颜色激活颜色开关1.激活颜色 = "#52c41a"
设置关闭时的轨道颜色非激活颜色开关1.非激活颜色 = "#d9d9d9"
禁用/启用开关禁用开关1.禁用 = 真
切换选中状态置选中(是否选中)开关1.置选中(假)
设置状态改变回调置状态被改变回调(回调函数)开关1.置状态被改变回调((源对象, 是否选中) => { ... })

样式美化参考

开关的外观可通过继承的视图属性以及特定属性进行自定义:

样式变体属性组合
默认尺寸(default)尺寸 = "default",宽度和高度由组件自动确定(约 60×30)
小尺寸(small)尺寸 = "small",宽度和高度自动缩小(约 40×24)
自定义颜色(开启)激活颜色 = "#52c41a"(绿色),非激活颜色 = "#d9d9d9"(灰色)
无文本标签文本 = ""(空字符串隐藏标签)
自定义文本样式通过继承的 字体大小文本颜色字体粗细 控制右侧文本样式
禁用状态禁用 = 真,组件变灰且不可交互
整体容器样式通过 背景颜色边框边框圆角内边距 等美化外层容器

开关的滑块和轨道颜色由 激活颜色非激活颜色 控制,滑块颜色通常固定为白色,可通过 CSS 类自定义。


基础示例

创建一个简单的开关,默认开启,右侧显示“启用通知”,状态改变时弹出提示。

变量 开关1 = 创建 开关()
开关1.左边 = 50
开关1.顶边 = 50
开关1.文本 = "启用通知"
开关1.选中 = 真
开关1.激活颜色 = "#52c41a"
开关1.非激活颜色 = "#d9d9d9"
开关1.字体大小 = "14px"

开关1.置状态被改变回调((源对象, 是否选中) => {
    如果(是否选中)
        弹出提示("通知已开启")
    否则
        弹出提示("通知已关闭")
    结束 如果
})

添加组件(开关1)

综合示例:系统设置面板

本示例构建一个系统设置面板,包含多个开关项(夜间模式、自动更新、推送通知、Wi-Fi 自动连接),并实时显示当前状态。

' ========== 创建设置面板 ==========
变量 设置面板 = 创建 卡片框()
设置面板.左边 = 30
设置面板.顶边 = 30
设置面板.宽度 = 360
设置面板.标题 = "⚙️ 系统设置"
设置面板.边框 = "1px solid #e8e8e8"
设置面板.边框圆角 = "12px"
设置面板.内边距 = "16px"
添加组件(设置面板)

' 存储所有开关的引用,用于状态汇总
变量 开关列表 = []

' ========== 辅助函数:创建带开关的设置项 ==========
函数 创建设置项(标题文本, 初始状态, 颜色)
    变量 容器 = 创建 弹性布局()
    容器.方向 = "row"
    容器.侧轴对齐 = "center"
    容器.宽度 = 匹配父
    容器.内边距 = "8px 0"
    容器.边框底边 = "1px solid #f0f0f0"
    
    变量 标签 = 创建 标签()
    标签.文本 = 标题文本
    标签.字体大小 = "15px"
    标签.文本颜色 = "#333"
    标签.宽度 = 200
    容器.添加组件(标签)
    
    变量 开关 = 创建 开关()
    开关.选中 = 初始状态
    开关.激活颜色 = 颜色
    开关.非激活颜色 = "#d9d9d9"
    开关.尺寸 = "small"  ' 小尺寸节省空间
    容器.添加组件(开关)
    
    设置面板.添加组件(容器)
    
    ' 存储引用
    添加成员(开关列表, 开关)
    
    ' 绑定事件(更新状态提示)
    开关.置状态被改变回调((源对象, 是否选中) => {
        变量 状态文本 = 是否选中 ? "✅ 开启" : "❌ 关闭"
        弹出提示(标题文本 + ":" + 状态文本)
    })
    
    返回 开关
结束 函数

' 创建各个设置项
创建设置项("夜间模式", 假, "#1890ff")
创建设置项("自动更新", 真, "#52c41a")
创建设置项("推送通知", 真, "#faad14")
创建设置项("Wi-Fi 自动连接", 假, "#ff4d4f")

' 全选/取消全选按钮组
变量 按钮组 = 创建 弹性布局()
按钮组.方向 = "row"
按钮组.间距 = 12
按钮组.内边距 = "12px 0 0"
设置面板.添加组件(按钮组)

变量 全开按钮 = 创建 按钮()
全开按钮.文本 = "全部开启"
全开按钮.宽度 = 100
全开按钮.高度 = 32
全开按钮.背景颜色 = "#52c41a"
全开按钮.文本颜色 = "#ffffff"
全开按钮.边框圆角 = "4px"
按钮组.添加组件(全开按钮)

变量 全关按钮 = 创建 按钮()
全关按钮.文本 = "全部关闭"
全关按钮.宽度 = 100
全关按钮.高度 = 32
全关按钮.背景颜色 = "#d9d9d9"
全关按钮.文本颜色 = "#333"
全关按钮.边框圆角 = "4px"
按钮组.添加组件(全关按钮)

' ========== 全开/全关逻辑 ==========
全开按钮.置被单击回调((源对象) => {
    变量循环(i = 0, 取数组成员数(开关列表), 1)
        开关列表[i].选中 = 真
    结束循环
    弹出提示("所有开关已开启")
})

全关按钮.置被单击回调((源对象) => {
    变量循环(i = 0, 取数组成员数(开关列表), 1)
        开关列表[i].选中 = 假
    结束循环
    弹出提示("所有开关已关闭")
})

属性详解

选中

  • 类型: 逻辑型
  • 说明: 设置或获取开关的当前状态。 表示开启, 表示关闭。设置后开关滑块会自动移动到对应位置,并触发 状态被改变 回调(如果值发生变化)。

禁用

  • 类型: 逻辑型
  • 说明: 设置或获取是否禁用开关。禁用后,用户无法点击切换,开关变灰且不可交互。默认为

尺寸

  • 类型: 文本型
  • 说明: 设置或获取开关的尺寸大小。可选值:
    • "default":默认尺寸(约 60×30)
    • "small":小尺寸(约 40×24) 默认为 "default"

激活颜色

  • 类型: 文本型
  • 说明: 设置或获取开关处于开启状态时轨道的颜色,支持 CSS 颜色值。默认为主题色(通常为蓝色或绿色)。

非激活颜色

  • 类型: 文本型
  • 说明: 设置或获取开关处于关闭状态时轨道的颜色,支持 CSS 颜色值。默认为灰色(#d9d9d9)。

文本

  • 类型: 文本型
  • 说明: 设置或获取显示在开关右侧的文本标签。若设置为空字符串,则标签隐藏。

函数详解

置选中(是否选中)

  • 功能: 以编程方式设置开关的选中状态,效果等同于直接修改 选中 属性。
  • 参数: 是否选中(逻辑型)。
  • 返回值: 无。
  • 示例: 开关1.置选中(假) 关闭开关

置状态被改变回调(回调函数)

  • 功能: 设置当开关状态发生变化时的回调函数。触发时机包括用户点击切换和通过代码修改 选中 或调用 置选中
  • 参数: 回调函数,格式为 (源对象, 是否选中) => { ... }
    • 源对象:触发事件的开关组件本身。
    • 是否选中:逻辑型,表示变化后的状态。
  • 返回值: 无。
  • 示例:
    开关1.置状态被改变回调((源对象, 是否选中) => {
        调试输出("开关状态:" + 是否选中)
    })
    

事件说明

状态被改变(源对象, 是否选中)

  • 功能:置状态被改变回调 等效,适用于设计文件(.spldg)中定义的组件。
  • 示例:
    事件 开关1.状态被改变(源对象, 是否选中)
        调试输出("状态变为:" + 是否选中)
    结束 事件
    

⚠️ 注意事项

  1. 状态切换:点击开关的滑块区域或标签文本区域均可切换状态,方便用户操作。
  2. 禁用状态禁用 = 真 时,开关不可交互,但仍然可以通过代码修改 选中 属性(但视觉上不会更新?实际测试中禁用后设置选中仍会更新显示,但用户无法操作)。
  3. 回调触发置状态被改变回调 会在状态变化时触发,包括用户交互和代码修改。注意避免在回调中反复修改状态导致死循环。
  4. 文本标签:右侧文本标签默认显示在开关右侧,可通过继承的 字体大小文本颜色字体粗细 控制样式。
  5. 尺寸选择尺寸 = "small" 适用于空间有限的场景,但相应的滑块和轨道会缩小,视觉上可能不如默认尺寸清晰。
  6. 颜色定制激活颜色非激活颜色 仅改变轨道颜色,滑块颜色通常为白色,不可直接修改(可通过 CSS 类覆盖)。
  7. 无文本标签:若不需要文本标签,可将 文本 设为空字符串,开关单独显示。
  8. 与多选框的区别:开关用于快速切换状态,视觉上更直观;多选框通常用于表单中的多项选择。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档文本类组件_多选框 —— 多选组件
  • 文档文本类组件_标签 —— 配合显示文本
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、条件判断等
  • 文档综合演示:系统设置面板 —— 实际应用示例

组件:数字输入框

数字输入框组件用于精确的数字输入,支持通过步进按钮(上下箭头)调整数值,也可手动输入。可设置数值范围(最小/最大值)、步长、小数精度,并支持禁用状态和值改变回调。适用于数量选择、金额输入、数值配置等需要精确数字输入的场景。

典型使用场景:

  • 商品数量选择(购物车、下单)
  • 金额输入(价格设置、预算)
  • 数值参数配置(图表设置、系统参数)
  • 表单中的数字字段(年龄、评分、百分比)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置数值范围最小值 / 最大值数字输入框1.最小值 = 0数字输入框1.最大值 = 100
设置步长(每次增减的值)步长数字输入框1.步长 = 5
设置小数精度精度数字输入框1.精度 = 2
设置当前值数字输入框1.值 = 75
禁用/启用输入框禁用数字输入框1.禁用 = 真
设置值改变回调置输入被改变回调(回调函数)数字输入框1.置输入被改变回调((源对象, 值) => { ... })

样式美化参考

数字输入框的外观可通过继承的视图属性进行调整:

  • 整体容器:通过 宽度高度背景颜色边框(如 "1px solid #d9d9d9")、边框圆角(建议 "6px")等属性美化。
  • 字体样式:通过 字体大小(建议 "14px")、文本颜色 控制输入数字的外观。
  • 内边距:使用 内边距(如 "8px 12px")控制输入框内边距。
  • 按钮样式:内置的增减按钮样式由组件内部管理,但可通过 CSS 类或全局样式覆盖。
  • 禁用状态禁用 = 真 时,输入框变灰且不可交互。

CSS 美化示例(在项目 CSS 文件中定义):

.my-number-input {
    border: 1px solid #d9d9d9;
    border-radius: 6px;
    font-size: 14px;
    padding: 8px 12px;
    transition: border-color 0.3s;
}
.my-number-input:focus {
    border-color: #1890ff;
    outline: none;
    box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
}
.my-number-input:disabled {
    background-color: #f5f5f5;
    cursor: not-allowed;
}

在代码中应用样式类:数字输入框1.添加样式类("my-number-input")


基础示例

创建一个数量选择器,范围 1~99,步长 1,初始值为 10。

变量 数字输入框1 = 创建 数字输入框()
数字输入框1.左边 = 50
数字输入框1.顶边 = 50
数字输入框1.宽度 = 120
数字输入框1.高度 = 36
数字输入框1.边框 = "1px solid #d9d9d9"
数字输入框1.边框圆角 = "6px"
数字输入框1.内边距 = "8px 12px"
数字输入框1.字体大小 = "14px"
数字输入框1.最小值 = 1
数字输入框1.最大值 = 99
数字输入框1.步长 = 1
数字输入框1.精度 = 0
数字输入框1.值 = 10

数字输入框1.置输入被改变回调((源对象, 当前值) => {
    调试输出("当前值:" + 当前值)
})

添加组件(数字输入框1)

综合示例:购物车商品数量控制

本示例模拟购物车场景,包含商品名称、单价、数量输入框(带加减按钮)、小计金额显示,并联动更新总价。

' ========== 创建商品信息展示 ==========
变量 商品容器 = 创建 弹性布局()
商品容器.方向 = "row"
商品容器.侧轴对齐 = "center"
商品容器.左边 = 30
商品容器.顶边 = 30
商品容器.宽度 = 500
商品容器.间距 = 16
商品容器.背景颜色 = "#ffffff"
商品容器.边框 = "1px solid #e8e8e8"
商品容器.边框圆角 = "8px"
商品容器.内边距 = "16px"
添加组件(商品容器)

' 商品名称
变量 名称标签 = 创建 标签()
名称标签.文本 = "📱 智能手机"
名称标签.字体大小 = "16px"
名称标签.字体粗细 = "bold"
名称标签.宽度 = 120
商品容器.添加组件(名称标签)

' 单价
变量 单价标签 = 创建 标签()
单价标签.文本 = "单价:¥2999"
单价标签.字体大小 = "14px"
单价标签.文本颜色 = "#666"
单价标签.宽度 = 100
商品容器.添加组件(单价标签)

' 数量输入框
变量 数量输入 = 创建 数字输入框()
数量输入.宽度 = 100
数量输入.高度 = 32
数量输入.边框 = "1px solid #d9d9d9"
数量输入.边框圆角 = "4px"
数量输入.内边距 = "4px 8px"
数量输入.字体大小 = "14px"
数量输入.最小值 = 1
数量输入.最大值 = 999
数量输入.步长 = 1
数量输入.精度 = 0
数量输入.值 = 1
商品容器.添加组件(数量输入)

' 小计金额
变量 小计标签 = 创建 标签()
小计标签.文本 = "小计:¥2999"
小计标签.字体大小 = "16px"
小计标签.字体粗细 = "bold"
小计标签.文本颜色 = "#ff4d4f"
小计标签.宽度 = 120
商品容器.添加组件(小计标签)

' ========== 总价汇总显示 ==========
变量 总价标签 = 创建 标签()
总价标签.左边 = 30
总价标签.顶边 = 110
总价标签.文本 = "总价:¥2999"
总价标签.字体大小 = "18px"
总价标签.字体粗细 = "bold"
总价标签.文本颜色 = "#ff4d4f"
添加组件(总价标签)

' ========== 更新金额函数 ==========
函数 更新金额()
    变量 数量 = 数量输入.值
    变量 单价 = 2999
    变量 小计 = 单价 * 数量
    小计标签.文本 = "小计:¥" + 小计
    总价标签.文本 = "总价:¥" + 小计
结束 函数

' ========== 绑定事件 ==========
数量输入.置输入被改变回调((源对象, 当前值) => {
    更新金额()
})

' 初始化显示
更新金额()

属性详解

最小值

  • 类型: 数值型
  • 说明: 设置或获取允许输入的最小数值。当用户通过步进按钮或手动输入的值小于此值时,会自动修正为 最小值。默认无限制(实际受浏览器控制,通常为 -Infinity)。

最大值

  • 类型: 数值型
  • 说明: 设置或获取允许输入的最大数值。当用户通过步进按钮或手动输入的值大于此值时,会自动修正为 最大值。默认无限制。

步长

  • 类型: 数值型
  • 说明: 设置或获取每次点击加减按钮时数值的变化量。例如步长为 5,则点击“+”按钮值增加 5,点击“-”按钮值减少 5。默认 1

精度

  • 类型: 数值型
  • 说明: 设置或获取显示的小数位数,控制数值的精度。取值说明:
    • -1:自动精度(根据输入值保留合适的小数位,通常保留输入时的精度)。
    • 0:整数,不显示小数位(默认)。
    • > 0:固定小数位数,例如 2 表示显示两位小数,输入 1.234 会显示 1.23(四舍五入)。
  • 注意:此属性仅影响显示,内部值仍是完整精度,计算时以实际值为准。

  • 类型: 数值型
  • 说明: 设置或获取当前输入框的数值。设置后会自动校验是否在 最小值~最大值 范围内,并按照 精度 格式化显示。

禁用

  • 类型: 逻辑型
  • 说明: 设置或获取是否禁用输入框。禁用后,用户无法输入或点击步进按钮,样式变灰。默认为

函数详解

置值(值)

  • 功能: 以编程方式设置当前值,效果等同于直接修改 属性。设置后会自动触发 置输入被改变回调
  • 参数: (数值型),需在 最小值最大值 之间。
  • 返回值: 无。
  • 示例: 数字输入框1.置值(50)

置输入被改变回调(回调函数)

  • 功能: 设置当数值发生变化时的回调函数。变化来源包括用户点击步进按钮、手动输入(失去焦点或按回车键)以及通过 置值 属性设置。
  • 参数: 回调函数,格式为 (源对象, 当前值) => { ... }
    • 源对象:触发事件的数字输入框组件本身。
    • 当前值:变化后的数值(数值型)。
  • 返回值: 无。
  • 示例:
    数字输入框1.置输入被改变回调((源对象, 当前值) => {
        调试输出("当前值:" + 当前值)
    })
    

事件说明

输入被改变(源对象, 当前值)

  • 功能:置输入被改变回调 等效,适用于设计文件(.spldg)中定义的组件。
  • 示例:
    事件 数字输入框1.输入被改变(源对象, 当前值)
        调试输出("数值变为:" + 当前值)
    结束 事件
    

⚠️ 注意事项

  1. 范围校验:通过代码设置 或用户输入时,会自动将值限制在 最小值~最大值 范围内,不会报错。
  2. 精度处理精度 控制显示格式,但内部存储仍是完整精度。计算时需注意浮点数精度问题(如 0.1 + 0.2 可能不等于 0.3)。
  3. 步长与精度关系:步长最好与精度匹配,例如精度为 2,步长设为 0.01,这样增减操作平滑。若步长小于精度,可能看不到明显变化。
  4. 手动输入:用户可以直接在输入框中键入数字,失去焦点或按回车键后触发校验和回调。输入非数字字符会被忽略或清空。
  5. 禁用状态禁用 = 真 时,用户无法操作,但通过 置值 仍然可以修改数值(但界面可能显示不变?实际测试中禁用后设置值仍会更新显示,但用户无法交互)。
  6. 回调触发时机置输入被改变回调 在用户通过步进按钮操作、输入完成后(失去焦点或按回车)以及通过代码设置值时触发。注意避免在回调中再次修改值导致循环。
  7. 初始值:若不设置 ,默认可能为 0 或空(浏览器行为),建议显式设置初始值。
  8. 宽度自适应:数字输入框的宽度建议根据可能的最大数字长度设置,避免输入过长数字被截断。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档文本类组件_单行输入框 —— 普通文本输入
  • 文档其它通用类组件_密码输入框 —— 密码输入框
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、数值类型等
  • 文档综合演示:购物车数量控制 —— 实际应用示例

组件:标签输入框

标签输入框组件用于输入和管理标签(Tags),用户通过输入文本后按回车键将文本转换为标签,并以可视化标签块的形式展示。支持添加、删除、批量设置标签,可限制最大标签数量,并提供了标签变更回调。适用于博客标签、关键词管理、分类选择、筛选条件等需要标签化输入的场景。

典型使用场景:

  • 博客/文章标签管理(输入关键词作为文章标签)
  • 商品分类/属性标签(如颜色、尺寸等)
  • 筛选条件输入(多个过滤关键词)
  • 项目管理中的任务标签(如优先级、类型)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置占位提示文本占位提示标签输入框1.占位提示 = "输入标签,回车添加"
设置最大标签数量最大数量标签输入框1.最大数量 = 5
禁用/启用组件禁用标签输入框1.禁用 = 真
添加单个标签添加标签(文本)标签输入框1.添加标签("Vue")
移除指定索引的标签移除标签(索引)标签输入框1.移除标签(0)
批量设置标签置标签数组(文本数组)标签输入框1.置标签数组(["Vue", "React"])
获取所有标签取标签数组()变量 标签列表 = 标签输入框1.取标签数组()
获取标签数量取数量()变量 数量 = 标签输入框1.取数量()
清空所有标签清空()标签输入框1.清空()
设置标签变更回调置输入被改变回调(回调函数)标签输入框1.置输入被改变回调((源对象, 标签数组) => { ... })

样式美化参考

标签输入框的外观可通过继承的视图属性以及 CSS 类进行美化:

  • 整体容器:通过 宽度高度背景颜色边框(如 "1px solid #d9d9d9")、边框圆角(建议 "6px")等属性美化。
  • 标签块:每个标签默认以圆角背景块显示,带有删除按钮(×)。可通过 CSS 类自定义标签背景色、文字颜色、内边距、圆角等。
  • 输入区域:输入框的字体大小、颜色等可通过继承属性控制。
  • 禁用状态禁用 = 真 时,输入框不可交互,样式变灰。

CSS 美化示例(在项目 CSS 文件中定义):

.my-tag-input {
    border: 1px solid #d9d9d9;
    border-radius: 6px;
    padding: 4px 8px;
    min-height: 40px;
    background-color: #ffffff;
}
.my-tag-input .tag-item {
    display: inline-block;
    background-color: #e6f7ff;
    border: 1px solid #91d5ff;
    border-radius: 4px;
    padding: 2px 8px;
    margin: 2px 4px;
    font-size: 13px;
}
.my-tag-input .tag-item .tag-remove {
    margin-left: 4px;
    cursor: pointer;
    color: #ff4d4f;
}
.my-tag-input .tag-item .tag-remove:hover {
    color: #ff0000;
}

在代码中应用样式类:标签输入框1.添加样式类("my-tag-input")


基础示例

创建一个标签输入框,添加两个初始标签,限制最多 5 个,并在标签变化时输出当前列表。

变量 标签输入框1 = 创建 标签输入框()
标签输入框1.左边 = 50
标签输入框1.顶边 = 50
标签输入框1.宽度 = 400
标签输入框1.高度 = 44
标签输入框1.边框 = "1px solid #d9d9d9"
标签输入框1.边框圆角 = "6px"
标签输入框1.内边距 = "8px"
标签输入框1.字体大小 = "14px"
标签输入框1.占位提示 = "输入后按回车添加"
标签输入框1.最大数量 = 5

' 添加初始标签
标签输入框1.添加标签("Vue")
标签输入框1.添加标签("React")

' 设置变更回调
标签输入框1.置输入被改变回调((源对象, 标签数组) => {
    调试输出("当前标签:" + 数组到文本(标签数组, ", "))
})

添加组件(标签输入框1)

综合示例:文章标签编辑器

本示例展示一个完整的文章标签编辑面板,支持添加、删除、批量导入标签,并显示当前标签总数。

' ========== 创建面板容器 ==========
变量 面板 = 创建 绝对布局()
面板.左边 = 30
面板.顶边 = 30
面板.宽度 = 500
面板.背景颜色 = "#ffffff"
面板.边框 = "1px solid #e8e8e8"
面板.边框圆角 = "12px"
面板.内边距 = "20px"
添加组件(面板)

' 标题
变量 标题 = 创建 标签()
标题.文本 = "🏷️ 文章标签"
标题.字体大小 = "18px"
标题.字体粗细 = "bold"
标题.内边距 = "0 0 12px 0"
面板.添加组件(标题)

' 标签输入框
变量 标签输入 = 创建 标签输入框()
标签输入.宽度 = 460
标签输入.高度 = 44
标签输入.边框 = "1px solid #d9d9d9"
标签输入.边框圆角 = "6px"
标签输入.内边距 = "8px"
标签输入.字体大小 = "14px"
标签输入.占位提示 = "输入标签,按回车添加"
标签输入.最大数量 = 10
面板.添加组件(标签输入)

' 统计信息
变量 统计标签 = 创建 标签()
统计标签.文本 = "当前标签数:0"
统计标签.字体大小 = "13px"
统计标签.文本颜色 = "#999"
统计标签.内边距 = "8px 0 0"
面板.添加组件(统计标签)

' 快捷标签按钮组
变量 快捷组 = 创建 弹性布局()
快捷组.方向 = "row"
快捷组.间距 = 8
快捷组.内边距 = "12px 0 0"
面板.添加组件(快捷组)

变量 快捷标签 = ["JavaScript", "TypeScript", "CSS", "HTML", "Vue"]
变量循环(i = 0, 取数组成员数(快捷标签), 1)
    变量 快捷按钮 = 创建 按钮()
    快捷按钮.文本 = 快捷标签[i]
    快捷按钮.宽度 = 80
    快捷按钮.高度 = 28
    快捷按钮.背景颜色 = "#f0f0f0"
    快捷按钮.文本颜色 = "#333"
    快捷按钮.边框 = "none"
    快捷按钮.边框圆角 = "4px"
    快捷按钮.字体大小 = "12px"
    快捷组.添加组件(快捷按钮)
    
    ' 绑定点击事件
    快捷按钮.置被单击回调((源对象) => {
        变量 标签文本 = 源对象.文本
        变量 当前列表 = 标签输入.取标签数组()
        ' 检查是否已存在
        变量 已存在 = 假
        变量循环(j = 0, 取数组成员数(当前列表), 1)
            如果(当前列表[j] == 标签文本)
                已存在 = 真
                退出
            结束 如果
        结束循环
        如果(!已存在)
            变量 结果 = 标签输入.添加标签(标签文本)
            如果(结果 == -1)
                弹出提示("标签已存在或已超出最大数量")
            结束 如果
        否则
            弹出提示("标签已存在")
        结束 如果
    })
结束循环

' 清空按钮
变量 清空按钮 = 创建 按钮()
清空按钮.文本 = "清空标签"
清空按钮.宽度 = 100
清空按钮.高度 = 32
清空按钮.背景颜色 = "#ff4d4f"
清空按钮.文本颜色 = "#ffffff"
清空按钮.边框圆角 = "6px"
清空按钮.内边距 = "12px 0 0"
面板.添加组件(清空按钮)

' ========== 事件绑定 ==========
标签输入.置输入被改变回调((源对象, 标签数组) => {
    变量 数量 = 取数组成员数(标签数组)
    统计标签.文本 = "当前标签数:" + 数量
})

清空按钮.置被单击回调((源对象) => {
    标签输入.清空()
    弹出提示("已清空所有标签")
})

属性详解

占位提示

  • 类型: 文本型
  • 说明: 设置或获取输入框为空时显示的占位提示文本,如 "输入后按回车添加"。当输入框获得焦点或已有标签时,占位文本隐藏。

最大数量

  • 类型: 数值型
  • 说明: 设置或获取允许添加的最大标签数量。当达到此数量时,再尝试添加新标签会失败(添加标签 返回 -1)。设为 0 表示不限制数量。默认 0(不限)。

禁用

  • 类型: 逻辑型
  • 说明: 设置或获取是否禁用组件。禁用后,输入框不可编辑,也无法添加或移除标签。默认为

函数详解

添加标签(文本)

  • 功能: 向标签列表末尾添加一个新标签。
  • 参数: 文本(文本型),标签显示的文字。
  • 返回值: 数值型,成功添加时返回新标签的索引位置(从0开始);若标签已存在(重复)或超出 最大数量,返回 -1
  • 示例: 变量 索引 = 标签输入框1.添加标签("Vue")

移除标签(索引)

  • 功能: 移除指定索引位置的标签。
  • 参数: 索引(数值型),从0开始。
  • 返回值: 无。
  • 示例: 标签输入框1.移除标签(0) 删除第一个标签

置标签数组(文本数组)

  • 功能: 批量设置标签,会替换当前所有标签。
  • 参数: 文本数组,由文本型组成的数组,如 ["Vue", "React"]
  • 返回值: 无。
  • 示例: 标签输入框1.置标签数组(["Vue", "React", "Angular"])

取标签数组()

  • 功能: 获取当前所有标签的文本数组。
  • 返回值: 文本型数组。
  • 示例: 变量 列表 = 标签输入框1.取标签数组()

取数量()

  • 功能: 获取当前标签的总数。
  • 返回值: 数值型。
  • 示例: 变量 数量 = 标签输入框1.取数量()

清空()

  • 功能: 移除所有标签,将列表清空。
  • 返回值: 无。
  • 示例: 标签输入框1.清空()

置输入被改变回调(回调函数)

  • 功能: 设置当标签列表发生变化时的回调函数。变化来源包括添加、移除、批量设置或清空标签。
  • 参数: 回调函数,格式为 (源对象, 标签数组) => { ... }
    • 源对象:标签输入框组件本身。
    • 标签数组:当前所有标签文本组成的数组。
  • 返回值: 无。
  • 示例:
    标签输入框1.置输入被改变回调((源对象, 标签数组) => {
        调试输出("标签变化:" + 数组到文本(标签数组, ", "))
    })
    

事件说明

输入被改变(源对象, 标签数组)

  • 功能:置输入被改变回调 等效,适用于设计文件(.spldg)中定义的组件。
  • 示例:
    事件 标签输入框1.输入被改变(源对象, 标签数组)
        调试输出("当前标签数量:" + 取数组成员数(标签数组))
    结束 事件
    

⚠️ 注意事项

  1. 标签重复检查添加标签 会自动检查是否已存在相同文本的标签,若存在则返回 -1 且不添加。
  2. 最大数量限制:当达到 最大数量 时,添加标签 返回 -1,且不会添加新标签。在调用前可先通过 取数量() 判断。
  3. 标签文本处理:添加标签时,组件会自动去除首尾空格。空字符串或纯空格不会被添加。
  4. 删除标签:每个标签块上默认显示删除按钮(×),点击可移除该标签,同时触发回调。
  5. 禁用状态禁用 = 真 时,输入框不可编辑,删除按钮也不可用,但已有的标签仍然显示。
  6. 回调触发时机:任何导致标签列表变化的操作(添加、移除、批量设置、清空)都会触发 置输入被改变回调
  7. 输入方式:用户输入标签文本后,需按回车键(Enter)才能将文本转换为标签。按退格键(Backspace)可删除上一个标签(如果输入框为空)。
  8. 样式定制:每个标签块由内部 DOM 元素构成,可通过 CSS 类自定义背景色、圆角、字体等,删除按钮也可单独样式化。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档文本类组件_单行输入框 —— 文本输入基础组件
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、数组操作等
  • 文档综合演示:文章标签编辑器 —— 实际应用示例

组件:窗口标题框

窗口标题框组件用于移动端页面顶部的标题栏,支持设置标题、左侧图标、右侧图标、图标尺寸、置元素被单击回调等特性,常用于手机页面头部导航栏、返回按钮与标题组合场景,注意默认左右两侧图标隐藏。

典型使用场景:

  • 移动端页面标题栏(手机APP页面顶部导航)
  • 返回按钮与标题组合(页面返回功能)
  • 操作按钮组(分享、收藏、设置等操作)
  • 搜索栏(页面搜索功能)
  • 用户信息展示(头像、用户名、状态)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图

常用操作速查

操作属性/方法示例
设置标题文本标题窗口标题框1.标题 = "首页"
设置左侧图标左侧图标窗口标题框1.左侧图标 = "static/back.png"
设置右侧图标右侧图标窗口标题框1.右侧图标 = "static/menu.png"
设置图标尺寸置图标尺寸(宽度, 高度)窗口标题框1.置图标尺寸(36, 36)
设置元素点击回调置元素被单击回调(回调)窗口标题框1.置元素被单击回调((源对象, 被单击索引) => { ... })
设置背景颜色背景颜色窗口标题框1.背景颜色 = "#ffffff"
设置文本颜色文本颜色窗口标题框1.文本颜色 = "#333333"

样式美化参考

标题栏样式变体:

  • 简约标题栏:背景颜色 = "#ffffff"边框 = "none",`高度 = 56
  • 卡片标题栏:背景颜色 = "#ffffff"边框 = "none"阴影 = "0 2px 8px rgba(0,0,0,0.1)",`高度 = 64
  • 渐变标题栏:背景颜色 = "linear-gradient(135deg, #1890ff, #096dd9)"边框 = "none",`高度 = 60

标题样式:

  • 主标题:文本颜色 = "#333333"字体大小 = "18px"字体粗细 = "粗体"
  • 副标题:文本颜色 = "#666666"字体大小 = "16px"字体粗细 = "正常"
  • 链接标题:文本颜色 = "#1890ff"字体大小 = "16px"下划线 = "none"

图标样式:

  • 返回图标:左侧图标 = "static/back.png"图标尺寸 = (32, 32)文本颜色 = "#333333"
  • 菜单图标:右侧图标 = "static/menu.png"图标尺寸 = (24, 24)文本颜色 = "#333333"
  • 搜索图标:右侧图标 = "static/search.png"图标尺寸 = (24, 24)文本颜色 = "#666666"

布局样式:

  • 固定定位:定位 = "固定"顶边 = 0宽度 = "100%",`高度 = 56
  • 相对定位:定位 = "相对"外边顶 = 0宽度 = "100%",`高度 = 56
  • 粘性定位:定位 = "粘性"顶边 = 0宽度 = "100%",`高度 = 56

状态样式:

  • 正常状态:背景颜色 = "#ffffff"文本颜色 = "#333333"图标颜色 = "#333333"
  • 悬停状态:背景颜色 = "#f0f0f0"文本颜色 = "#1890ff"图标颜色 = "#1890ff"
  • 按下状态:背景颜色 = "#e6f7ff"文本颜色 = "#096dd9"图标颜色 = "#096dd9"

响应式样式:

  • 移动端适配:高度 = 56字体大小 = "16px"图标尺寸 = (32, 32)
  • 平板端适配:高度 = 64字体大小 = "18px"图标尺寸 = (36, 36)
  • 桌面端适配:高度 = 72字体大小 = "20px"图标尺寸 = (40, 40)

特殊样式:

  • 透明背景:背景颜色 = "透明"文本颜色 = "#ffffff"图标颜色 = "#ffffff"
  • 深色主题:背景颜色 = "#1f1f1f"文本颜色 = "#ffffff"图标颜色 = "#ffffff"
  • 半透明:背景颜色 = "rgba(255,255,255,0.9)"边框 = "1px solid rgba(0,0,0,0.1)"阴影 = "0 2px 8px rgba(0,0,0,0.1)"

示例代码

' 示例:完整的窗口标题框使用演示
' 1. 创建窗口标题框
变量 窗口标题框1 = 创建 窗口标题框()
' 2. 设置属性
窗口标题框1.左边 = 0
窗口标题框1.顶边 = 0
窗口标题框1.宽度 = 400
窗口标题框1.高度 = 56
窗口标题框1.标题 = "首页"
窗口标题框1.左侧图标 = "static/back.png"
窗口标题框1.右侧图标 = "static/menu.png"
窗口标题框1.置图标尺寸(36, 36)
' 3. 设置事件回调
窗口标题框1.置元素被单击回调((源对象, 被单击索引) => {
	调试输出("被点击索引:" + 被单击索引)
})
' 4. 添加到父容器
添加组件(窗口标题框1)

属性:标题

  • 类型: 文本型
  • 说明: 设置或获取窗口标题框的标题文本内容,支持设置纯文本及HTML内容。

属性:右侧图标

  • 类型: 文本型
  • 说明: 设置或获取窗口标题框的右侧图标,支持本地图片及网络图片。

属性:左侧图标

  • 类型: 文本型
  • 说明: 设置或获取窗口标题框的左侧图标,支持本地图片及网络图片。

函数:置图标尺寸(宽, 高)

设置窗口标题框左右两侧的图标尺寸,默认宽, 高均为36像素。

函数:置元素被单击回调(回调函数)

设置当窗口标题框中的图标或标题文本被单击时要回调的函数对象,系统回调函数时返回索引参数,0左侧图标,1标题文本,2右侧图标。

事件:元素被单击(源对象,被单击索引)

当窗口标题框中的图标或标题文本被单击时触发,被单击索引:0左侧图标,1标题文本,2右侧图标。

组件:表单

表单组件用于收集和提交用户输入数据,支持添加输入框、多行编辑框、下拉框、单选项、多选项、文件选择框等控件,以及设置标签宽度、输入宽度、行间距等布局属性,常用于登录注册、信息录入、数据提交等表单场景。

典型使用场景:

  • 用户注册表单(个人信息、账号设置)
  • 登录表单(用户名密码验证)
  • 数据录入表单(订单信息、调查问卷)
  • 搜索表单(条件筛选、高级搜索)
  • 设置表单(个人偏好、系统配置)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图

常用操作速查

操作属性/方法示例
设置表单宽度宽度表单1.宽度 = 400
设置标签宽度标签宽度表单1.标签宽度 = 80
设置输入宽度输入宽度表单1.输入宽度 = 200
设置行间距行间距表单1.行间距 = 20
添加输入框添加输入框(标题, 默认值, 提示文本, 类型, 名称)表单1.添加输入框("用户名", "", "", "text", "username")
添加多行编辑框添加多行编辑框(标题, 默认值, 提示文本, 行数)表单1.添加多行编辑框("备注", "", "", 3)
添加下拉框添加下拉框(标题, 选项数组)表单1.添加下拉框("城市", [{文本:"北京", 值:"BJ"}])
获取表单数据获取数据()变量 数据 = 表单1.获取数据()
清空表单清空()表form1.清空()
设置提交回调置被提交回调(回调)表单1.置被提交回调((源对象, 数据) => { ... })

样式美化参考

以下为常用样式组合示例,可根据实际需求调整:

表单布局样式:

  • 标准表单:宽度 = 500背景颜色 = "#ffffff"边框 = "1px solid #e8e8e8"边框圆角 = "8px"内边距 = "24px"
  • 卡片表单:背景颜色 = "#ffffff"边框 = "none"边框圆角 = "12px"内边距 = "32px"阴影 = "0 2px 8px rgba(0,0,0,0.1)"
  • 紧凑表单:宽度 = 360行间距 = 16内边距 = "16px"

输入字段样式:

  • 标准输入:标签宽度 = 100输入宽度 = 250行间距 = 24
  • 宽表单:标签宽度 = 120输入宽度 = 300行间距 = 28
  • 紧凑表单:标签宽度 = 80输入宽度 = 200行间距 = 16

表单按钮样式:

  • 提交按钮:背景颜色 = "#1890ff"文本颜色 = "#ffffff"边框圆角 = "6px"高度 = 40
  • 重置按钮:背景颜色 = "transparent"文本颜色 = "#ff4d4f"边框 = "1px solid #ff4d4f"边框圆角 = "6px"
  • 按钮组:置内联样式("display", "flex")置内联样式("gap", "12px")

验证状态样式:

  • 正常状态:边框 = "1px solid #d9d9d9"
  • 聚焦状态:边框 = "1px solid #1890ff"
  • 错误状态:边框 = "1px solid #ff4d4f"
  • 成功状态:边框 = "1px solid #52c41a"

响应式设计:

  • 移动端适配:宽度 = "100%"置内联样式("max-width", "480px")置内联样式("margin", "0 auto")

基础示例

简单场景内完整的表单使用演示

' 1. 创建表单
变量 表单1 = 创建 表单()
' 2. 设置属性
表单1.左边 = 100
表单1.顶边 = 100
表单1.宽度 = 400
表单1.标签宽度 = 80
表单1.输入宽度 = 250
表单1.行间距 = 20
' 3. 添加表单字段
表单1.添加输入框("用户名", "", "请输入用户名", "text", "username")
表单1.添加输入框("密码", "", "请输入密码", "password", "password")
表单1.添加下拉框("城市", [
    {文本:"请选择城市", 值:""},
    {文本:"北京", 值:"BJ"},
    {文本:"上海", 值:"SH"},
    {文本:"广州", 值:"GZ"},
    {文本:"深圳", 值:"SZ"}
])
' 4. 设置事件回调
表单1.置被提交回调((源对象, 表单数据) => {
    调试输出("表单提交数据:" + JSON编码(表单数据))
})
' 5. 添加到父容器
添加组件(表单1)

综合示例:用户注册表单

本示例展示表单与各种输入控件配合使用的完整注册场景,包含表单验证、数据处理等功能。

' ========== 创建注册表单 ==========
变量 注册表单 = 创建 表单()
注册表单.左边 = 50
注册表单.顶边 = 50
注册表单.宽度 = 500
注册表单.标签宽度 = 100
注册表单.输入宽度 = 300
注册表单.行间距 = 24
注册表单.背景颜色 = "#ffffff"
注册表单.边框圆角 = "8px"
注册表单.边框 = "1px solid #e8e8e8"
注册表单.内边距 = "32px"
添加组件(注册表单)

' ========== 添加基本信息字段 ==========
注册表单.添加输入框("用户名", "", "请设置4-20位用户名", "text", "username")
注册表单.添加输入框("密码", "", "请设置8-20位密码", "password", "password")
注册表单.添加输入框("确认密码", "", "请再次输入密码", "password", "confirmPassword")
注册表单.添加输入框("邮箱", "", "请输入邮箱地址", "email", "email")
注册表单.添加输入框("手机号", "", "请输入11位手机号", "tel", "phone")

' ========== 添加个人信息字段 ==========
注册表单.添加下拉框("性别", [
    {文本:"请选择性别", 值:""},
    {文本:"男", 值:"male"},
    {文本:"女", 值:"female"},
    {文本:"其他", 值:"other"}
])
注册表单.添加多行编辑框("个人简介", "", "请简单介绍一下自己(选填)", 3)

' ========== 添加协议复选框 ==========
变量 协议复选框 = 注册表单.添加多选项("阅读协议", [
    {文本:"我已阅读并同意《用户协议》和《隐私政策》", 值:"agreement"}
], [])

' ========== 设置提交回调 ==========
注册表单.置被提交回调((源对象, 表单数据) => {
    ' 表单验证
    如果(表单Data.用户名 == "" 或 取文本长度(表单Data.用户名) < 4)
        弹出提示("用户名至少需要4个字符")
        返回
    结束 如果
    
    如果(表单Data.密码 == "" 或 取文本长度(表单Data.密码) < 8)
        弹出提示("密码至少需要8个字符")
        返回
    结束 如果
    
    如果(表单Data.密码 != 表单Data.确认密码)
        弹出提示("两次输入的密码不一致")
        返回
    结束 如果
    
    如果(表单Data.邮箱 == "" 或 寻找文本("@", 表单Data.邮箱) == 0)
        弹出提示("请输入有效的邮箱地址")
        返回
    结束 如果
    
    如果(表单Data.手机号 == "" 或 取文本长度(表单Data.手机号) != 11)
        弹出提示("请输入11位手机号")
        返回
    结束 如果
    
    如果(协议复选框[0] != 真)
        弹出提示("请阅读并同意用户协议")
        返回
    结束 如果
    
    ' 提交成功处理
    弹出提示("注册成功!")
    调试输出("注册信息:" + JSON编码(表单数据))
    
    ' 清空表单
    注册表单.清空()
})

' ========== 添加表单按钮 ==========
注册表单.添加按钮组([
    {文本:"注册", 类型:"submit", 样式:"主要"},
    {文本:"重置", 类型:"reset", 样式:"默认"}
])

' ========== 添加表单说明 ==========
变量 说明标签 = 创建 标签()
说明标签.左边 = 50
说明标签.顶边 = 注册表单.顶边 + 注册表单.高度 + 20
说明标签.宽度 = 500
说明标签.高度 = 40
说明标签.文本 = "注册即表示您同意我们的服务条款和隐私政策"
说明标签.文本颜色 = "#999999"
说明标签.字体大小 = "12px"
说明标签.内容水平对齐方式 = "center"
添加组件(说明标签)

函数:添加输入框(标题, 默认值, 提示文本, 类型, 名称)

向表单中添加一个文本输入框,返回创建的input元素。

参数:

  • 标题:输入框的标签文本
  • 默认值:输入框的默认值(可选)
  • 提示文本:输入框的占位提示文本(可选)
  • 类型:输入框类型,如 "text"、"password"、"email"、"tel" 等(可选)
  • 名称:表单提交时的字段名(可选)

示例:

变量 用户名输入框 = 表单1.添加输入框("用户名", "", "请输入用户名", "text", "username")

函数:添加多行编辑框(标题, 默认值, 提示文本, 行数)

向表单中添加一个多行文本编辑框,返回创建的textarea元素。

参数:

  • 标题:编辑框的标签文本
  • 默认值:编辑框的默认值(可选)
  • 提示文本:编辑框的占位提示文本(可选)
  • 行数:编辑框的显示行数(可选)

函数:添加下拉框(标题, 选项数组)

向表单中添加一个下拉选择框,返回创建的select元素。

参数:

  • 标题:下拉框的标签文本
  • 选项数组:选项列表,每个选项包含 文本 属性

函数:添加单选项(标题, 选项数组, 默认索引)

向表单中添加一组单选框,返回创建的radio元素数组。

函数:添加多选项(标题, 选项数组, 选中索引数组)

向表单中添加一组复选框,返回创建的checkbox元素数组。

函数:添加文件选择框(标题)

向表单中添加一个文件选择框,返回创建的file input元素。

函数:添加按钮组(按钮配置数组)

向表单底部添加一组按钮,返回创建的按钮容器元素。

按钮配置格式:

[
    {文本:"提交", 类型:"submit", 样式:"主要"},
    {文本:"重置", 类型:"reset", 样式:"默认"}
]

函数:获取数据()

获取表单中已输入的数据,返回包含所有字段值的关联数组。

函数:取数据()

获取表单中已输入的数据,与 获取数据() 功能相同。

函数:清空()

清空表单中的所有输入字段,重置为默认状态。

函数:置被提交回调(回调函数)

设置表单提交事件的自定义处理函数。

回调函数格式:

表单1.置被提交回调((源对象, 表单数据) => {
    ' 处理表单数据
    调试输出(表单数据)
})

函数:置按钮被单击回调(回调函数)

设置添加的按钮组被单击时的回调。

事件:被提交(源对象,表单数据)

当表单被提交时触发并回调该事件。

事件处理示例:

事件 注册表单.被提交(源对象, 表单数据)
    调试输出("表单提交:" + JSON编码(表单数据))
结束 事件

事件:按钮被单击(源对象,按钮标题)

当表单按钮被单击时触发并回调该事件。

⚠️ 注意事项

  1. 表单验证:提交前建议进行数据验证,确保数据格式正确。
  2. 字段命名:每个字段应有唯一的名称,便于数据收集和处理。
  3. 用户体验:可添加实时验证反馈,提升用户体验。
  4. 数据安全:敏感数据(如密码)建议在后端进行二次验证。
  5. 响应式设计:考虑在不同设备上的显示效果。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档文本类组件_输入框 —— 表单中的输入框组件
  • 文档文本类组件_编辑框 —— 表单中的多行编辑框组件
  • 文档文本类组件_下拉框 —— 表单中的下拉选择组件
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式语法规则

组件:表单输入框

表单输入框组件用于带标题标签的输入字段,支持设置标题、内容、提示文本、输入类型(文本、密码、数字、邮箱、手机号、日期、时间、颜色、文件等)、置内容被改变回调等特性,常用于表单中成对的标签与输入组合场景。

典型使用场景:

  • 用户注册表单(用户名、密码、邮箱等字段)
  • 信息录入表单(姓名、电话、地址等)
  • 搜索表单(关键词、筛选条件)
  • 设置表单(偏好配置、参数调整)
  • 数据验证表单(格式检查、实时反馈)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图

常用操作速查

操作属性/方法示例
设置输入框标题标题表单输入框1.标题 = "用户名:"
设置/获取输入内容内容表单输入框1.内容 = "张三"
设置提示文本提示文本表单输入框1.提示文本 = "请输入用户名"
设置输入类型输入类型表单输入框1.输入类型 = "email"
设置禁用状态禁用表单输入框1.禁用 = 真
设置只读状态只读表单输入框1.只读 = 真
设置最大长度最大长度表单输入框1.最大长度 = 20
设置内容改变回调置内容被改变回调(回调)表单输入框1.置内容被改变回调((源对象, 新内容) => { ... })

样式美化参考

以下为常用样式组合示例,可根据实际需求调整:

输入框样式变体:

  • 标准输入框:边框圆角 = 6边框 = "1px solid #d9d9d9"内边距 = "8px 12px"背景颜色 = "#ffffff"
  • 圆角输入框:边框圆角 = 20边框 = "1px solid #d9d9d9"内边距 = "10px 16px"
  • 下划线输入框:边框 = "none"边框底边 = "2px solid #d9d9d9"边框圆角 = 0
  • 阴影输入框:边框圆角 = 6边框 = "1px solid #d9d9d9"置内联样式("box-shadow", "0 2px 8px rgba(0,0,0,0.1)")

状态样式:

  • 正常状态:边框 = "1px solid #d9d9d9"
  • 聚焦状态:边框 = "2px solid #1890ff"
  • 错误状态:边框 = "1px solid #ff4d4f"
  • 成功状态:边框 = "1px solid #52c41a"
  • 禁用状态:背景颜色 = "#f5f5f5"光标样式 = "not-allowed"透明度 = 0.6

尺寸样式:

  • 大尺寸输入框:宽度 = 400高度 = 48字体大小 = 16内边距 = "12px 16px"
  • 中尺寸输入框:宽度 = 300高度 = 36字体大小 = 14内边距 = "8px 12px"
  • 小尺寸输入框:宽度 = 160高度 = 28字体大小 = 12内边距 = "4px 8px"

特殊类型样式:

  • 密码输入框:输入类型 = "password"字体大小 = "14px"
  • 数字输入框:输入类型 = "number"文本对齐 = "right"
  • 搜索输入框:输入类型 = "search"置内联样式("background-image", "url('search-icon.png')")

标签样式:

  • 左对齐标签:标题位置 = "left"标题宽度 = 80标题颜色 = "#333333"
  • 右对齐标签:标题位置 = "right"标题宽度 = 80标题颜色 = "#666666"
  • 顶部标签:标题位置 = "top"标题颜色 = "#333333"标题字体大小 = "12px"

验证反馈样式:

  • 错误提示:边框 = "1px solid #ff4d4f"置内联样式("background-image", "url('error-icon.png')")
  • 成功提示:边框 = "1px solid #52c41a"置内联样式("background-image", "url('success-icon.png')")
  • 实时验证:通过 置内容被改变回调 实时更新样式,例如:
    表单输入框1.置内容被改变回调((源对象, 新内容) => {
      如果(为空(新内容))
          表单输入框1.边框 = "1px solid #ff4d4f"  ' 错误状态
      否则
          表单输入框1.边框 = "1px solid #52c41a"  ' 成功状态
      结束 如果
    })
    

基础示例

简单场景内完整的表单输入框使用演示

' 1. 创建表单输入框
变量 表单输入框1 = 创建 表单输入框()
' 2. 设置属性
表单输入框1.左边 = 100
表单输入框1.顶边 = 100
表单输入框1.宽度 = 320
表单输入框1.标题 = "邮箱"
表单输入框1.输入类型 = "email"
表单输入框1.提示文本 = "请输入邮箱地址"
表单输入框1.内容 = "user@example.com"
表单输入框1.最大长度 = 50
' 3. 设置事件回调
表单输入框1.置内容被改变回调((源对象, 新内容) => {
    ' 实时验证邮箱格式
    如果(寻找文本("@", 新内容) > 0 且 寻找文本(".", 新内容) > 寻找文本("@", 新内容))
        表单输入框1.边框 = "1px solid #52c41a"  ' 成功状态
    否则
        表单输入框1.边框 = "1px solid #d9d9d9"  ' 默认状态
    结束 如果
    
    调试输出("邮箱:" + 新内容)
})
' 4. 添加到父容器
添加组件(表单输入框1)

综合示例:用户信息录入表单

本示例展示多个表单输入框配合使用的完整信息录入场景,包含实时验证、格式检查、状态反馈等功能。

' ========== 创建用户信息表单容器 ==========
变量 表单容器 = 创建 标签()
表单容器.左边 = 50
表单容器.顶边 = 50
表单容器.宽度 = 500
表单容器.高度 = 500
表单容器.背景颜色 = "#ffffff"
表单容器.边框圆角 = "8px"
表单容器.边框 = "1px solid #e8e8e8"
表单容器.内边距 = "24px"
添加组件(表单容器)

' ========== 创建用户名表单输入框 ==========
变量 输入框_用户名 = 创建 表单输入框()
输入框_用户名.左边 = 0
输入框_用户名.顶边 = 0
输入框_用户名.宽度 = 100%
输入框_用户名.标题 = "用户名:"
输入框_用户名.输入类型 = "text"
输入框_用户名.提示文本 = "请设置4-20位用户名"
输入框_用户名.最大长度 = 20
输入框_用户名.边框圆角 = "6px"
输入框_用户名.边框 = "1px solid #d9d9d9"
输入框_用户名.内边距 = "8px 12px"
输入框_用户名.置内容被改变回调((源对象, 新内容) => {
    ' 用户名验证:4-20位,只能包含字母、数字、下划线
    变量 长度 = 取文本长度(新内容)
    如果(长度 < 4 或 长度 > 20)
        输入框_用户名.边框 = "1px solid #ff4d4f"
        输入框_用户名.提示文本 = "用户名长度应在4-20位之间"
    否则
        输入框_用户名.边框 = "1px solid #52c41a"
        输入框_用户名.提示文本 = "用户名格式正确"
    结束 如果
})
添加组件(输入框_用户名)

' ========== 创建密码表单输入框 ==========
变量 输入框_密码 = 创建 表单输入框()
输入框_密码.左边 = 0
输入框_密码.顶边 = 60
输入框_密码.宽度 = 100%
输入框_密码.标题 = "密码:"
输入框_密码.输入类型 = "password"
输入框_密码.提示文本 = "请设置8-20位密码"
输入框_密码.最大长度 = 20
输入框_密码.边框圆角 = "6px"
输入框_密码.边框 = "1px solid #d9d9d9"
输入框_密码.内边距 = "8px 12px"
输入框_密码.置内容被改变回调((源对象, 新内容) => {
    ' 密码强度检测
    变量 长度 = 取文本长度(新内容)
    变量 强度 = "弱"
    变量 颜色 = "#ff4d4f"
    
    如果(长度 >= 8)
        强度 = "中"
        颜色 = "#faad14"
    结束 如果
    
    如果(长度 >= 12 且 寻找文本数字(新内容) > 0 且 寻找文本字母(新内容) > 0)
        强度 = "强"
        颜色 = "#52c41a"
    结束 如果
    
    输入框_密码.边框 = "1px solid " + 颜色
    输入框_密码.提示文本 = "密码强度:" + 强度
})
添加组件(输入框_密码)

' ========== 创建确认密码表单输入框 ==========
变量 输入框_确认密码 = 创建 表单输入框()
输入框_确认密码.左边 = 0
输入框_确认密码.顶边 = 120
输入框_确认密码.宽度 = 100%
输入框_确认密码.标题 = "确认密码:"
输入框_确认密码.输入类型 = "password"
输入框_确认密码.提示文本 = "请再次输入密码"
输入框_确认密码.最大长度 = 20
输入框_确认密码.边框圆角 = "6px"
输入框_确认密码.边框 = "1px solid #d9d9d9"
输入框_确认密码.内边距 = "8px 12px"
输入框_确认密码.置内容被改变回调((源对象, 新内容) => {
    ' 密码一致性检查
    如果(新内容 != 输入框_密码.内容)
        输入框_确认密码.边框 = "1px solid #ff4d4f"
        输入框_确认密码.提示文本 = "两次输入的密码不一致"
    否则
        输入框_确认密码.边框 = "1px solid #52c41a"
        输入框_确认密码.提示文本 = "密码确认正确"
    结束 如果
})
添加组件(输入框_确认密码)

' ========== 创建邮箱表单输入框 ==========
变量 输入框_邮箱 = 创建 表单输入框()
输入框_邮箱.左边 = 0
输入框_邮箱.顶边 = 180
输入框_邮箱.宽度 = 100%
输入框_邮箱.标题 = "邮箱:"
输入框_邮箱.输入类型 = "email"
输入框_邮箱.提示文本 = "请输入有效的邮箱地址"
输入框_邮箱.最大长度 = 50
输入框_邮箱.边框圆角 = "6px"
输入框_邮箱.边框 = "1px solid #d9d9d9"
输入框_邮箱.内边距 = "8px 12px"
输入框_邮箱.置内容被改变回调((源对象, 新内容) => {
    ' 邮箱格式验证
    如果(为空(新内容))
        输入框_邮箱.边框 = "1px solid #d9d9d9"
        输入框_邮箱.提示文本 = "请输入邮箱地址"
    否则 如果(寻找文本("@", 新内容) > 0 且 寻找文本(".", 新内容) > 寻找文本("@", 新内容))
        输入框_邮箱.边框 = "1px solid #52c41a"
        输入框_邮箱.提示文本 = "邮箱格式正确"
    否则
        输入框_邮箱.边框 = "1px solid #ff4d4f"
        输入框_邮箱.提示文本 = "请输入有效的邮箱地址"
    结束 如果
})
添加组件(输入框_邮箱)

' ========== 创建手机号表单输入框 ==========
变量 输入框_手机号 = 创建 表单输入框()
输入框_手机号.左边 = 0
输入框_手机号.顶边 = 240
输入框_手机号.宽度 = 100%
输入框_手机号.标题 = "手机号:"
输入框_手机号.输入类型 = "tel"
输入框_手机号.提示文本 = "请输入11位手机号"
输入框_手机号.最大长度 = 11
输入框_手机号.边框圆角 = "6px"
输入框_手机号.边框 = "1px solid #d9d9d9"
输入框_手机号.内边距 = "8px 12px"
输入框_手机号.置内容被改变回调((源对象, 新内容) => {
    ' 手机号格式验证
    变量 长度 = 取文本长度(新内容)
    如果(长度 == 11 且 寻找文本数字(新内容) == 11)
        输入框_手机号.边框 = "1px solid #52c41a"
        输入框_手机号.提示文本 = "手机号格式正确"
    否则
        输入框_手机号.边框 = "1px solid #ff4d4f"
        输入框_手机号.提示文本 = "请输入11位数字手机号"
    结束 如果
})
添加组件(输入框_手机号)

' ========== 创建提交按钮 ==========
变量 按钮_提交 = 创建 按钮()
按钮_提交.左边 = 0
按钮_提交.顶边 = 300
按钮_提交.宽度 = 100%
按钮_提交.高度 = 44
按钮_提交.文本 = "提交注册"
按钮_提交.背景颜色 = "#1890ff"
按钮_提交.文本颜色 = "#ffffff"
按钮_提交.边框圆角 = "6px"
按钮_提交.字体大小 = "16px"
按钮_提交.置被单击回调((源对象, 事件对象) => {
    ' 验证所有字段
    变量 验证通过 = 真
    
    如果(输入框_用户名.边框 != "1px solid #52c41a")
        验证通过 = 假
    结束 如果
    
    如果(输入框_密码.边框 != "1px solid #52c41a")
        验证通过 = 假
    结束 如果
    
    如果(输入框_确认密码.边框 != "1px solid #52c41a")
        验证通过 = 假
    结束 如果
    
    如果(输入框_邮箱.边框 != "1px solid #52c41a")
        验证通过 = 假
    结束 如果
    
    如果(输入框_手机号.边框 != "1px solid #52c41a")
        验证通过 = 假
    结束 如果
    
    如果(验证通过)
        弹出提示("注册信息提交成功!")
        ' 这里可以添加实际的提交逻辑
    否则
        弹出提示("请检查并修正表单中的错误")
    结束 如果
})
添加组件(按钮_提交)

' ========== 添加表单说明 ==========
变量 说明标签 = 创建 标签()
说明标签.左边 = 0
说明标签.顶边 = 360
说明标签.宽度 = 100%
说明标签.高度 = 24
说明标签.文本 = "* 所有字段均为必填项,请确保信息准确无误"
说明标签.文本颜色 = "#999999"
说明标签.字体大小 = "12px"
说明标签.内容水平对齐方式 = "center"
添加组件(说明标签)

属性:标题

  • 类型: 文本型
  • 说明: 设置或获取输入框的标题文本,显示在输入框上方或左侧。

属性:内容

  • 类型: 文本型
  • 说明: 设置或获取输入框中的文本内容。

属性:提示文本

  • 类型: 文本型
  • 说明: 设置或获取输入框的提示文本,当输入框为空时显示。

属性:输入类型

  • 类型: 文本型
  • 说明: 设置或获取输入框类型,支持:
    • text:普通文本输入
    • password:密码输入(显示为圆点)
    • email:邮箱输入(带邮箱验证)
    • tel:电话号码输入(数字键盘)
    • number:数字输入(带上下调按钮)
    • date:日期选择
    • time:时间选择
    • datetime-local:日期时间选择
    • url:URL地址输入
    • search:搜索输入框
    • color:颜色选择器
    • file:文件选择
    • image:图片选择
    • audio:音频选择
    • video:视频选择

属性:禁用

  • 类型: 逻辑型
  • 说明: 设置或获取输入框是否禁用,禁用后用户无法输入。

属性:只读

  • 类型: 逻辑型
  • 说明: 设置或获取输入框是否为只读状态,只读状态下用户无法修改内容但可以查看。

属性:最大长度

  • 类型: 数值型
  • 说明: 设置或获取输入框允许输入的最大字符数。

函数:置内容被改变回调(回调函数)

设置当输入框内容被改变时的回调函数,回调函数返回两个参数:(事件对象, 新内容)

回调函数格式:

表单输入框1.置内容被改变回调((源对象, 新内容) => {
    ' 处理内容变化
    调试输出("新内容:" + 新内容)
})

事件:内容被改变(源对象,新内容)

当输入框内容被改变时触发并回调该事件。

事件处理示例:

事件 表单输入框1.内容被改变(源对象, 新内容)
    调试输出("内容变为:" + 新内容)
结束 事件

⚠️ 注意事项

  1. 输入验证:建议在 置内容被改变回调 中添加实时验证逻辑,提升用户体验。
  2. 类型限制:不同输入类型有不同的验证规则,如 email 会自动验证邮箱格式。
  3. 性能优化:避免在回调中执行耗时操作,特别是频繁触发的内容变化事件。
  4. 移动端适配:移动端设备上,不同输入类型会显示不同的键盘布局,需考虑用户体验。
  5. 无障碍访问:建议为输入框添加适当的 aria-label 属性,提升可访问性。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档文本类组件_标签 —— 与表单输入框配合使用的标签组件
  • 文档文本类组件_按钮 —— 与表单输入框配合使用的按钮组件
  • 文档文本类组件_表单 —— 完整的表单组件
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式语法规则

组件:评分框

评分框组件用于星级评分展示和交互,支持设置最大值、分值、允许半选、只读、字符、激活颜色、未激活颜色、字号、置评分被改变回调等特性,常用于商品评分、满意度评价、质量评级等场景,支持半星评分。

典型使用场景:

  • 商品评分(电商平台的星级评价)
  • 满意度调查(服务评价、用户体验评分)
  • 质量评级(产品质量、服务等级评定)
  • 用户反馈(功能使用体验评分)
  • 内容质量评分(文章、视频质量评价)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图

常用操作速查

操作属性/方法示例
设置最大星数最大值评分框1.最大值 = 5
设置当前评分分值评分框1.分值 = 3.5
允许半星评分允许半选评分框1.允许半选 = 真
设置只读模式只读评分框1.只读 = 真
设置激活颜色激活颜色评分框1.激活颜色 = "#fadb14"
设置未激活颜色未激活颜色评分框1.未激活颜色 = "#d9d9d9"
设置字符样式字符评分框1.字符 = "★"
设置评分改变回调置评分被改变回调(回调)评分框1.置评分被改变回调((源对象, 当前分值) => { ... })

样式美化参考

评分样式变体:

  • 简约评分:激活颜色 = "#fadb14"未激活颜色 = "#d9d9d9"字符 = "★"
  • 彩色评分:激活颜色 = "#1890ff"未激活颜色 = "#e8e8e8"字符 = "★"
  • 字符评分:字符 = "☆"激活颜色 = "#52c41a"未激活颜色 = "#f0f0f0"
  • 数字评分:字符 = "1"激活颜色 = "#ff4d4f"未激活颜色 = "#fafafa"

尺寸样式:

  • 小尺寸:字体大小 = "20px"高度 = 30
  • 中尺寸:字体大小 = "24px"高度 = 36
  • 大尺寸:字体大小 = "32px"高度 = 48

状态样式:

  • 只读状态:背景颜色 = "#fafafa"光标样式 = "default"
  • 禁用状态:禁用 = 真透明度 = "0.6"

示例代码

' 示例:完整的评分框使用演示
' 1. 创建评分框
变量 评分框1 = 创建 评分框()
' 2. 设置属性
评分框1.左边 = 100
评分框1.顶边 = 100
评分框1.最大值 = 5
评分框1.分值 = 3.5
评分框1.允许半选 = 真
评分框1.激活颜色 = "#fadb14"
' 3. 设置事件回调
评分框1.置评分被改变回调((源对象, 当前分值) => {
	调试输出("评分:" + 当前分值)
})
' 4. 添加到父容器
添加组件(评分框1)

属性:最大值

  • 类型: 数值型
  • 说明: 设置或获取星的总数,默认 5。

属性:分值

  • 类型: 数值型
  • 说明: 设置或获取当前评分。

属性:允许半选

  • 类型: 逻辑型
  • 说明: 设置或获取是否允许半星选择,默认为假。

属性:只读

  • 类型: 逻辑型
  • 说明: 设置或获取是否只读,默认为假。

属性:字符

  • 类型: 文本型
  • 说明: 设置或获取星字符,默认 ★。

属性:激活颜色

  • 类型: 文本型
  • 说明: 设置或获取激活星颜色。

属性:未激活颜色

  • 类型: 文本型
  • 说明: 设置或获取未激活星颜色。

属性:字号

  • 类型: 数值型
  • 说明: 设置或获取星字符字号(像素)。

函数:置分值(分值)

设置当前评分。

函数:置评分被改变回调(回调函数)

设置评分改变时的回调函数,回调函数返回两个参数:(源对象,当前分值)。

事件:评分被改变(源对象,当前值)

当评分改变时触发该事件。

组件:超链接

超链接组件用于创建可点击的链接以跳转到指定地址,支持设置地址、打开模式(_blank/_self等)、下载文件名等特性,常用于页面导航、外部链接跳转、文件下载等场景。

典型使用场景:

  • 页面内导航(章节跳转、目录链接)
  • 外部网站链接(官网、文档、资源)
  • 文件下载(PDF、文档、安装包)
  • 功能触发(打开对话框、执行操作)
  • 社交媒体链接(微博、微信、GitHub)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对-align到左(目标组件, 偏移量)、左侧对-align到右(目标组件, 偏移量)、底边对-align到顶(目标组件, 偏移量)、顶边对-align到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图

常用操作速查

操作属性/方法示例
设置链接文本文本超链接1.文本 = "访问官网"
设置链接地址地址超链接1.地址 = "https://www.example.com"
设置打开方式打开模式超链接1.打开模式 = "_blank"
设置下载文件名下载文件名超链接1.下载文件名 = "document.pdf"
设置禁用状态禁用超链接1.禁用 = 真
设置点击回调置被单击回调(回调)超链接1.置被单击回调((源对象, 事件对象) => { ... })

样式美化参考

以下为常用样式组合示例,可根据实际需求调整:

链接样式变体:

  • 普通链接:文本颜色 = "#1890ff"无下划线 = 真字体大小 = "14px"
  • 下划线链接:文本颜色 = "#1890ff"下划线 = 真字体大小 = "14px"
  • 按钮式链接:背景颜色 = "#1890ff"文本颜色 = "#ffffff"边框圆角 = "4px"内边距 = "8px 16px"
  • 卡片式链接:背景颜色 = "#f5f5f5"边框 = "1px solid #e8e8e8"边框圆角 = "6px"内边距 = "12px"

状态样式:

  • 默认状态:文本颜色 = "#1890ff"
  • 悬浮状态:文本颜色 = "#096dd9"(通过 置鼠标被进入回调 动态改变)
  • 点击状态:文本颜色 = "#40a9ff"(通过 置鼠标被按下回调 动态改变)
  • 访问过状态:文本颜色 = "#8c8c8c"(通过 置内联样式("color", "#8c8c8c") 设置)
  • 禁用状态:文本颜色 = "#d9d9d9"光标样式 = "not-allowed"透明度 = 0.6

图标链接样式:

  • 图标+文本:文本 = "📖 阅读文档"字体大小 = "14px"行高 = "24px"
  • 纯图标:文本 = "🔗"字体大小 = "18px"宽度 = 32高度 = 32内容水平对齐方式 = "center"
  • 图标按钮:文本 = "⬇️"背景颜色 = "#1890ff"文本颜色 = "#ffffff"边框圆角 = "50%"宽度 = 36高度 = 36

导航链接样式:

  • 侧边栏导航:文本颜色 = "#333333"字体大小 = "16px"内边距 = "12px 24px"置内联样式("display", "block")
  • 面包屑导航:文本颜色 = "#666666"字体大小 = "12px"置内联样式("margin-right", "8px")
  • 标签页导航:文本颜色 = "#333333"边框底边 = "2px solid transparent"内边距 = "8px 16px"置内联样式("cursor", "pointer")

特殊功能链接:

  • 下载链接:下载文件名 = "file.pdf"文本 = "📥 下载PDF"文本颜色 = "#52c41a"
  • 外部链接:打开模式 = "_blank"文本 = "🔗 外部链接"置内联样式("target", "_blank")
  • 邮件链接:地址 = "mailto:example@email.com"文本 = "📧 发送邮件"文本颜色 = "#ff4d4f"

交互效果样式:

  • 鼠标悬浮变色:通过 置鼠标被进入回调置鼠标被移出回调 动态改变颜色
    超链接1.置鼠标被进入回调((源对象, 事件对象) => {
      超链接1.文本颜色 = "#096dd9"
    })
    超链接1.置鼠标被移出回调((源对象, 事件对象) => {
      超链接1.文本颜色 = "#1890ff"
    })
    
  • 点击波纹效果:通过 置被单击回调 添加视觉反馈
    超链接1.置被单击回调((源对象, 事件对象) => {
      超链接1.透明度 = 0.6
      延时执行(() => {
        超链接1.透明度 = 1
      }, 200)
    })
    

基础示例

简单场景内完整的超链接使用演示

' 1. 创建超链接
变量 超链接1 = 创建 超链接()
' 2. 设置属性
超链接1.左边 = 100
超链接1.顶边 = 100
超链接1.宽度 = 120
超链接1.高度 = 36
超链接1.文本 = "访问官网"
超链接1.地址 = "https://www.example.com"
超链接1.打开模式 = "_blank"
超链接1.字体大小 = "16px"
超链接1.文本颜色 = "#1890ff"
超链接1.内容水平对齐方式 = "center"
超链接1.行高 = "36px"
' 3. 设置事件回调(可选)
超链接1.置被单击回调((源对象, 事件对象) => {
    ' 可以在这里添加自定义逻辑,比如统计点击
    调试输出("链接被点击:" + 超链接1.地址)
})
' 4. 添加到父容器
添加组件(超链接1)

综合示例:导航菜单与资源链接

本示例展示超链接在导航菜单和资源下载中的综合应用,包含多种链接样式和交互效果。

' ========== 创建页面标题 ==========
变量 标题 = 创建 标签()
标题.左边 = 20
标题.顶边 = 20
标题.宽度 = 760
标题.高度 = 48
标题.文本 = "📚 轻语言学习资源"
标题.字体大小 = "24px"
标题.字体粗细 = "粗体"
标题.文本颜色 = "#333333"
标题.内容水平对齐方式 = "center"
添加组件(标题)

' ========== 创建主导航链接组 ==========
主导航链接 = 创建 标签()
主导航链接.左边 = 20
主导航链接.顶边 = 80
主导航链接.宽度 = 760
主导航链接.高度 = 40
主导航链接.背景颜色 = "#f8f9fa"
主导航链接.边框圆角 = "6px"
主导航链接.置内联样式("display", "flex")
主导航链接.置内联样式("align-items", "center")
主导航链接.置内联样式("padding", "0 16px")
添加组件(主导航链接)

' ========== 添加导航链接 ==========
变量 链接_首页 = 创建 超链接()
链接_首页.文本 = "🏠 首页"
链接_首页.地址 = "#home"
链接_首页.文本颜色 = "#333333"
链接_首页.字体大小 = "14px"
链接_首页.行高 = "40px"
链接_首页.置内联样式("margin-right", "24px")
链接_首页.置被单击回调((源对象, 事件对象) => {
    弹出提示("导航到首页")
})
添加组件(链接_首页)

变量 链接_文档 = 创建 超链接()
链接_文档.文本 = "📖 文档"
链接_文档.地址 = "#docs"
链接_文档.文本颜色 = "#333333"
链接_文档.字体大小 = "14px"
链接_文档.行高 = "40px"
链接_文档.置内联样式("margin-right", "24px")
链接_文档.置被单击回调((源对象, 事件对象) => {
    弹出提示("打开文档中心")
})
添加组件(链接_文档)

变量 链接_示例 = 创建 超链接()
链接_示例.文本 = "💻 示例"
链接_示例.地址 = "#examples"
链接_示例.文本颜色 = "#333333"
链接_示例.字体大小 = "14px"
链接_示例.行高 = "40px"
链接_示例.置内联样式("margin-right", "24px")
链接_示例.置被单击回调((源对象, 事件对象) => {
    弹出提示("查看代码示例")
})
添加组件(链接_示例)

变量 链接_社区 = 创建 超链接()
链接_社区.文本 = "👥 社区"
链接_社区.地址 = "https://qinglang.example.com/community"
链接_社区.打开模式 = "_blank"
链接_社区.文本颜色 = "#1890ff"
链接_社区.字体大小 = "14px"
链接_社区.行高 = "40px"
链接_社区.置被单击回调((源对象, 事件对象) => {
    弹出提示("跳转到社区论坛(新窗口)")
})
添加组件(链接_社区)

' ========== 创建资源下载区域 ==========
变量 资源标题 = 创建 标签()
资源标题.左边 = 20
资源标题.顶边 = 140
资源标题.宽度 = 760
资源标题.高度 = 32
资源标题.文本 = "📥 下载资源"
资源标题.字体大小 = "18px"
资源标题.字体粗细 = "粗体"
资源标题.文本颜色 = "#333333"
添加组件(资源标题)

' ========== 创建下载链接组 ==========
下载容器 = 创建 标签()
下载容器.左边 = 20
下载容器.顶边 = 180
下载容器.宽度 = 760
下载容器.高度 = 120
下载容器.背景颜色 = "#fafafa"
下载容器.边框 = "1px solid #e8e8e8"
下载容器.边框圆角 = "8px"
下载容器.内边距 = "16px"
下载容器.置内联样式("display", "grid")
下载容器.置内联样式("grid-template-columns", "repeat(3, 1fr)")
下载容器.置内联样式("gap", "16px")
添加组件(下载容器)

' ========== 添加下载链接 ==========
变量 下载_手册 = 创建 超链接()
下载_手册.文本 = "📘 用户手册.pdf"
下载_手册.地址 = "/downloads/user-manual.pdf"
下载_手册.下载文件名 = "轻语言用户手册.pdf"
下载_手册.文本颜色 = "#1890ff"
下载_手册.字体大小 = "14px"
下载_手册.行高 = "32px"
下载_手册.置内联样式("padding", "8px")
下载_手册.置内联样式("background-color", "#f0f9ff")
下载_手册.置内联样式("border-radius", "4px")
下载_手册.置被单击回调((源对象, 事件对象) => {
    弹出提示("开始下载用户手册")
})
添加组件(下载_手册)

变量 下载_示例 = 创建 超链接()
下载_示例.文本 = "💻 示例代码.zip"
下载_示例.地址 = "/downloads/examples.zip"
下载_示例.下载文件名 = "轻语言示例代码.zip"
下载_示例.文本颜色 = "#52c41a"
下载_示例.字体大小 = "14px"
下载_示例.行高 = "32px"
下载_示例.置内联样式("padding", "8px")
下载_示例.置内联样式("background-color", "#f6ffed")
下载_示例.置内联样式("border-radius", "4px")
下载_示例.置被单击回调((源对象, 事件对象) => {
    弹出提示("开始下载示例代码")
})
添加组件(下载_示例)

变量 下载_工具 = 创建 超链接()
下载_工具.文本 = "🔧 开发工具.exe"
下载_工具.地址 = "/downloads/dev-tool.exe"
下载_工具.下载文件名 = "轻语言开发工具.exe"
下载_工具.文本颜色 = "#fa8c16"
下载_工具.字体大小 = "14px"
下载_工具.行高 = "32px"
下载_工具.置内联样式("padding", "8px")
下载_工具.置内联样式("background-color", "#fff7e6")
下载_工具.置内联样式("border-radius", "4px")
下载_工具.置被单击回调((源对象, 事件对象) => {
    弹出提示("开始下载开发工具")
})
添加组件(下载_工具)

' ========== 创建联系我们链接 ==========
变量 联系我们 = 创建 标签()
联系我们.左边 = 20
联系我们.顶边 = 320
联系我们.宽度 = 760
联系我们.高度 = 40
联系我们.文本 = "需要帮助?"
联系我们.字体大小 = "14px"
联系我们.文本颜色 = "#666666"
联系我们.内容水平对齐方式 = "center"
添加组件(联系我们)

变量 链接_支持 = 创建 超链接()
链接_支持.文本 = "📞 联系技术支持"
链接_支持.地址 = "mailto:support@example.com"
链接_支持.文本颜色 = "#1890ff"
链接_支持.字体大小 = "14px"
链接_支持.行高 = "40px"
链接_支持.置被单击回调((源对象, 事件对象) => {
    弹出提示("打开邮件客户端联系支持团队")
})
添加组件(链接_支持)

' ========== 创建页脚链接 ==========
变量 页脚 = 创建 标签()
页脚.左边 = 20
页脚.顶边 = 380
页脚.宽度 = 760
页脚.高度 = 32
页脚.文本 = "© 2024 轻语言团队 | "
页脚.字体大小 = "12px"
页脚.文本颜色 = "#999999"
页脚.内容水平对齐方式 = "center"
添加组件(页脚)

变量 链接_隐私 = 创建 超链接()
链接_隐私.文本 = "隐私政策"
链接_隐私.地址 = "#privacy"
链接_隐私.文本颜色 = "#999999"
链接_隐私.字体大小 = "12px"
链接_隐私.行高 = "32px"
链接_隐私.置被单击回调((源对象, 事件对象) => {
    弹出提示("查看隐私政策")
})
添加组件(链接_隐私)

变量 链接_条款 = 创建 超链接()
链接_条款.文本 = "服务条款"
链接_条款.地址 = "#terms"
链接_条款.文本颜色 = "#999999"
链接_条款.字体大小 = "12px"
链接_条款.行高 = "32px"
链接_条款.置被单击回调((源对象, 事件对象) => {
    弹出提示("查看服务条款")
})
添加组件(链接_条款)

属性:地址

  • 类型: 文本型
  • 说明: 设置或获取当前超链接指向的目标地址。支持:
    • 普通URL:"https://www.example.com"
    • 页面内锚点:"#section1"
    • 邮件地址:"mailto:example@email.com"
    • 电话号码:"tel:+8613800138000"

属性:下载文件名

  • 类型: 文本型
  • 说明: 设置或获取当前超链接指向的待下载文件的名称。设置该属性后,点击超链接将会自动下载指定文件。

属性:打开模式

  • 类型: 文本型
  • 说明: 设置或获取当前超链接的打开方式,常见取值及含义:
    • _blank:在新窗口打开链接
    • _self:在当前窗口打开链接(默认值)
    • _parent:在父窗口打开链接,如果没有父窗口则等同于 _self
    • _top:在顶级窗口打开链接,如果没有父窗口则等同于 _self
    • 框架名称:在指定的框架中打开链接

⚠️ 注意事项

  1. 安全性:外部链接建议使用 _blank 模式,避免当前页面被替换。
  2. 无障碍访问:建议为链接添加适当的 aria-label 属性,提升可访问性。
  3. 用户体验:重要操作(如下载)建议添加确认提示,避免用户误操作。
  4. 性能优化:大量链接时建议使用事件委托,减少内存占用。
  5. 样式一致性:保持链接样式的一致性,避免用户混淆。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档文本类组件_标签 —— 与超链接配合使用的标签组件
  • 文档文本类组件_按钮 —— 与超链接配合使用的按钮组件
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式语法规则
  • 文档综合演示:导航菜单设计 —— 完整导航菜单示例

组件:锚点

锚点组件用于在页面滚动时高亮当前可视区域对应的导航链接,并支持点击导航项平滑滚动到目标区域。它常用于长文档目录导航、功能列表快速定位、FAQ分类导航等场景。该组件会监听滚动事件,自动根据滚动位置激活对应的锚点项,并提供回调通知切换事件。

典型使用场景:

  • 文章目录导航(长文档的章节跳转)
  • 产品功能导航(功能列表的快速定位)
  • FAQ分类导航(问题分类的快速查找)
  • 产品特性展示(产品功能的锚点导航)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
添加锚点项添加项目(标题, 目标选择器, 键)锚点1.添加项目("第一章", "#sec1", "ch1")
设置滚动监听容器(默认window)置滚动容器(容器元素)锚点1.置滚动容器(滚动框.取原生对象())
设置顶部偏移(用于固定头部补偿)置顶部偏移(像素值)锚点1.置顶部偏移(60)
手动激活某个锚点项置激活项(键)锚点1.置激活项("ch2")
设置锚点切换回调置锚点被切换回调(回调函数)锚点1.置锚点被切换回调((源对象, 键) => { ... })
清空所有锚点项清空()锚点1.清空()
销毁组件(移除滚动监听)销毁()锚点1.销毁()

样式美化参考

锚点组件的外观可通过继承的视图属性进行调整:

  • 整体容器:通过 宽度背景颜色边框边框圆角内边距 等属性美化导航列表。
  • 锚点项:每个锚点项默认是块级元素,可通过 文本颜色字体大小行高 等控制文本样式。激活状态(当前可视区域对应的项)会自动高亮(通常由组件内部样式控制,可借助 CSS 类自定义)。
  • 鼠标悬停:可通过 置鼠标被进入/置鼠标被移出 事件动态改变样式,或通过 CSS 类实现。
  • 自定义激活样式:可通过 CSS 类覆盖激活状态的颜色、背景等。

💡 锚点项的激活样式默认由组件管理,若需深度定制,可在添加项目时通过 置属性值添加样式类 为每个项目绑定样式类,并在 CSS 中定义 .active 状态。


基础示例

创建一个简单的锚点导航,包含三个章节,点击导航项平滑滚动到对应区域,并在滚动时自动高亮当前章节。

' ========== 创建锚点导航 ==========
变量 锚点1 = 创建 锚点()
锚点1.左边 = 30
锚点1.顶边 = 30
锚点1.宽度 = 200
锚点1.字体大小 = "14px"
锚点1.文本颜色 = "#666"
锚点1.背景颜色 = "#f8f9fa"
锚点1.边框 = "1px solid #e8e8e8"
锚点1.边框圆角 = "6px"
锚点1.内边距 = "8px"

' 添加锚点项(目标选择器为页面中的元素ID)
锚点1.添加项目("第一章", "#sec1", "ch1")
锚点1.添加项目("第二章", "#sec2", "ch2")
锚点1.添加项目("第三章", "#sec3", "ch3")

' 设置顶部偏移(如果有固定头部,可设置偏移量)
锚点1.置顶部偏移(0)

' 设置切换回调
锚点1.置锚点被切换回调((源对象, 键) => {
    调试输出("切换到:" + 键)
})

添加组件(锚点1)

' ========== 创建对应的内容区域 ==========
' 这些区域需要有对应的ID,以便锚点定位
变量 内容1 = 创建 标签()
内容1.文本 = "这是第一章内容..."
内容1.左边 = 260
内容1.顶边 = 30
内容1.ID = "sec1"  ' 设置ID用于锚点定位
添加组件(内容1)

变量 内容2 = 创建 标签()
内容2.文本 = "这是第二章内容..."
内容2.左边 = 260
内容2.顶边 = 300
内容2.ID = "sec2"
添加组件(内容2)

变量 内容3 = 创建 标签()
内容3.文本 = "这是第三章内容..."
内容3.左边 = 260
内容3.顶边 = 600
内容3.ID = "sec3"
添加组件(内容3)

综合示例:文章目录导航

本示例展示一个完整的文章页面,包含右侧浮动的目录导航,点击目录项可平滑滚动到对应章节,滚动时目录高亮自动更新。

' ========== 创建文章容器(包含所有章节) ==========
变量 文章容器 = 创建 绝对布局()
文章容器.左边 = 30
文章容器.顶边 = 20
文章容器.宽度 = 800
文章容器.高度 = 800
添加组件(文章容器)

' 文章标题
变量 文章标题 = 创建 标签()
文章标题.文本 = "轻语言入门指南"
文章标题.字体大小 = "24px"
文章标题.字体粗细 = "bold"
文章标题.左边 = 0
文章标题.顶边 = 0
文章容器.添加组件(文章标题)

' 定义章节数据
变量 章节数据 = [
    {标题: "介绍", 内容: "轻语言是一种...", id: "intro"},
    {标题: "快速开始", 内容: "首先安装...", id: "start"},
    {标题: "基本语法", 内容: "变量声明...", id: "syntax"},
    {标题: "组件使用", 内容: "按钮、编辑框...", id: "components"},
    {标题: "总结", 内容: "轻语言适合...", id: "summary"}
]

' 动态生成章节内容(每个章节用一个标签显示,并设置ID)
变量 当前顶边 = 60
变量循环(i = 0, 取数组成员数(章节数据), 1)
    变量 章 = 章节数据[i]
    变量 章节标题 = 创建 标签()
    章节标题.文本 = 章.标题
    章节标题.字体大小 = "20px"
    章节标题.字体粗细 = "bold"
    章节标题.左边 = 0
    章节标题.顶边 = 当前顶边
    文章容器.添加组件(章节标题)
    当前顶边 = 当前顶边 + 30
    
    变量 章节内容 = 创建 标签()
    章节内容.文本 = 章.内容
    章节内容.字体大小 = "16px"
    章节内容.文本颜色 = "#444"
    章节内容.左边 = 0
    章节内容.顶边 = 当前顶边
    章节内容.ID = 章.id  ' 设置ID用于锚点定位
    文章容器.添加组件(章节内容)
    当前顶边 = 当前顶边 + 100
结束循环

' ========== 创建锚点导航(浮动在右侧) ==========
变量 锚点导航 = 创建 锚点()
锚点导航.左边 = 580
锚点导航.顶边 = 80
锚点导航.宽度 = 180
锚点导航.背景颜色 = "#ffffff"
锚点导航.边框 = "1px solid #e8e8e8"
锚点导航.边框圆角 = "8px"
锚点导航.内边距 = "12px"
锚点导航.字体大小 = "14px"
锚点导航.文本颜色 = "#333"
锚点导航.定位 = "fixed"  ' 固定定位,随滚动
添加组件(锚点导航)

' 添加锚点项
变量循环(i = 0, 取数组成员数(章节数据), 1)
    变量 章 = 章节数据[i]
    锚点导航.添加项目(章.标题, "#" + 章.id, "nav_" + 章.id)
结束循环

' 设置顶部偏移(因为可能有固定头部,此处设为0)
锚点导航.置顶部偏移(0)

' 设置切换回调
锚点导航.置锚点被切换回调((源对象, 键) => {
    调试输出("导航到:" + 键)
    ' 可在此处记录用户行为或更新其他UI
})

' 设置滚动容器(默认window,无需额外设置)

函数详解

添加项目(标题, 目标选择器, 键)

  • 功能: 向锚点组件添加一个导航项。每个项对应页面中的一个目标元素(通过 CSS 选择器定位),当滚动到该元素时,对应项会自动高亮。
  • 参数:
    • 标题:文本型,导航项显示的文字。
    • 目标选择器:文本型,CSS 选择器(如 "#sec1"".section"),用于定位目标元素。
    • :文本型,可选,用于唯一标识该项,可在回调中区分。若不传,组件会自动生成。
  • 返回值: 数值型,新添加项的索引(从0开始)。
  • 示例: 锚点1.添加项目("第一章", "#chapter1", "ch1")

置激活项(键)

  • 功能: 手动激活指定键的锚点项(高亮显示),并滚动到对应的目标元素(如果目标元素存在)。通常用于外部控制(如从其他组件跳转)。
  • 参数: (文本型),要激活的项的键。
  • 返回值: 无。
  • 示例: 锚点1.置激活项("ch2")

置滚动容器(容器元素)

  • 功能: 设置监听滚动的容器元素(默认为 window)。当在某个容器内部滚动时,锚点监听该容器的滚动事件并更新高亮。
  • 参数: 容器元素,可以是原生 DOM 元素(通过 取原生对象() 获取)或 (恢复默认监听 window)。
  • 返回值: 无。
  • 示例:
    变量 容器 = 滚动框1.取原生对象()
    锚点1.置滚动容器(容器)
    

置顶部偏移(偏移像素)

  • 功能: 设置滚动到目标元素时的顶部偏移量(像素)。当页面有固定头部(如导航栏)时,设置此偏移量可避免目标元素被头部遮挡。
  • 参数: 偏移像素(数值型),正数表示向下偏移。
  • 返回值: 无。
  • 示例: 锚点1.置顶部偏移(60) 表示目标元素顶部会与视口顶部保持 60px 距离。

置锚点被切换回调(回调函数)

  • 功能: 设置当高亮的锚点项发生变化时的回调函数。触发时机包括滚动到新区域和通过代码调用 置激活项
  • 参数: 回调函数,格式为 (源对象, 键) => { ... }
    • 源对象:锚点组件本身。
    • :当前激活的锚点项的键。
  • 返回值: 无。
  • 示例:
    锚点1.置锚点被切换回调((源对象, 键) => {
        调试输出("当前章节:" + 键)
    })
    

清空()

  • 功能: 清空所有锚点项,移除所有导航链接。
  • 返回值: 无。

销毁()

  • 功能: 销毁锚点组件,移除滚动监听,释放资源。调用后组件不可再用。
  • 返回值: 无。

事件说明

锚点被切换(源对象, 键)

  • 功能:置锚点被切换回调 等效,适用于设计文件(.spldg)中定义的组件。
  • 示例:
    事件 锚点1.锚点被切换(源对象, 键)
        调试输出("切换到:" + 键)
    结束 事件
    

⚠️ 注意事项

  1. 目标元素必须存在:添加锚点项时,目标选择器 必须能匹配到页面中的一个元素(如通过 IDclass),否则点击或滚动定位会失效。
  2. 滚动容器:默认监听 window 的滚动,若在自定义滚动容器(如 垂直滚动框)内部使用,需通过 置滚动容器 指定该容器的原生 DOM 元素。
  3. 顶部偏移:设置偏移量后,组件会计算滚动位置时考虑偏移,确保目标元素不被固定头部遮挡。
  4. 平滑滚动:点击锚点项时,组件会自动使用平滑滚动(behavior: 'smooth')滚动到目标位置,所有现代浏览器均支持。
  5. 高亮更新:滚动时,组件会实时计算当前可视区域内的目标元素,并自动高亮对应的导航项。回调 锚点被切换 会在高亮项变化时触发。
  6. 键的唯一性:建议为每个锚点项指定唯一的 ,以便在回调中准确识别。
  7. 性能:滚动事件监听较为频繁,组件内部已做节流优化,但仍建议避免在回调中执行复杂计算。
  8. 销毁:在页面切换或组件不再使用时,应调用 销毁() 移除滚动监听,防止内存泄漏。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档列表类组件_垂直滚动框 —— 自定义滚动容器
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、循环语句等
  • 文档综合演示:文章目录导航 —— 实际应用示例

组件:面包屑

面包屑组件用于显示当前页面在系统层级结构中的位置,支持设置分隔符、分隔符颜色、添加项目、置路径数组、置项目被单击回调等特性,常用于页面层级导航、当前位置展示、面包屑导航等场景,最后一个项目不可点击。

典型使用场景:

  • 文章导航(首页 > 分类 > 文章标题)
  • 产品导航(首页 > 产品分类 > 产品详情)
  • 电商导航(首页 > 商品分类 > 商品详情)
  • 管理后台(首页 > 用户管理 > 用户列表)
  • 文件路径(首页 > 文件夹 > 子文件夹 > 文件)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图

常用操作速查

操作属性/方法示例
添加面包屑项目添加项目(文本)面包屑1.添加项目("首页")
设置分隔符分隔符面包屑1.分隔符 = "/"
设置分隔符颜色分隔符颜色面包屑1.分隔符颜色 = "#d9d9d9"
设置路径数组置路径数组(数组)面包屑1.置路径数组(["首页", "分类", "详情"])
设置项目点击回调置项目被单击回调(回调)面包屑1.置项目被单击回调((源对象, 文本, 标记值, 索引) => { ... })
清空所有项目清空()面包屑1.清空()

样式美化参考

面包屑样式变体:

  • 简约样式:背景颜色 = "#ffffff"边框 = "none"分隔符颜色 = "#d9d9d9"
  • 卡片样式:背景颜色 = "#f8f9fa"边框 = "1px solid #e8e8e8"边框圆角 = "4px"
  • 导航样式:背景颜色 = "#ffffff"边框 = "none"阴影 = "0 1px 3px rgba(0,0,0,0.1)"

项目样式:

  • 当前项目:文本颜色 = "#666666"字体粗细 = "粗体"光标样式 = "default"
  • 可点击项目:文本颜色 = "#1890ff"光标样式 = "pointer"下划线 = "none"
  • 悬停项目:文本颜色 = "#40a9ff"下划线 = "underline"

分隔符样式:

  • 默认分隔符:分隔符 = "/"分隔符颜色 = "#d9d9d9"外边距 = "4px"
  • 箭头分隔符:分隔符 = "›"分隔符颜色 = "#666666"外边距 = "8px"
  • 圆点分隔符:分隔符 = "·"分隔符颜色 = "#cccccc"外边距 = "6px"

布局样式:

  • 水平布局:显示模式 = "行内"外边距 = "0 4px"
  • 垂直布局:显示模式 = "块级"外边距 = "4px 0"
  • 响应式布局:宽度 = "100%"外边距 = "8px 0"文本对齐 = "左对齐"

状态样式:

  • 静态状态:背景颜色 = "#ffffff"边框 = "none"外边距 = "0"
  • 动态状态:背景颜色 = "#fafafa"边框 = "1px solid #f0f0f0"外边距 = "4px"
  • 悬浮状态:背景颜色 = "#f0f0f0"边框 = "1px solid #e8e8e8"边框圆角 = "4px"

示例代码

' 示例:完整的面包屑使用演示
' 1. 创建面包屑
变量 面包屑1 = 创建 面包屑()
' 2. 设置属性
面包屑1.左边 = 100
面包屑1.顶边 = 100
面包屑1.分隔符 = "/"
' 3. 添加项目
面包屑1.添加项目("首页")
面包屑1.添加项目("列表")
面包屑1.添加项目("详情")
' 4. 设置事件回调
面包屑1.置项目被单击回调((源对象, 文本, 标记值, 索引) => {
	调试输出("跳转到:" + 文本)
})
' 5. 添加到父容器
添加组件(面包屑1)

属性:分隔符

  • 类型: 文本型
  • 说明: 设置或获取层级项之间的分隔符,默认为 /。

属性:分隔符颜色

  • 类型: 文本型
  • 说明: 设置或获取分隔符颜色。

函数:添加项目(文本, 标记值)

添加一个层级项,可指定文本和标记值,返回添加的索引位置,标记值可省略。

函数:置路径(路径数组)

设置整个路径,参数为对象数组 [{text, tag}]。

函数:置项目被单击回调(回调函数)

设置非末项被单击时的回调函数,回调函数返回四个参数:(源对象,项目文本,标记值,索引)。

事件:项目被单击(源对象,项目文本,标记值,索引)

当非末项被单击时触发该事件。

组件:图片框

图片框组件用于展示图片内容,支持设置图片、替代文本、图片宽度、图片高度、图片显示模式、置图片加载错误回调等特性,常用于头像展示、图片预览、图文混排等场景,支持自动处理 static 目录路径。

典型使用场景:

  • 用户头像展示(个人资料页、评论列表、用户信息卡)
  • 产品图片展示(电商产品图、商品详情、相册展示)
  • 文章配图(博客文章配图、新闻图片、内容插图)
  • 图标展示(应用图标、功能图标、品牌标识)
  • 图片预览(缩略图预览、图片放大、图片轮播)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图

常用操作速查

操作属性/方法示例
设置图片路径图片图片框1.图片 = "static/user.jpg"
设置替代文本替代文本图片框1.替代文本 = "用户头像"
设置图片宽度图片宽度图片框1.图片宽度 = 240
设置图片高度图片高度图片框1.图片高度 = 160
设置显示模式显示模式图片框1.显示模式 = "覆盖"
设置加载错误回调置图片加载错误回调(回调)图片框1.置图片加载错误回调((源对象, 事件对象) => { ... })

样式美化参考

图片样式变体:

  • 圆角图片:边框圆角 = "50%"边框 = "2px solid #d9d9d9"宽度 = 80高度 = 80
  • 方形图片:边框圆角 = "4px"边框 = "1px solid #e8e8e8"宽度 = 120高度 = 120
  • 卡片图片:边框 = "none"边框圆角 = "8px"阴影 = "0 2px 8px rgba(0,0,0,0.1)"宽度 = 200高度 = 150

显示模式样式:

  • 覆盖模式:显示模式 = "覆盖"对象适配 = "覆盖"背景颜色 = "#f0f0f0"
  • 包含模式:显示模式 = "包含"对象适配 = "包含"背景颜色 = "#ffffff"
  • 拉伸模式:显示模式 = "拉伸"对象适配 = "拉伸"背景颜色 = "#ffffff"
  • 重复模式:显示模式 = "重复"对象适配 = "重复"背景颜色 = "#ffffff"

状态样式:

  • 正常状态:边框 = "1px solid #d9d9d9"边框圆角 = "4px"背景颜色 = "#ffffff"
  • 悬停状态:边框 = "1px solid #1890ff"边框圆角 = "4px"背景颜色 = "#f0f7ff"
  • 加载状态:背景颜色 = "#f5f5f5"边框 = "1px solid #d9d9d9"边框圆角 = "4px"
  • 错误状态:背景颜色 = "#fff2f0"边框 = "1px solid #ffccc7"边框圆角 = "4px"

尺寸样式:

  • 小尺寸:宽度 = 40高度 = 40图片宽度 = 40图片高度 = 40
  • 中尺寸:宽度 = 80高度 = 80图片宽度 = 80图片高度 = 80
  • 大尺寸:宽度 = 120高度 = 120图片宽度 = 120图片高度 = 120
  • 自定义尺寸:宽度 = 200高度 = 150图片宽度 = 200图片高度 = 150

响应式样式:

  • 自适应宽度:宽度 = "100%"高度 = "自动"最大宽度 = 400最大高度 = 300
  • 固定比例:宽度 = 300高度 = 200对象适配 = "包含"显示模式 = "包含"
  • 流式布局:宽度 = "100%"高度 = 200外边距 = "10px 0"边框圆角 = "8px"

示例代码

' 示例:完整的图片框使用演示
' 1. 创建图片框
变量 图片框1 = 创建 图片框()
' 2. 设置属性
图片框1.左边 = 100
图片框1.顶边 = 100
图片框1.图片宽度 = 240
图片框1.图片高度 = 160
图片框1.图片显示模式 = "cover"
图片框1.图片 = "static/banner.jpg"
图片框1.替代文本 = "横幅图片"
' 3. 设置事件回调
图片框1.置图片加载错误回调((源对象, 事件源) => {
	调试输出("图片加载失败")
})
' 4. 添加到父容器
添加组件(图片框1)

属性:替代文本

  • 类型: 文本型
  • 说明: 设置或获取当前图片的替代文本内容,当图片无法正常显示时,该文本会替代图片显示,用于描述图片信息。

属性:图片

  • 类型: 文本型
  • 说明: 设置或获取当前图片框所显示图片的源地址,支持URL网络地址、本地静态文件地址。

属性:图片高度

  • 类型: 数值型
  • 说明: 设置或获取当前图片显示的高度。

属性:图片宽度

  • 类型: 数值型
  • 说明: 设置或获取当前图片显示的宽度。

属性:图片显示模式

  • 类型: 文本型
  • 说明: 设置或获取当前图片的显示模式,例如 'contain'、'cover' 等,用于控制图片在图片框内的显示方式。

函数:置图片加载错误回调(回调函数)

设置当图片加载失败时回调的函数对象。

事件:图片加载错误(源对象,事件源)

当图片加载失败时触发并回调该事件。

组件:头像框

头像组件,支持图片、文本、图标三种展示方式,支持圆形/方形。

典型使用场景:

  • 用户头像(个人资料页、评论系统、用户列表)
  • 团队成员(团队介绍、组织架构、协作平台)
  • 产品图标(应用图标、功能图标、品牌标识)
  • 评论头像(评论列表、论坛帖子、社交媒体)
  • 群组头像(群组列表、聊天界面、社区头像)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图

常用操作速查

操作属性/方法示例
设置头像尺寸尺寸头像框1.尺寸 = 48
设置头像形状形状头像框1.形状 = "circle"
设置图片头像图片头像框1.图片 = "static/user.jpg"
设置文本头像文本头像框1.文本 = "张"
设置图标头像图标头像框1.图标 = "user"
设置背景颜色背景颜色头像框1.背景颜色 = "#1890ff"
设置文本颜色文本颜色头像框1.文本颜色 = "#ffffff"
设置头像点击回调置被单击回调(回调)头像框1.置被单击回调((源对象, 事件对象) => { ... })

样式美化参考

头像样式变体:

  • 圆形头像:形状 = "circle"边框圆角 = "50%"边框 = "2px solid #d9d9d9"
  • 方形头像:形状 = "square"边框圆角 = "4px"边框 = "1px solid #e8e8e8"
  • 圆角头像:形状 = "rounded"边框圆角 = "8px"边框 = "1px solid #e8e8e8"

尺寸样式:

  • 小尺寸头像:尺寸 = 32宽度 = 32高度 = 32字体大小 = "14px"
  • 中尺寸头像:尺寸 = 48宽度 = 48高度 = 48字体大小 = "18px"
  • 大尺寸头像:尺寸 = 64宽度 = 64高度 = 64字体大小 = "24px"
  • 超大尺寸头像:尺寸 = 80宽度 = 80高度 = 80字体大小 = "32px"

类型样式:

  • 图片头像:图片 = "static/user.jpg"背景颜色 = "#ffffff"边框 = "none"
  • 文字头像:文本 = "张"背景颜色 = "#1890ff"文本颜色 = "#ffffff"字体粗细 = "粗体"
  • 图标头像:图标 = "user"背景颜色 = "#52c41a"文本颜色 = "#ffffff"字体大小 = "24px"

状态样式:

  • 正常状态:边框 = "1px solid #d9d9d9"背景颜色 = "#ffffff"光标样式 = "pointer"
  • 悬停状态:边框 = "2px solid #1890ff"背景颜色 = "#f0f7ff"光标样式 = "pointer"
  • 选中状态:边框 = "2px solid #1890ff"背景颜色 = "#e6f7ff"光标样式 = "pointer"
  • 禁用状态:边框 = "1px solid #d9d9d9"背景颜色 = "#f5f5f5"透明度 = "0.6"光标样式 = "not-allowed"

特殊样式:

  • 渐变背景:背景颜色 = "linear-gradient(135deg, #1890ff, #096dd9)"边框 = "none"
  • 阴影效果:阴影 = "0 2px 8px rgba(0,0,0,0.15)"边框 = "none"边框圆角 = "50%"
  • 状态徽章:徽章 = "在线"徽章位置 = "右上角"徽章颜色 = "#52c41a"
  • 悬浮效果:悬浮缩放 = 1.1过渡时间 = "0.2s"边框 = "2px solid #1890ff"

响应式样式:

  • 移动端适配:尺寸 = 40宽度 = 40高度 = 40字体大小 = "16px"
  • 桌面端适配:尺寸 = 48宽度 = 48高度 = 48字体大小 = "18px"
  • 大屏适配:尺寸 = 64宽度 = 64高度 = 64字体大小 = "24px"

示例代码

' 示例:完整的头像框使用演示
' 1. 创建头像框
变量 头像框1 = 创建 头像框()
' 2. 设置属性
头像框1.左边 = 100
头像框1.顶边 = 100
头像框1.尺寸 = 48
头像框1.形状 = "circle"
头像框1.图片地址 = "https://example.com/a.jpg"
头像框1.文本 = "A"
' 3. 设置事件回调
头像框1.置头像加载失败回调((源对象) => {
	调试输出("图片加载失败,已回退到文本")
})
' 4. 添加到父容器
添加组件(头像框1)

属性:尺寸

  • 类型: 数值型
  • 说明: 设置或获取头像宽高像素。

属性:形状

  • 类型: 文本型
  • 说明: 设置或获取形状:circle(圆形) / square(方形)。

属性:图片地址

  • 类型: 文本型
  • 说明: 设置或获取头像图片 URL,空则展示文本或图标。

属性:文本

  • 类型: 文本型
  • 说明: 设置或获取文本内容(图片加载失败时展示)。

属性:图标

  • 类型: 文本型
  • 说明: 设置或获取图标字符(文本为空时使用)。

属性:背景颜色

  • 类型: 文本型
  • 说明: 设置或获取无图片时的背景色。

函数:置头像加载失败回调(回调函数)

设置图片加载失败时的回调函数,回调函数返回一个参数:(源对象)。

事件:头像加载失败(源对象)

当头像加载失败时触发该事件。

组件:徽标

徽标数组件,包裹子元素并在右上角显示计数、文本或圆点,支持溢出阈值。

典型使用场景:

  • 消息通知(未读消息数量、新消息提醒、通知计数)
  • 购物车(商品数量、购物车标识、促销标记)
  • 用户状态(在线状态、未读消息、新评论)
  • 功能标识(新功能标记、更新提示、热门推荐)
  • 系统提醒(系统通知、待处理事项、任务提醒)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图

常用操作速查

操作属性/方法示例
设置徽标文本徽标徽标1.徽标 = "99+"
设置徽标位置徽标位置徽标1.徽标位置 = "右上角"
设置溢出阈值溢出阈值徽标1.溢出阈值 = 99
设置徽标颜色徽标颜色徽标1.徽标颜色 = "#ff4d4f"
设置徽标背景徽标背景徽标1.徽标背景 = "#ff4d4f"
设置徽标大小徽标大小徽标1.徽标大小 = 16
设置子元素子元素徽标1.子元素 = 按钮1
设置徽标点击回调置被单击回调(回调)徽标1.置被单击回调((源对象, 事件对象) => { ... })

样式美化参考

徽标样式变体:

  • 数字徽标:徽标 = "99+"徽标背景 = "#ff4d4f"徽标颜色 = "#ffffff",`徽标大小 = 12
  • 文本徽标:徽标 = "新"徽标背景 = "#52c41a"徽标颜色 = "#ffffff",`徽标大小 = 10
  • 圆点徽标:徽标 = ""徽标背景 = "#ff4d4f"徽标颜色 = "#ffffff",`徽标大小 = 8

位置样式:

  • 右上角:徽标位置 = "右上角"右偏移 = -8上偏移 = -8
  • 右下角:徽标位置 = "右下角"右偏移 = -8下偏移 = -8
  • 左上角:徽标位置 = "左上角"左偏移 = -8上偏移 = -8
  • 左下角:徽标位置 = "左下角"左偏移 = -8下偏移 = -8

颜色样式:

  • 红色徽标:徽标背景 = "#ff4d4f"徽标颜色 = "#ffffff"
  • 绿色徽标:徽标背景 = "#52c41a"徽标颜色 = "#ffffff"
  • 蓝色徽标:徽标背景 = "#1890ff"徽标颜色 = "#ffffff"
  • 黄色徽标:徽标背景 = "#faad14"徽标颜色 = "#ffffff"
  • 紫色徽标:徽标背景 = "#722ed1"徽标颜色 = "#ffffff"

状态样式:

  • 普通状态:徽标背景 = "#ff4d4f"徽标颜色 = "#ffffff"边框 = "none"
  • 悬停状态:徽标背景 = "#ff7875"徽标颜色 = "#ffffff"边框 = "none"
  • 选中状态:徽标背景 = "#ff4d4f"徽标颜色 = "#ffffff"边框 = "2px solid #ffffff"
  • 禁用状态:徽标背景 = "#d9d9d9"徽标颜色 = "#ffffff"透明度 = "0.6"

尺寸样式:

  • 小尺寸:徽标大小 = 8宽度 = 16高度 = 16字体大小 = "10px"
  • 中尺寸:徽标大小 = 12宽度 = 20高度 = 20字体大小 = "12px"
  • 大尺寸:徽标大小 = 16宽度 = 24高度 = 24字体大小 = "14px"
  • 超大尺寸:徽标大小 = 20宽度 = 28高度 = 28字体大小 = "16px"

特殊样式:

  • 边框徽标:徽标背景 = "#ff4d4f"徽标颜色 = "#ffffff"边框 = "2px solid #ffffff"边框圆角 = "50%"
  • 阴影徽标:徽标背景 = "#ff4d4f"徽标颜色 = "#ffffff"阴影 = "0 2px 4px rgba(0,0,0,0.2)"边框圆角 = "50%"
  • 脉冲徽标:徽标背景 = "#ff4d4f"徽标颜色 = "#ffffff"动画 = "脉冲"边框圆角 = "50%"
  • 闪烁徽标:徽标背景 = "#ff4d4f"徽标颜色 = "#ffffff"动画 = "闪烁"边框圆角 = "50%"

响应式样式:

  • 移动端适配:徽标大小 = 10宽度 = 20高度 = 20字体大小 = "10px"
  • 桌面端适配:徽标大小 = 12宽度 = 24高度 = 24字体大小 = "12px"
  • 大屏适配:徽标大小 = 14宽度 = 28高度 = 28字体大小 = "14px"

示例代码

' 示例:完整的徽标使用演示
' 1. 创建徽标
变量 徽标1 = 创建 徽标()
' 2. 设置属性
徽标1.左边 = 100
徽标1.顶边 = 100
变量 按钮1 = 创建元素("button")
按钮1.文本 = "消息"
徽标1.置标记元素(按钮1)
徽标1.计数 = 5
徽标1.最大值 = 99
' 3. 添加到父容器
添加组件(徽标1)

属性:计数

  • 类型: 数值型
  • 说明: 设置或获取徽标显示的计数值。

属性:最大值

  • 类型: 数值型
  • 说明: 设置或获取计数溢出阈值,超过显示 X+,默认 99。

属性:显示点

  • 类型: 逻辑型
  • 说明: 设置或获取是否以圆点形式显示。

属性:显示零

  • 类型: 逻辑型
  • 说明: 设置或获取计数为 0 时是否显示。

属性:文本

  • 类型: 文本型
  • 说明: 设置自定义徽标文本,优先于计数。

属性:颜色

  • 类型: 文本型
  • 说明: 设置或获取徽标背景色。

函数:置标记元素(元素)

设置徽标所标记的目标元素。

函数:置偏移(X,Y)

设置徽标相对右上角的偏移像素,正数向右下。

组件:画板

画板组件用于进行2D绘图操作,支持画矩形、填充矩形、画圆、填充圆、画曲线、填充曲线、填充文本、画文本、画直线、画多边形、填充多边形、画图像、清空、保存状态、恢复状态、旋转、平移、缩放等操作,常用于图形绘制、图表展示、Canvas 绘图等场景,坐标原点为左上角。

典型使用场景:

  • 图表绘制(柱状图、折线图、饼图、散点图)
  • 图形设计(几何图形、流程图、架构图、示意图)
  • 游戏开发(游戏界面、动画效果、交互绘图)
  • 数据可视化(数据图表、统计图表、信息图表)
  • 创意绘图(涂鸦板、手绘板、绘画工具)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图

常用操作速查

操作属性/方法示例
画矩形画矩形(左, 上, 右, 下)画板1.画矩形(10, 10, 100, 100)
填充矩形填充矩形(左, 上, 右, 下)画板1.填充矩形(10, 10, 100, 100)
画圆画圆(圆心X, 圆心Y, 半径)画板1.画圆(50, 50, 30)
填充圆填充圆(圆心X, 圆心Y, 半径)画板1.填充圆(50, 50, 30)
画直线画直线(起点X, 起点Y, 终点X, 终点Y)画板1.画直线(10, 10, 100, 100)
画文本画文本(文本, X, Y)画板1.画文本("Hello", 10, 10)
填充文本填充文本(文本, X, Y)画板1.填充文本("Hello", 10, 10)
清空画板清空()画板1.清空()
保存状态保存状态()画板1.保存状态()
恢复状态恢复状态()画板1.恢复状态()
设置绘图样式设置线条样式(宽度, 颜色, 线条样式)画板1.设置线条样式(2, "#1890ff", "实线")

样式美化参考

绘图样式变体:

  • 实线样式:线条样式 = "实线"线条宽度 = 2线条颜色 = "#1890ff"
  • 虚线样式:线条样式 = "虚线"线条宽度 = 2线条颜色 = "#1890ff"虚线模式 = "5,5"
  • 点线样式:线条样式 = "点线"线条宽度 = 2线条颜色 = "#1890ff"虚线模式 = "2,2"
  • 双线样式:线条样式 = "双线"线条宽度 = 4线条颜色 = "#1890ff"内线颜色 = "#ffffff"

填充样式:

  • 纯色填充:填充颜色 = "#1890ff",`填充透明度 = 1
  • 渐变填充:填充类型 = "线性渐变"渐变颜色 = ["#1890ff", "#096dd9"]渐变方向 = "水平"
  • 图案填充:填充类型 = "图案"图案图像 = "static/pattern.png"图案重复 = "重复"
  • 透明填充:填充颜色 = "透明",`填充透明度 = 0

字体样式:

  • 默认字体:字体 = "Arial"字体大小 = 16字体颜色 = "#333333"
  • 粗体字体:字体 = "Arial"字体大小 = 16字体粗细 = "粗体"字体颜色 = "#333333"
  • 斜体字体:字体 = "Arial"字体大小 = 16字体样式 = "斜体"字体颜色 = "#333333"
  • 中文字体:字体 = "微软雅黑"字体大小 = 16字体颜色 = "#333333"

画布样式:

  • 白色背景:背景颜色 = "#ffffff"边框 = "1px solid #d9d9d9"边框圆角 = "4px"
  • 灰色背景:背景颜色 = "#f5f5f5"边框 = "1px solid #e8e8e8"边框圆角 = "4px"
  • 网格背景:背景图像 = "static/grid.png"背景重复 = "重复"边框 = "1px solid #e8e8e8"边框圆角 = "4px"

状态样式:

  • 正常状态:边框 = "1px solid #d9d9d9"背景颜色 = "#ffffff"光标样式 = "crosshair"
  • 悬停状态:边框 = "1px solid #1890ff"背景颜色 = "#f0f7ff"光标样式 = "crosshair"
  • 绘制状态:边框 = "2px solid #1890ff"背景颜色 = "#ffffff"光标样式 = "crosshair"
  • 错误状态:边框 = "1px solid #ff4d4f"背景颜色 = "#fff2f0"光标样式 = "not-allowed"

尺寸样式:

  • 小尺寸画板:宽度 = 300高度 = 200边框圆角 = "4px"边框 = "1px solid #d9d9d9"
  • 中尺寸画板:宽度 = 600高度 = 400边框圆角 = "8px"边框 = "1px solid #e8e8e8"
  • 大尺寸画板:宽度 = 800高度 = 600边框圆角 = "12px"边框 = "1px solid #e8e8e8"
  • 全屏画板:宽度 = "100%"高度 = "100%"边框 = "none"边框圆角 = "0"

响应式样式:

  • 移动端适配:宽度 = "100%"高度 = 300最大宽度 = 400边框圆角 = "4px"
  • 平板端适配:宽度 = "100%"高度 = 400最大宽度 = 600边框圆角 = "8px"
  • 桌面端适配:宽度 = 800高度 = 600边框圆角 = "12px"边框 = "1px solid #e8e8e8"

示例代码

' 示例:完整的画板使用演示
' 1. 创建画板
变量 画板1 = 创建 画板()
' 2. 设置属性
画板1.左边 = 100
画板1.顶边 = 100
画板1.宽度 = 400
画板1.高度 = 300
画板1.置画布尺寸(400, 300)
画板1.填充样式 = "#1890ff"
画板1.画笔样式 = "#333333"
画板1.线宽 = 2
' 3. 绘制图形
画板1.填充矩形(20, 20, 120, 80)
画板1.画矩形(160, 20, 120, 80)
画板1.填充圆(80, 200, 40)
画板1.画直线(160, 160, 360, 260)
画板1.字体 = "20px Arial"
画板1.填充文本("Hello VcnStudio", 200, 200)
' 4. 添加到父容器
添加组件(画板1)

属性:填充样式

  • 类型: 文本型
  • 说明: 设置或获取绘图时的填充颜色或样式,如颜色值、渐变等,用于填充图形内部。

属性:画笔样式

  • 类型: 文本型
  • 说明: 设置或获取绘图时的笔触颜色或样式,如颜色值、渐变等,用于绘制图形的边框。

属性:字体

  • 类型: 文本型
  • 说明: 设置或获取绘图时文本的字体样式,如字体大小、字体名称等,1. 设置字体大小和名称:画板对象1.字体 = "20px Arial";2. 设置斜体和粗体:画板对象1.字体 = "italic bold 16px Times New Roman"。

属性:线宽

  • 类型: 数值型
  • 说明: 设置绘图时线条的宽度,单位为像素。

属性:线端盖样式

  • 类型: 文本型
  • 说明: 设置线条末端的样式,可选值:butt(默认)、round、square。

属性:线连接样式

  • 类型: 文本型
  • 说明: 设置两条线段连接处的样式,可选值:miter(默认)、round、bevel。

函数:置画布尺寸(宽度, 高度)

设置画板中可绘制内容的区域尺寸,一般建议设置为与画板宽高一致。

函数:画矩形(X, Y, 宽, 高)

在画布上指定位置 (x, y) 绘制一个指定宽高的矩形(框),边框颜色由画笔样式决定。

' 绘制一个矩形,在坐标 (10, 10) 绘制一个宽为 100,高为 50 的矩形。
画板1.画矩形(10, 10, 100, 50)

函数:填充矩形(X, Y, 宽, 高)

填充绘制画布中指定位置和宽高的矩形,相当于是绘制一个含有底色的矩形区域。

' 填充一个矩形,在坐标 (10, 10) 绘制一个宽为 100,高为 50 的矩形。
画板1.填充矩形(10, 10, 100, 50)

函数:画圆(X, Y, 半径)

在画布上指定位置 (X, Y) 绘制一个圆形。

' 绘制一个圆形,在坐标 (50, 50) 绘制一个半径为 30 的圆
画板1.画圆(50, 50, 30)

函数:填充圆(X, Y, 半径)

在画布上指定位置 (X, Y) 绘制一个填充有背景底色的圆,填充颜色由填充样式决定。

' 填充一个圆形,在坐标 (50, 50) 绘制一个半径为 30 的圆
画板1.填充圆(50, 50, 30)

函数:画曲线(X, Y, 半径, 开始角度, 结束角度)

在画布上指定位置 (X, Y) 绘制一个圆形或圆弧的边框,边框颜色由画笔样式决定,开始角度与结束角度单位为弧度制,0为0度,90度为0.5PI,180度为1PI,270度为1.5PI。

' 绘制一个扇形,在坐标 (50, 50) 绘制一个半径为 30 的扇形,起始角度为 0,结束角度为 0.5PI。
画板1.画曲线(50, 50, 30, 0, 0.5 * 3.14)

函数:填充曲线(X, Y, 半径, 开始角度, 结束角度)

在画布上指定位置 (X, Y) 填充一个圆形或圆弧,填充颜色由填充样式决定,开始角度与结束角度单位为弧度制,0为0度,90度为0.5PI,180度为1PI,270度为1.5PI。

' 填充一个扇形,在坐标 (50, 50) 填充一个半径为 30 的扇形,起始角度为 0,结束角度为 0.5PI。
画板1.填充曲线(50, 50, 30, 0, 0.5 * 3.14)

函数:画文本(文本内容, X, Y)

在画布上指定位置 (X, Y) 绘制文本的边框(字体镂空效果),边框颜色由画笔样式决定。

' 绘制一个文本,在坐标 (50, 50) 绘制一个文本 "Hello VcnStudio"。
画板1.画文本("Hello VcnStudio", 50, 50)

函数:填充文本(文本内容, X, Y)

在画布上指定位置 (X, Y) 绘制填充的文本,填充颜色由填充样式决定。

' 填充一个文本,在坐标 (50, 50) 绘制一个文本 "Hello VcnStudio"。
画板1.填充文本("Hello VcnStudio", 50, 50)

函数:画直线(X1, Y1, X2, Y2)

在画布上从点 (X1, Y1) 到点 (X2, Y2) 绘制一条直线,线条样式由画笔样式决定。

' 绘制一条直线,从坐标 (10, 10) 到坐标 (100, 100)。
画板1.画直线(10, 10, 100, 100)

函数:画多边形(坐标点数组)

在画布上绘制一个多边形,参数值为包含各顶点坐标的数组,格式为 [{X, Y}, ...]。

' 绘制一个五边形,在坐标 (50, 50) 绘制一个五边形,边长为 50。
画板1.画多边形([{50, 50}, {100, 50}, {150, 100}, {100, 150}, {50, 100}])

函数:填充多边形(坐标点数组)

在画布上绘制并填充一个多边形,参数值为包含各顶点坐标的数组,格式为 [{X, Y}, ...]。

' 填充一个五边形,在坐标 (50, 50) 填充一个五边形,边长为 50。
画板1.填充多边形([{50, 50}, {100, 50}, {150, 100}, {100, 150}, {50, 100}])

函数:画图像(图片地址, X, Y, 宽度, 高度)

在画布上指定位置 (X, Y) 绘制图像。

' 绘制一张图片,在坐标 (50, 50) 绘制一张图片,图片大小为 100 * 100。
画板1.画图像("static/img1.png", 50, 50, 100, 100)

函数:清空()

清除画布上的所有内容。

函数:保存状态()

保存当前画布的状态,包括样式、变换等。

函数:恢复状态()

恢复之前保存的画布状态。

函数:旋转内容(弧度值)

以画布原点为中心旋转画布,旋转角度单位为弧度制。

函数:平移内容(X, Y)

将画布原点平移到指定位置 (X, Y)。

函数:缩放内容(X, Y)

对画布进行缩放,X 为水平缩放比例,Y 为垂直缩放比例。

组件:轮播图片框

轮播图片框组件用于图片轮播展示,支持添加项目、开始/停止轮播、设置间隔时间等特性,常用于图片轮播、广告展示、幻灯片播放等场景。

典型使用场景:

  • 首页轮播(网站首页焦点图、产品展示、品牌宣传)
  • 广告展示(广告轮播、促销活动、产品推广)
  • 产品展示(产品图片轮播、商品详情、相册展示)
  • 新闻轮播(新闻图片、头条资讯、重要信息)
  • 活动展示(活动海报、专题页面、节日庆典)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图

常用操作速查

操作属性/方法示例
添加轮播项目添加项目(标题, 图片路径, 键)轮播图片框1.添加项目("第一张", "static/1.jpg", "k1")
开始轮播开始()轮播图片框1.开始()
停止轮播停止()轮播图片框1.停止()
设置间隔时间间隔时间轮播图片框1.间隔时间 = 3000
设置当前索引当前索引轮播图片框1.当前索引 = 0
设置自动播放自动播放轮播图片框1.自动播放 = 真
设置循环播放循环播放轮播图片框1.循环播放 = 真
设置轮播回调置轮播被切换回调(回调)轮播图片框1.置轮播被切换回调((源对象, 当前索引) => { ... })

样式美化参考

轮播样式变体:

  • 全屏轮播:宽度 = "100%"高度 = 500边框 = "none"边框圆角 = "0"
  • 卡片轮播:宽度 = 800高度 = 400边框 = "none"边框圆角 = "12px"阴影 = "0 4px 12px rgba(0,0,0,0.15)"
  • 缩略图轮播:宽度 = 600高度 = 300边框 = "1px solid #e8e8e8"边框圆角 = "8px"

指示器样式:

  • 圆点指示器:指示器类型 = "圆点"指示器位置 = "底部"指示器颜色 = "#1890ff",`指示器大小 = 8
  • 数字指示器:指示器类型 = "数字"指示器位置 = "底部"指示器颜色 = "#ffffff",`指示器大小 = 14
  • 分页指示器:指示器类型 = "分页"指示器位置 = "底部"指示器颜色 = "#1890ff",`指示器大小 = 12

导航按钮样式:

  • 默认导航:导航按钮 = "显示"导航按钮颜色 = "#ffffff"导航按钮背景 = "rgba(0,0,0,0.3)",`导航按钮大小 = 32
  • 箭头导航:导航按钮 = "箭头"导航按钮颜色 = "#ffffff"导航按钮背景 = "rgba(0,0,0,0.5)",`导航按钮大小 = 40
  • 圆形导航:导航按钮 = "圆形"导航按钮颜色 = "#ffffff"导航按钮背景 = "rgba(0,0,0,0.3)",`导航按钮大小 = 36

过渡效果样式:

  • 淡入淡出:过渡效果 = "淡入淡出"过渡时间 = 500缓动函数 = "ease"
  • 左右滑动:过渡效果 = "左右滑动"过渡时间 = 300缓动函数 = "ease-out"
  • 上下滑动:过渡效果 = "上下滑动"过渡时间 = 300缓动函数 = "ease-out"
  • 缩放效果:过渡效果 = "缩放"过渡时间 = 400缓动函数 = "ease-in-out"

状态样式:

  • 播放状态:背景颜色 = "#000000"边框 = "none",`透明度 = 1
  • 暂停状态:背景颜色 = "#000000"边框 = "none",`透明度 = 1
  • 悬停状态:背景颜色 = "#000000"边框 = "none",`透明度 = 0.9
  • 选中状态:指示器颜色 = "#1890ff",`指示器大小 = 12

响应式样式:

  • 移动端适配:宽度 = "100%"高度 = 200指示器大小 = 6,`导航按钮大小 = 24
  • 平板端适配:宽度 = "100%"高度 = 300指示器大小 = 8,`导航按钮大小 = 32
  • 桌面端适配:宽度 = 800高度 = 400指示器大小 = 10,`导航按钮大小 = 40

示例代码

变量 轮播图片框1 = 创建 轮播图片框()
轮播图片框1.左边 = 100
轮播图片框1.顶边 = 100
轮播图片框1.宽度 = 600
轮播图片框1.高度 = 300
轮播图片框1.添加项目("第一张", "static/1.jpg", "k1")
轮播图片框1.添加项目("第二张", "static/2.jpg", "k2")
轮播图片框1.添加项目("第三张", "static/3.jpg", "k3")
轮播图片框1.开始轮播(3000)
轮播图片框1.切换到下一项()

函数:添加项目(标题, 图片地址, 标记值)

向轮播图中添加一个图片项目。

函数:开始轮播(间隔时间)

开始自动轮播,参数为轮播间隔时间(毫秒)。

函数:停止轮播()

停止自动轮播。

函数:取当前项目()

返回当前显示的图片项目。

函数:切换到下一项()

手动切换到下一张图片。

函数:置图片被单击回调(回调函数)

设置图片被单击时的回调函数,参数为图片的标记值。

事件:图片被单击(源对象,图片对象)

图片被单击时触发,参数为源对象和图片对象。

组件:SVG图像框

SVG图像框组件用于显示SVG矢量图形,支持置SVG代码、加载SVG文件等特性,常用于矢量图标展示、SVG图像渲染、动态图形等场景,支持直接嵌入SVG代码或加载SVG文件。

典型使用场景:

  • 矢量图标(应用图标、功能图标、品牌标识)
  • 动态图形(动画效果、交互图形、动态图表)
  • 数据可视化(矢量图表、信息图表、统计图形)
  • 响应式设计(自适应图标、缩放图形、矢量插画)
  • 品牌视觉(企业标识、产品图标、品牌元素)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图

常用操作速查

操作属性/方法示例
设置SVG代码置SVG代码(SVG代码)SVG图像框1.置SVG代码("<svg><circle cx=\"12\" cy=\"12\" r=\"8\" fill=\"#1890ff\"/></svg>")
加载SVG文件加载SVG文件(文件路径)SVG图像框1.加载SVG文件("static/logo.svg")
设置SVG颜色SVG颜色SVG图像框1.SVG颜色 = "#1890ff"
设置SVG大小SVG宽度 / SVG高度SVG图像框1.SVG宽度 = 24SVG图像框1.SVG高度 = 24
设置SVG视图框SVG视图框SVG图像框1.SVG视图框 = "0 0 24 24"
设置SVG填充SVG填充SVG图像框1.SVG填充 = "#1890ff"
设置SVG描边SVG描边SVG图像框1.SVG描边 = "#333333"
设置SVG描边宽度SVG描边宽度SVG图像框1.SVG描边宽度 = 2
设置SVG点击回调置被单击回调(回调)SVG图像框1.置被单击回调((源对象, 事件对象) => { ... })

样式美化参考

SVG样式变体:

  • 单色SVG:SVG颜色 = "#1890ff"SVG填充 = "#1890ff"SVG描边 = "none",`SVG描边宽度 = 0
  • 双色SVG:SVG颜色 = "#1890ff"SVG填充 = "#1890ff"SVG描边 = "#ffffff",`SVG描边宽度 = 2
  • 渐变SVG:SVG填充 = "linear-gradient(135deg, #1890ff, #096dd9)"SVG描边 = "none",`SVG描边宽度 = 0
  • 透明SVG:SVG填充 = "rgba(24,144,255,0.3)"SVG描边 = "rgba(24,144,255,0.5)",`SVG描边宽度 = 1

尺寸样式:

  • 小尺寸SVG:宽度 = 16高度 = 16SVG宽度 = 16SVG高度 = 16SVG视图框 = "0 0 16 16"
  • 中尺寸SVG:宽度 = 24高度 = 24SVG宽度 = 24SVG高度 = 24SVG视图框 = "0 0 24 24"
  • 大尺寸SVG:宽度 = 32高度 = 32SVG宽度 = 32SVG高度 = 32SVG视图框 = "0 0 32 32"
  • 自定义尺寸:宽度 = 48高度 = 48SVG宽度 = 24SVG高度 = 24SVG视图框 = "0 0 24 24"

状态样式:

  • 正常状态:边框 = "none"背景颜色 = "transparent"光标样式 = "default"
  • 悬停状态:边框 = "none"背景颜色 = "transparent"光标样式 = "pointer"SVG颜色 = "#40a9ff"
  • 选中状态:边框 = "none"背景颜色 = "transparent"SVG颜色 = "#096dd9"
  • 禁用状态:边框 = "none"背景颜色 = "transparent"SVG颜色 = "#d9d9d9"透明度 = "0.6"光标样式 = "not-allowed"

图标样式:

  • 线性图标:SVG描边 = "#1890ff"SVG填充 = "none",`SVG描边宽度 = 2
  • 填充图标:SVG描边 = "none"SVG填充 = "#1890ff",`SVG描边宽度 = 0
  • 双重图标:SVG描边 = "#1890ff"SVG填充 = "#ffffff",`SVG描边宽度 = 1
  • 轮廓图标:SVG描边 = "#1890ff"SVG填充 = "transparent",`SVG描边宽度 = 2

动画样式:

  • 旋转动画:动画 = "旋转"动画时长 = "1s"动画循环 = "无限"
  • 缩放动画:动画 = "缩放"动画时长 = "0.5s"动画循环 = "无限"
  • 淡入动画:动画 = "淡入"动画时长 = "0.3s"动画循环 = "1"
  • 脉冲动画:动画 = "脉冲"动画时长 = "1s"动画循环 = "无限"

响应式样式:

  • 移动端适配:宽度 = 20高度 = 20SVG宽度 = 20SVG高度 = 20SVG视图框 = "0 0 20 20"
  • 平板端适配:宽度 = 24高度 = 24SVG宽度 = 24SVG高度 = 24SVG视图框 = "0 0 24 24"
  • 桌面端适配:宽度 = 32高度 = 32SVG宽度 = 32SVG高度 = 32SVG视图框 = "0 0 32 32"

特殊样式:

  • 阴影效果:阴影 = "0 2px 4px rgba(0,0,0,0.1)"边框 = "none"背景颜色 = "transparent"
  • 发光效果:阴影 = "0 0 8px rgba(24,144,255,0.5)"边框 = "none"背景颜色 = "transparent"
  • 边框效果:边框 = "1px solid #e8e8e8"边框圆角 = "4px"背景颜色 = "#ffffff"SVG填充 = "#1890ff"
  • 卡片效果:边框 = "none"边框圆角 = "8px"阴影 = "0 2px 8px rgba(0,0,0,0.1)"背景颜色 = "#ffffff"SVG填充 = "#1890ff"

示例代码

变量 SVG图像框1 = 创建 SVG图像框()
SVG图像框1.左边 = 100
SVG图像框1.顶边 = 100
SVG图像框1.宽度 = 200
SVG图像框1.高度 = 200
SVG图像框1.置SVG代码("<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"8\" fill=\"#1890ff\"/></svg>")
SVG图像框1.加载SVG文件("static/logo.svg")

函数:置SVG代码(SVG代码)

设置SVG图形代码。

函数:加载SVG文件(SVG文件地址)

加载SVG图片代码文件(.svg)并渲染。

组件:列表框

列表框组件是一个高度可定制的列表容器,基于 div 标签封装,用于展示一系列项目。它不预设每个项目的样式,而是通过回调函数让开发者自定义每个项目的渲染内容,从而实现灵活的列表展示。支持添加、插入、删除、更新项目等数据操作,以及分隔线自定义、内容拉伸等布局控制。适用于任何需要列表展示的场景,尤其是每个列表项布局不一致或需要复杂交互的情况。

典型使用场景:

  • 联系人列表(头像 + 姓名 + 状态)
  • 消息通知列表(标题 + 时间 + 未读标记)
  • 商品列表(缩略图 + 名称 + 价格)
  • 设置菜单(图标 + 标题 + 右侧箭头)
  • 任何需要自定义列表项布局的数据展示

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置是否拉伸内容(隐藏滚动条)拉伸内容列表框1.拉伸内容 = 真
自定义分隔线样式分隔线样式分隔线颜色分隔线高度列表框1.分隔线颜色 = "#eee"
添加单个项目添加项目(项目对象)列表框1.添加项目({标题:"张三", 标记:1})
批量添加项目添加项目集(项目对象数组)列表框1.添加项目集([{...}, {...}])
插入项目插入项目(索引, 项目对象)列表框1.插入项目(0, {标题:"置顶项"})
删除项目删除项目(索引)列表框1.删除项目(2)
更新项目更新项目(索引, 项目对象)列表框1.更新项目(1, {标题:"新名称"})
获取所有项目取项目集合()变量 全部 = 列表框1.取项目集合()
清空列表清空()列表框1.清空()
触发渲染渲染()列表框1.渲染()
自定义每个项目的渲染置请求加载项目回调(回调函数)列表框1.置请求加载项目回调((集合, 索引) => { ... 返回组件 ... })

样式美化参考

列表框本身的样式可通过继承的视图属性调整,而每个项目的样式由自定义渲染回调决定。

  • 整体容器:设置 宽度高度背景颜色边框边框圆角 等,可控制列表整体的外观。
  • 内容拉伸:当 拉伸内容 = 真 时,列表框高度会自动适应所有项目的高度总和,且不显示滚动条;当为 (默认)时,超出高度会出现滚动条。
  • 分隔线控制
    • 分隔线样式:可选 solid(实线)、dashed(虚线)、dotted(点线)等。
    • 分隔线颜色:自定义分隔线颜色。
    • 分隔线高度:分隔线的粗细。
    • 分隔线间距:分隔线上下留白。
    • 分隔线左右间距:分隔线左右缩进。
    • 也可通过 置自定义分隔线配置 传入完整的 CSS 样式对象,进行更精细的控制。
  • 项目渲染:在回调中返回任意视图组件(如 标签弹性布局 等),可自由组合图文、按钮、图标等,实现高度定制化。

基础示例

创建一个简单的文本列表,每个项目显示一个标题,并添加分隔线。

变量 列表框1 = 创建 列表框()
列表框1.左边 = 50
列表框1.顶边 = 50
列表框1.宽度 = 300
列表框1.高度 = 200
列表框1.拉伸内容 = 假
列表框1.分隔线样式 = "solid"
列表框1.分隔线颜色 = "#e0e0e0"
列表框1.分隔线高度 = 1
列表框1.分隔线间距 = 4

' 添加数据
列表框1.添加项目({标题: "选项一", 标记: 1})
列表框1.添加项目({标题: "选项二", 标记: 2})
列表框1.添加项目({标题: "选项三", 标记: 3})

' 自定义渲染回调
列表框1.置请求加载项目回调((项目集合, 索引) => {
    变量 项 = 项目集合[索引]
    变量 标签 = 创建 标签()
    标签.文本 = 项.标题
    标签.内边距 = "8px 12px"
    返回 标签
})

列表框1.渲染()
添加组件(列表框1)

综合示例:联系人列表

本示例展示一个带头像和状态的联系人列表,每个项目使用弹性布局水平排列,并响应用户点击。

' ========== 创建列表框 ==========
变量 联系人列表 = 创建 列表框()
联系人列表.左边 = 20
联系人列表.顶边 = 20
联系人列表.宽度 = 360
联系人列表.高度 = 400
联系人列表.背景颜色 = "#ffffff"
联系人列表.边框 = "1px solid #e8e8e8"
联系人列表.边框圆角 = 8
联系人列表.内边距 = "8px"
联系人列表.分隔线样式 = "solid"
联系人列表.分隔线颜色 = "#f0f0f0"
联系人列表.分隔线高度 = 1
联系人列表.分隔线左右间距 = 12
添加组件(联系人列表)

' ========== 准备数据 ==========
变量 数据 = [
    { 姓名: "张三", 头像: "https://i.pravatar.cc/40?img=1", 状态: "在线" },
    { 姓名: "李四", 头像: "https://i.pravatar.cc/40?img=2", 状态: "离线" },
    { 姓名: "王五", 头像: "https://i.pravatar.cc/40?img=3", 状态: "忙碌" },
    { 姓名: "赵六", 头像: "https://i.pravatar.cc/40?img=4", 状态: "在线" }
]
联系人列表.添加项目集(数据)

' ========== 自定义渲染回调 ==========
联系人列表.置请求加载项目回调((项目集合, 索引) => {
    变量 项 = 项目集合[索引]
    
    ' 创建一个水平弹性布局作为项目容器
    变量 容器 = 创建 弹性布局()
    容器.方向 = "row"
    容器.侧轴对齐 = "center"
    容器.内边距 = "6px 0"
    容器.宽度 = 匹配父
    容器.高度 = 48
    
    ' 头像(使用图片框)
    变量 头像 = 创建 图片框()
    头像.图片宽度 = 36
    头像.图片高度 = 36
    头像.边框圆角 = "18px"  ' 圆形
    头像.图片 = 项.头像
    头像.替代文本 = 项.姓名
    容器.添加组件(头像)
    
    ' 姓名标签
    变量 姓名标签 = 创建 标签()
    姓名标签.文本 = 项.姓名
    姓名标签.字体大小 = "15px"
    姓名标签.字体粗细 = "bold"
    姓名标签.文本颜色 = "#333"
    姓名标签.左边距 = 12
    姓名标签.宽度 = 100
    容器.添加组件(姓名标签)
    
    ' 状态标签(带颜色点)
    变量 状态容器 = 创建 弹性布局()
    状态容器.方向 = "row"
    状态容器.侧轴对齐 = "center"
    状态容器.主轴对齐 = "flex-end"
    状态容器.宽度 = "flex-grow"  ' 占满剩余空间
    
    变量 状态点 = 创建 标签()
    状态点.文本 = "●"
    状态点.字体大小 = 12
    判断(项.状态)
        分支 "在线"
            状态点.文本颜色 = "#52c41a"
        分支 "离线"
            状态点.文本颜色 = "#d9d9d9"
        分支 "忙碌"
            状态点.文本颜色 = "#ff4d4f"
        分支 默认
            状态点.文本颜色 = "#d9d9d9"
    结束 判断
    状态容器.添加组件(状态点)
    
    变量 状态文本 = 创建 标签()
    状态文本.文本 = " " + 项.状态
    状态文本.字体大小 = 12
    状态文本.文本颜色 = "#999"
    状态容器.添加组件(状态文本)
    
    容器.添加组件(状态容器)
    
    返回 容器
})

' ========== 渲染列表 ==========
联系人列表.渲染()

' ========== 添加点击事件(整体点击) ==========
' 由于每个项目是动态生成的,我们可以为列表框本身添加点击回调,
' 然后通过事件对象判断点击的具体项目(需结合 DOM 层级判断),
' 此处演示简单的点击弹出提示。
联系人列表.置被单击回调((源对象, 事件对象) => {
    ' 在实际项目中,可以通过事件对象获取点击的目标元素,
    ' 然后向上查找对应的项目容器,获取绑定的数据索引。
    ' 简化演示:直接弹出提示
    弹出提示("您点击了列表项")
})

属性详解

拉伸内容

  • 类型: 逻辑型
  • 说明: 设置是否拉伸列表内容以填满容器高度。当为 时,列表项会全部展示,隐藏滚动条;当为 (默认)时,超出容器高度会出现垂直滚动条。

分隔线样式

  • 类型: 文本型
  • 说明: 设置项目之间的分隔线边框样式,支持 "solid""dashed""dotted" 等,默认为 "solid"

分隔线间距

  • 类型: 整数型|文本型
  • 说明: 设置分隔线上下方的间距,默认为 "1px"。可传入数值(单位 px)或字符串。

分隔线颜色

  • 类型: 文本型
  • 说明: 设置分隔线的颜色,支持 CSS 颜色值,默认 "#e0e0e0"

分隔线高度

  • 类型: 整数型|文本型
  • 说明: 设置分隔线的粗细(高度),默认为 "1px"

分隔线左右间距

  • 类型: 整数型|文本型
  • 说明: 设置分隔线左右两侧的缩进距离,默认为 0。例如 12 会使分隔线两端各留出 12px 空白。

函数详解

置自定义分隔线配置(值)

  • 功能: 通过传入一个样式对象,自定义分隔线的所有 CSS 样式,覆盖单独设置的分隔线属性。
  • 参数: ,对象类型,键为 CSS 属性名(驼峰式),值为属性值。例如 {"height": "2px", "backgroundColor": "#ccc", "margin": "4px 0"}
  • 返回值: 无。
  • 示例:
    列表框1.置自定义分隔线配置({"height": "2px", "backgroundColor": "#eee", "margin": "6px 0"})
    

添加项目(项目对象)

  • 功能: 向列表数据集合末尾添加一个项目。
  • 参数: 项目对象,可以是任意数据类型(对象、字符串、数字等),推荐使用对象以便包含多个字段。
  • 返回值: 无。
  • 示例: 列表框1.添加项目({标题: "新项目", 值: 123})

插入项目(索引, 项目对象)

  • 功能: 在指定索引位置插入一个项目。
  • 参数: 索引(数值型,从0开始),项目对象(任意类型)。
  • 返回值: 无。
  • 示例: 列表框1.插入项目(0, {标题: "置顶项"})

添加项目集(项目对象数组)

  • 功能: 批量添加多个项目到末尾。
  • 参数: 项目对象数组,数组中的每个元素为任意类型。
  • 返回值: 无。
  • 示例: 列表框1.添加项目集([{标题:"A"}, {标题:"B"}])

插入项目集(索引, 项目对象数组)

  • 功能: 在指定索引位置批量插入多个项目。
  • 参数: 索引(数值型),项目对象数组
  • 返回值: 无。

删除项目(索引)

  • 功能: 删除指定索引的项目。
  • 参数: 索引(数值型)。
  • 返回值: 无。

更新项目(索引, 项目对象)

  • 功能: 替换指定索引的项目为新数据。
  • 参数: 索引(数值型),项目对象(新数据)。
  • 返回值: 无。

取项目集合()

  • 功能: 获取当前列表的数据集合(数组)。
  • 返回值: 数组,包含所有项目对象。
  • 示例: 变量 所有项目 = 列表框1.取项目集合()

取项目数()

  • 功能: 获取当前列表项目数量。
  • 返回值: 数值型。
  • 示例: 变量 数量 = 列表框1.取项目数()

清空()

  • 功能: 清空所有数据,列表变为空。
  • 返回值: 无。

渲染()

  • 功能: 根据当前数据集合和自定义渲染回调,重新生成列表项 DOM。通常在添加/修改数据后调用。
  • 返回值: 无。

置请求加载项目回调(回调函数)

  • 功能: 设置每个项目的渲染回调函数。这是列表框最核心的方法,开发者在此回调中创建并返回一个视图组件(如 标签弹性布局 等),用于表示每个列表项的内容。
  • 参数: 回调函数,格式为 (项目集合, 索引) => { ... 返回 组件 }
    • 项目集合:当前列表的所有数据数组。
    • 索引:当前正在渲染的项目索引。
  • 返回值: 必须返回一个视图组件(继承自 视图 的实例),该组件将被添加到列表项中。
  • 示例:
    列表框1.置请求加载项目回调((项目集合, 索引) => {
        变量 项 = 项目集合[索引]
        变量 标签 = 创建 标签()
        标签.文本 = 项.标题
        返回 标签
    })
    

⚠️ 注意事项

  1. 必须调用 渲染():在添加、删除、更新数据后,必须手动调用 渲染() 方法才能让列表实际更新显示。数据集合的修改不会自动触发重绘。
  2. 渲染回调必须返回组件置请求加载项目回调 中必须返回一个视图组件实例,否则该列表项将为空。返回 或未定义会导致渲染异常。
  3. 性能考虑:当列表数据量很大(如数百项)时,回调中创建复杂组件可能影响性能。建议保持每个项目组件相对轻量。
  4. 分隔线配置优先级置自定义分隔线配置 会覆盖单独设置的 分隔线样式颜色 等属性。
  5. 拉伸内容的滚动行为:当 拉伸内容 = 真 时,列表高度由内容撑开,若容器高度不足,内容可能溢出。此时可在外层包裹滚动容器。
  6. 项目数据可以是任意类型:不仅限于对象,也可以是字符串、数字等,但在回调中需根据实际类型处理。
  7. 事件处理:若要为每个项目添加点击事件,可在渲染回调中为返回的组件绑定 置被单击回调。但注意避免内存泄漏,建议使用事件委托(在列表容器上统一处理)来提高性能。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档列表类组件_单选列表框 —— 单选列表组件
  • 文档列表类组件_多选列表框 —— 多选列表组件
  • 文档列表类组件_文本列表框 —— 纯文本列表组件
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、对象字面量等
  • 文档综合演示:联系人列表 —— 实际应用示例

组件:宫格框

宫格框组件用于以网格(Grid)布局方式展示项目集合,支持自定义列间距、行间距、对齐方式等,并通过回调函数让开发者自定义每个格子的渲染内容。它类似于一个可自定义的网格容器,适合展示图标菜单、图片墙、功能入口、卡片集合等需要整齐排列的场景。宫格框会自动根据容器宽度和项目数量计算每行显示的列数(由项目宽度决定),并提供滚动支持。

典型使用场景:

  • 应用首页功能入口(九宫格菜单)
  • 图片/视频缩略图墙(相册、作品集)
  • 商品或卡片网格展示(电商、内容聚合)
  • 工具或功能选择面板(设置项、快捷操作)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置是否拉伸内容(隐藏滚动条)拉伸内容宫格框1.拉伸内容 = 真
设置列间距列间距宫格框1.列间距 = 12
设置行间距行间距宫格框1.行间距 = 16
设置横向对齐方式横向对齐方式宫格框1.横向对齐方式 = "space-between"
设置纵向对齐方式纵向对齐方式宫格框1.纵向对齐方式 = "center"
设置内容整体对齐方式内容整体对齐方式宫格框1.内容整体对齐方式 = "center"
添加单个项目添加项目(项目对象)宫格框1.添加项目({标题:"设置", 图标:"icon.png"})
批量添加项目添加项目集(项目对象数组)宫格框1.添加项目集([{...}, {...}])
插入项目插入项目(索引, 项目对象)宫格框1.插入项目(0, {标题:"置顶"})
删除项目删除项目(索引)宫格框1.删除项目(2)
更新项目更新项目(索引, 项目对象)宫格框1.更新项目(1, {标题:"新名称"})
获取所有项目取项目集合()变量 全部 = 宫格框1.取项目集合()
获取项目数量取项目数()变量 数量 = 宫格框1.取项目数()
清空所有项目清空()宫格框1.清空()
触发渲染渲染()宫格框1.渲染()
自定义每个格子的渲染置请求加载项目回调(回调函数)宫格框1.置请求加载项目回调((集合, 索引) => { ... 返回组件 ... })

样式美化参考

宫格框的外观主要通过继承的视图属性以及专用对齐属性调整:

  • 整体容器:设置 宽度高度背景颜色边框边框圆角 等控制整体样式。
  • 项目间距:通过 列间距行间距 控制格子之间的间隔。
  • 对齐控制
    • 横向对齐方式:控制每行内项目在水平方向上的分布(左对齐、居中、两端分散等)。
    • 纵向对齐方式:控制项目在垂直方向上的对齐(顶部、居中、底部、拉伸等)。
    • 内容整体对齐方式:控制多行项目作为一个整体在容器垂直方向上的对齐。
  • 内容拉伸:当 拉伸内容 = 真 时,宫格框高度自适应所有项目总高度,不显示滚动条;为 (默认)时,超出高度出现滚动条。
  • 项目渲染:在回调中返回任意视图组件,可自由组合图文、按钮、图标等,实现高度定制化。

基础示例

创建一个简单的功能菜单宫格,每个项目显示图标和文字。

变量 宫格框1 = 创建 宫格框()
宫格框1.左边 = 50
宫格框1.顶边 = 50
宫格框1.宽度 = 400
宫格框1.高度 = 300
宫格框1.列间距 = "12px"
宫格框1.行间距 = "12px"
宫格框1.横向对齐方式 = "center"
宫格框1.纵向对齐方式 = "center"

' 准备数据
变量 数据 = [
    {标题: "音乐", 图标: "🎵"},
    {标题: "视频", 图标: "🎬"},
    {标题: "图片", 图标: "🖼️"},
    {标题: "文档", 图标: "📄"},
    {标题: "设置", 图标: "⚙️"},
    {标题: "帮助", 图标: "❓"}
]
宫格框1.添加项目集(数据)

' 自定义渲染回调
宫格框1.置请求加载项目回调((项目集合, 索引) => {
    变量 项 = 项目集合[索引]
    变量 容器 = 创建 弹性布局()
    容器.方向 = "column"
    容器.侧轴对齐 = "center"
    容器.宽度 = 80
    容器.高度 = 80
    容器.背景颜色 = "#f5f5f5"
    容器.边框圆角 = "8px"
    容器.内边距 = "8px"
    
    变量 图标标签 = 创建 标签()
    图标标签.文本 = 项.图标
    图标标签.字体大小 = "32px"
    容器.添加组件(图标标签)
    
    变量 标题标签 = 创建 标签()
    标题标签.文本 = 项.标题
    标题标签.字体大小 = "12px"
    标题标签.文本颜色 = "#333"
    容器.添加组件(标题标签)
    
    返回 容器
})

宫格框1.渲染()
添加组件(宫格框1)

综合示例:应用中心图标墙

本示例模拟一个应用中心界面,展示多个应用图标,每个图标可点击并弹出提示,同时支持动态添加新应用。

' ========== 创建标题 ==========
变量 标题 = 创建 标签()
标题.左边 = 30
标题.顶边 = 20
标题.文本 = "📱 应用中心"
标题.字体大小 = "20px"
标题.字体粗细 = "bold"
添加组件(标题)

' ========== 创建宫格框 ==========
变量 宫格框_应用 = 创建 宫格框()
宫格框_应用.左边 = 30
宫格框_应用.顶边 = 60
宫格框_应用.宽度 = 500
宫格框_应用.高度 = 400
宫格框_应用.背景颜色 = "#ffffff"
宫格框_应用.边框 = "1px solid #e8e8e8"
宫格框_应用.边框圆角 = "12px"
宫格框_应用.内边距 = "16px"
宫格框_应用.列间距 = "16px"
宫格框_应用.行间距 = "16px"
宫格框_应用.横向对齐方式 = "flex-start"
宫格框_应用.纵向对齐方式 = "center"
添加组件(宫格框_应用)

' ========== 准备应用数据 ==========
变量 应用数据 = [
    {名称: "微信", 图标: "💬", 颜色: "#07c160"},
    {名称: "支付宝", 图标: "💰", 颜色: "#1677ff"},
    {名称: "抖音", 图标: "🎵", 颜色: "#000000"},
    {名称: "微博", 图标: "📢", 颜色: "#ff8200"},
    {名称: "淘宝", 图标: "🛒", 颜色: "#ff4400"},
    {名称: "美团", 图标: "🍔", 颜色: "#ffc300"},
    {名称: "携程", 图标: "✈️", 颜色: "#1e90ff"},
    {名称: "百度", 图标: "🔍", 颜色: "#2932e1"}
]
宫格框_应用.添加项目集(应用数据)

' ========== 自定义渲染回调 ==========
宫格框_应用.置请求加载项目回调((项目集合, 索引) => {
    变量 项 = 项目集合[索引]
    
    变量 容器 = 创建 弹性布局()
    容器.方向 = "column"
    容器.侧轴对齐 = "center"
    容器.主轴对齐 = "center"
    容器.宽度 = 90
    容器.高度 = 110
    容器.背景颜色 = "#fafafa"
    容器.边框 = "1px solid #f0f0f0"
    容器.边框圆角 = "12px"
    容器.光标样式 = "pointer"
    容器.内边距 = "8px"
    
    ' 图标圆形背景
    变量 图标容器 = 创建 弹性布局()
    图标容器.方向 = "row"
    图标容器.侧轴对齐 = "center"
    图标容器.主轴对齐 = "center"
    图标容器.宽度 = 56
    图标容器.高度 = 56
    图标容器.背景颜色 = 项.颜色
    图标容器.边框圆角 = "28px"
    容器.添加组件(图标容器)
    
    变量 图标标签 = 创建 标签()
    图标标签.文本 = 项.图标
    图标标签.字体大小 = "28px"
    图标容器.添加组件(图标标签)
    
    ' 应用名称
    变量 名称标签 = 创建 标签()
    名称标签.文本 = 项.名称
    名称标签.字体大小 = "13px"
    名称标签.文本颜色 = "#333"
    名称标签.外边距顶 = "8px"
    容器.添加组件(名称标签)
    
    ' 为每个项目添加点击事件(在容器上绑定)
    容器.置被单击回调((源对象, 事件对象) => {
        ' 注意:这里的源对象是容器本身,我们无法直接获取项数据,
        ' 所以利用闭包捕获索引,但轻语言不支持闭包捕获变量,
        ' 所以我们可以通过数据集合和索引在回调中获取项信息。
        ' 另一种方式是使用组件的数据标签,但这里我们使用全局变量存储当前索引,
        ' 或者直接在事件中通过查找方式获取。
        ' 为简化,使用弹出提示
        变量 当前项 = 项目集合[索引]
        弹出提示("启动应用:" + 当前项.名称)
    })
    
    返回 容器
})

宫格框_应用.渲染()

' ========== 添加新应用按钮 ==========
变量 添加按钮 = 创建 按钮()
添加按钮.左边 = 30
添加按钮.顶边 = 480
添加按钮.宽度 = 120
添加按钮.高度 = 36
添加按钮.文本 = "+ 添加应用"
添加按钮.背景颜色 = "#1890ff"
添加按钮.文本颜色 = "#ffffff"
添加按钮.边框圆角 = "6px"
添加组件(添加按钮)

添加按钮.置被单击回调((源对象, 事件对象) => {
    ' 模拟添加新应用
    变量 新应用 = {
        名称: "新应用" + (宫格框_应用.取项目数() + 1),
        图标: "⭐",
        颜色: "#52c41a"
    }
    宫格框_应用.添加项目(新应用)
    宫格框_应用.渲染()  ' 重新渲染
    弹出提示("已添加新应用")
})

属性详解

拉伸内容

  • 类型: 逻辑型
  • 说明: 设置是否拉伸宫格内容以填满容器高度。当为 时,宫格高度由内容撑开,不显示滚动条;当为 (默认)时,超出 高度 的内容会出现滚动条。

列间距

  • 类型: 数值型
  • 说明: 设置每列项目之间的水平间距,单位为像素,默认为 10

行间距

  • 类型: 数值型
  • 说明: 设置每行项目之间的垂直间距,单位为像素,默认为 10

横向对齐方式

  • 类型: 文本型
  • 说明: 设置每行内项目在水平方向上的分布方式。可选值:
    • "flex-start":左对齐
    • "flex-end":右对齐
    • "center":居中对齐
    • "space-between":两端对齐,项目间等距
    • "space-around":项目两侧间隔相等
    • "space-evenly":项目均匀分布,两端与容器边缘距离相等
  • 默认值由组件内部决定(通常为 "flex-start")。

纵向对齐方式

  • 类型: 文本型
  • 说明: 设置项目在垂直方向上的对齐方式(当项目高度不一致时有效)。可选值:
    • "stretch":拉伸填充(默认)
    • "flex-start":顶部对齐
    • "flex-end":底部对齐
    • "center":居中对齐
    • "baseline":基线对齐

内容整体对齐方式

  • 类型: 文本型
  • 说明: 设置多行项目作为一个整体在容器垂直方向上的对齐方式(当容器高度大于所有项目总高度时有效)。可选值同 横向对齐方式

函数详解

添加项目(项目对象)

  • 功能: 向数据集合末尾添加一个项目。
  • 参数: 项目对象,可以是任意数据类型(对象、字符串、数字等),推荐对象以便包含多个字段。
  • 返回值: 无。
  • 示例: 宫格框1.添加项目({标题: "新功能", 图标: "icon.png"})

插入项目(索引, 项目对象)

  • 功能: 在指定索引位置插入一个项目。
  • 参数: 索引(数值型,从0开始),项目对象(任意类型)。
  • 返回值: 无。
  • 示例: 宫格框1.插入项目(0, {标题: "置顶项"})

添加项目集(项目对象数组)

  • 功能: 批量添加多个项目到末尾。
  • 参数: 项目对象数组,数组中的每个元素为任意类型。
  • 返回值: 无。
  • 示例: 宫格框1.添加项目集([{标题:"A"}, {标题:"B"}])

插入项目集(索引, 项目对象数组)

  • 功能: 在指定索引位置批量插入多个项目。
  • 参数: 索引(数值型),项目对象数组
  • 返回值: 无。

删除项目(索引)

  • 功能: 删除指定索引的项目。
  • 参数: 索引(数值型)。
  • 返回值: 无。

更新项目(索引, 项目对象)

  • 功能: 替换指定索引的项目为新数据。
  • 参数: 索引(数值型),项目对象(新数据)。
  • 返回值: 无。

取项目集合()

  • 功能: 获取当前数据集合(数组)。
  • 返回值: 数组,包含所有项目对象。
  • 示例: 变量 全部 = 宫格框1.取项目集合()

取项目数()

  • 功能: 获取当前项目数量。
  • 返回值: 数值型。
  • 示例: 变量 数量 = 宫格框1.取项目数()

清空()

  • 功能: 清空所有数据,宫格变为空。
  • 返回值: 无。

渲染()

  • 功能: 根据当前数据集合和自定义渲染回调,重新生成所有项目 DOM。通常在添加、修改数据后调用。
  • 返回值: 无。

置请求加载项目回调(回调函数)

  • 功能: 设置每个项目的渲染回调函数。这是宫格框最核心的方法,开发者在此回调中创建并返回一个视图组件,用于表示每个格子的内容。
  • 参数: 回调函数,格式为 (项目集合, 索引) => { ... 返回 组件 }
    • 项目集合:当前所有数据数组。
    • 索引:当前正在渲染的项目索引。
  • 返回值: 必须返回一个视图组件(继承自 视图 的实例),该组件将被添加到对应的格子中。
  • 示例:
    宫格框1.置请求加载项目回调((项目集合, 索引) => {
        变量 项 = 项目集合[索引]
        变量 标签 = 创建 标签()
        标签.文本 = 项.标题
        返回 标签
    })
    

事件说明

宫格框本身没有定义特有的事件,但每个项目容器(在渲染回调中返回的组件)可以绑定自己的事件(如 置被单击回调)。也可通过为宫格框自身添加 置被单击回调 来捕获整体点击,但无法区分具体项目。


⚠️ 注意事项

  1. 必须调用 渲染():在添加、删除、更新数据后,必须手动调用 渲染() 方法才能刷新显示。
  2. 渲染回调必须返回组件置请求加载项目回调 中必须返回一个视图组件实例,否则该项目格子为空。
  3. 项目宽度:宫格框会根据容器宽度和项目数量自动计算每行列数。为保证布局美观,建议在渲染回调中为每个项目容器设置固定的宽度(如 宽度 = 90),以便宫格框正确计算排列。
  4. 拉伸内容与滚动:当 拉伸内容 = 假(默认)时,容器高度固定,内容溢出会出现滚动条;若为 ,高度由内容撑开,不滚动。
  5. 对齐方式影响布局横向对齐方式纵向对齐方式 共同决定项目在格子内的位置。如果项目容器宽度不固定,可能导致布局错乱。
  6. 性能考虑:当项目数量很大(如数百个)时,建议采用虚拟滚动或分页加载,避免一次性渲染过多 DOM。
  7. 事件绑定:如需为每个项目添加点击事件,可在渲染回调中为返回的组件绑定 置被单击回调,但注意闭包捕获索引的问题(轻语言不支持闭包捕获变量)。解决方案:在回调中使用数据集合和索引直接获取项目数据,或使用组件的 标记 属性存储索引。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档列表类组件_列表框 —— 通用列表组件,类似的数据驱动渲染方式
  • 文档图像类组件_图片框 —— 配合宫格框展示图片
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、对象字面量等
  • 文档综合演示:应用中心 —— 实际应用示例

组件:单选列表框

单选列表框组件用于显示多个可选项并支持单选操作,支持添加项目、插入项目、获取和设置选中项、寻找项目、清空选择及置项目被单击回调等特性,常用于单选项选择、配置选择、数据筛选等场景。

典型使用场景:

  • 单选项选择(性别选择、语言选择、主题选择)
  • 配置选择(设置选项、偏好设置、参数配置)
  • 数据筛选(分类筛选、条件筛选、范围筛选)
  • 导航菜单(页面导航、功能导航、菜单选择)
  • 状态选择(状态切换、模式选择、类型选择)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图

常用操作速查

操作属性/方法示例
添加列表项添加项目(标题, 选中, 标记)单选列表框1.添加项目("选项一", 假, 1)
插入列表项插入项目(索引, 标题, 选中, 标记)单选列表框1.插入项目(1, "新选项", 假, 4)
设置选中项现行选中项单选列表框1.现行选中项 = 1
获取选中项现行选中项变量 选中 = 单选列表框1.现行选中项
查找项目寻找项目(目标文本, 模糊查询)变量 索引 = 单选列表框1.寻找项目("选项", 真)
清空选择清空选择()单选列表框1.清空选择()
获取项目数取项目数()变量 数量 = 单选列表框1.取项目数()
设置点击回调置项目被单击回调(回调)单选列表框1.置项目被单击回调((源对象, 索引) => { ... })

样式美化参考

列表样式变体:

  • 简约列表:边框 = "1px solid #d9d9d9"边框圆角 = "4px"背景颜色 = "#ffffff"行高 = "32px"
  • 卡片列表:边框 = "none"边框圆角 = "8px"背景颜色 = "#ffffff"阴影 = "0 2px 8px rgba(0,0,0,0.1)"行高 = "40px"
  • 分组列表:边框 = "1px solid #e8e8e8"边框圆角 = "8px"背景颜色 = "#ffffff"分组背景 = "#f8f9fa"行高 = "36px"

选中状态样式:

  • 选中项:背景颜色 = "#e6f7ff"文本颜色 = "#1890ff"边框 = "1px solid #91d5ff"图标 = "✓"
  • 未选中项:背景颜色 = "#ffffff"文本颜色 = "#333333"边框 = "none"图标 = "○"
  • 悬停项:背景颜色 = "#f0f0f0"文本颜色 = "#333333"边框 = "none"图标 = "○"
  • 禁用项:背景颜色 = "#f5f5f5"文本颜色 = "#d9d9d9"边框 = "none"图标 = "○"透明度 = "0.6"

尺寸样式:

  • 小尺寸:宽度 = 200高度 = "自动"行高 = "28px"字体大小 = "14px"
  • 中尺寸:宽度 = 300高度 = "自动"行高 = "32px"字体大小 = "14px"
  • 大尺寸:宽度 = 400高度 = "自动"行高 = "36px"字体大小 = "16px"
  • 自适应:宽度 = "100%"高度 = "自动"最大宽度 = 500行高 = "32px"

图标样式:

  • 圆形图标:选中图标 = "●"未选中图标 = "○"图标大小 = "16px"图标颜色 = "#1890ff"
  • 方形图标:选中图标 = "■"未选中图标 = "□"图标大小 = "16px"图标颜色 = "#1890ff"
  • 自定义图标:选中图标 = "✓"未选中图标 = ""图标大小 = "14px"图标颜色 = "#1890ff"

状态样式:

  • 正常状态:边框 = "1px solid #d9d9d9"背景颜色 = "#ffffff"光标样式 = "default"
  • 悬停状态:边框 = "1px solid #d9d9d9"背景颜色 = "#f0f0f0"光标样式 = "pointer"
  • 选中状态:边框 = "1px solid #1890ff"背景颜色 = "#e6f7ff"光标样式 = "pointer"
  • 禁用状态:边框 = "1px solid #d9d9d9"背景颜色 = "#f5f5f5"光标样式 = "not-allowed"透明度 = "0.6"

响应式样式:

  • 移动端适配:宽度 = "100%"最大宽度 = 300行高 = "28px"字体大小 = "14px"
  • 平板端适配:宽度 = "100%"最大宽度 = 400行高 = "32px"字体大小 = "14px"
  • 桌面端适配:宽度 = 300行高 = "32px"字体大小 = "14px"边框圆角 = "4px"

示例代码

' 示例:完整的单选列表框使用演示
' 1. 创建单选列表框
变量 单选列表框1 = 创建 单选列表框()
' 2. 设置属性
单选列表框1.左边 = 100
单选列表框1.顶边 = 100
单选列表框1.宽度 = 300
单选列表框1.添加项目("选项一", 假, 1)
单选列表框1.添加项目("选项二", 真, 2)
单选列表框1.添加项目("选项三", 假, 3)
单选列表框1.现行选中项 = 1
' 3. 设置事件回调
单选列表框1.置项目被单击回调((源对象, 索引) => {
	调试输出("单击项:" + 索引)
})
' 4. 渲染并添加到父容器
单选列表框1.渲染()
添加组件(单选列表框1)

属性:拉伸内容

  • 类型: 逻辑型
  • 说明: 设置是否拉伸列表框内容,默认为假,设置为真后,列表框将隐藏滚动条,列表框内容将全部展示。

属性:现行选中项

  • 类型: 数值型
  • 说明: 设置或获取当前单选列表框的现行选中项索引。

函数:添加项目(标题, 选中, 标记)

向单选列表框的数据集合中添加一个项目,包含显示文本、是否选中状态和标签信息。

函数:删除项目(索引)

从列表框的数据集合中删除指定索引位置的项目。

函数:更新项目(索引, 项目对象)

更新列表框的数据集合中指定索引位置的项目。

函数:取项目集合()

获取列表框的数据集合。

函数:清空()

清空列表框的数据集合。

函数:取项目数()

获取列表框的数据集合中的项目数量。

函数:渲染()

根据列表框的数据集合和设置的回调函数,渲染列表框的项目到页面上。

函数:插入项目(索引,标题, 选中, 标记)

在列表框指定索引位置插入一个项目,包含显示文本、是否选中状态和标签信息。

函数:清空选择()

清空列表框中选择项状态。

函数:寻找项目(目标文本, 模糊查询)

在列表框中寻找项目,返回项目索引,参数二默认为假,进行精确匹配,如果设置为真则进行模糊匹配。

函数:置项目被单击回调(回调函数)

设置项目被单击时的回调对象。

事件:项目被单击(源对象,索引)

当列表框中的项目被单击时触发该事件。

组件:垂直标签框

垂直标签框组件用于创建垂直排列的导航菜单,支持多级菜单结构(主菜单项可带子菜单项),子菜单以向右弹出方式展示。支持自定义悬停颜色、选中项管理,并提供主菜单和子菜单的单击回调事件。适用于后台管理侧边栏、分类导航、功能切换等需要垂直导航的场景。

典型使用场景:

  • 后台管理系统侧边菜单(仪表盘、用户管理、系统设置等)
  • 分类导航(产品分类、文章栏目)
  • 功能切换面板(工具集、模块列表)
  • 多级菜单导航(带子菜单的层级结构)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置悬停文本颜色点燃颜色垂直标签框1.点燃颜色 = "#1890ff"
设置悬停背景颜色点燃背景色垂直标签框1.点燃背景色 = "#e6f7ff"
添加主菜单项添加项目(文本, 标记值, 子菜单项数组)垂直标签框1.添加项目("控制台", "console")
添加带子菜单的项添加项目(文本, 标记值, 子菜单项数组)垂直标签框1.添加项目("系统", "sys", [{文本:"用户管理", 标记:"user"}])
设置当前选中项置现行选中项(索引)垂直标签框1.置现行选中项(0)
获取当前选中项取现行选中项()变量 选中 = 垂直标签框1.取现行选中项()
清空所有菜单清空()垂直标签框1.清空()
设置主菜单点击回调置项目被单击回调(回调函数)垂直标签框1.置项目被单击回调((源对象, 文本, 标记) => { ... })
设置子菜单点击回调置项目子项被单击回调(回调函数)垂直标签框1.置项目子项被单击回调((源对象, 文本) => { ... })

样式美化参考

垂直标签框的样式主要通过以下属性和继承属性调整:

  • 悬停效果
    • 点燃颜色:鼠标悬停时文本的颜色。
    • 点燃背景色:鼠标悬停时菜单项的背景色。
  • 整体容器:通过 宽度高度背景颜色边框边框圆角 等继承属性调整菜单容器外观。
  • 菜单项样式:菜单项的字体、内边距等由组件内部控制,可通过 CSS 类间接覆盖。
  • 选中状态:当前选中的菜单项会自动高亮(样式由组件默认主题控制)。

基础示例

创建一个带三个主菜单项的垂直导航,其中第二项带有子菜单。

变量 垂直标签框1 = 创建 垂直标签框()
垂直标签框1.左边 = 50
垂直标签框1.顶边 = 50
垂直标签框1.宽度 = 200
垂直标签框1.点燃颜色 = "#1890ff"
垂直标签框1.点燃背景色 = "#e6f7ff"

' 添加菜单项
垂直标签框1.添加项目("控制台", "console")
垂直标签框1.添加项目("系统管理", "sys", [
    {文本: "用户管理", 标记: "user"},
    {文本: "角色管理", 标记: "role"},
    {文本: "权限设置", 标记: "permission"}
])
垂直标签框1.添加项目("退出", "logout")

' 默认选中第一项
垂直标签框1.置现行选中项(0)

' 主菜单点击回调
垂直标签框1.置项目被单击回调((源对象, 项目文本, 标记值) => {
    弹出提示("点击了主菜单:" + 项目文本)
})

' 子菜单点击回调
垂直标签框1.置项目子项被单击回调((源对象, 项目文本) => {
    弹出提示("点击了子菜单:" + 项目文本)
})

添加组件(垂直标签框1)

综合示例:后台管理侧边菜单

本示例模拟一个后台管理系统的侧边栏,包含图标化菜单项、多级子菜单,并展示如何根据选中项切换主内容区域。

' ========== 创建主容器(水平布局) ==========
变量 主容器 = 创建 弹性布局()
主容器.方向 = "row"
主容器.宽度 = 匹配父
主容器.高度 = 匹配父
添加组件(主容器)

' ========== 创建侧边菜单 ==========
变量 侧边菜单 = 创建 垂直标签框()
侧边菜单.宽度 = 220
侧边菜单.高度 = 匹配父
侧边菜单.背景颜色 = "#001529"
侧边菜单.文本颜色 = "#ffffff"
侧边菜单.点燃颜色 = "#ffffff"
侧边菜单.点燃背景色 = "rgba(255,255,255,0.1)"
侧边菜单.内边距 = "8px 0"
主容器.添加组件(侧边菜单)

' ========== 添加菜单项(带图标模拟) ==========
' 注意:图标使用文本模拟,实际可用图标组件
侧边菜单.添加项目("📊 控制台", "dashboard")
侧边菜单.添加项目("👥 用户管理", "users", [
    {文本: "用户列表", 标记: "userlist"},
    {文本: "添加用户", 标记: "useradd"},
    {文本: "权限管理", 标记: "permission"}
])
侧边菜单.添加项目("📦 商品管理", "products", [
    {文本: "商品列表", 标记: "productlist"},
    {文本: "添加商品", 标记: "productadd"},
    {文本: "分类管理", 标记: "category"}
])
侧边菜单.添加项目("📋 订单管理", "orders")
侧边菜单.添加项目("⚙️ 系统设置", "settings", [
    {文本: "基本设置", 标记: "basesettings"},
    {文本: "安全设置", 标记: "security"}
])
侧边菜单.添加项目("🚪 退出登录", "logout")

' 默认选中
侧边菜单.置现行选中项(0)

' ========== 创建内容区域 ==========
变量 内容区域 = 创建 绝对布局()
内容区域.宽度 = "flex-grow"
内容区域.高度 = 匹配父
内容区域.背景颜色 = "#f5f7fa"
内容区域.内边距 = "24px"
主容器.添加组件(内容区域)

' 内容标题标签
变量 标题标签 = 创建 标签()
标题标签.文本 = "欢迎使用管理系统"
标题标签.字体大小 = 24
标题标签.字体粗细 = "bold"
标题标签.文本颜色 = "#333"
内容区域.添加组件(标题标签)

' ========== 菜单点击回调 ==========
侧边菜单.置项目被单击回调((源对象, 项目文本, 标记值) => {
    ' 处理主菜单点击
    标题标签.文本 = "您选择了:" + 项目文本
    调试输出("主菜单点击:" + 标记值)
    
    ' 特殊处理退出
    如果(标记值 == "logout")
        确认框("确定要退出登录吗?")
        如果(结果)
            弹出提示("已退出")
        结束 如果
    结束 如果
})

侧边菜单.置项目子项被单击回调((源对象, 项目文本) => {
    ' 处理子菜单点击
    标题标签.文本 = "您选择了子菜单:" + 项目文本
    弹出提示("进入:" + 项目文本)
})

属性详解

点燃颜色

  • 类型: 文本型
  • 说明: 设置或获取当鼠标悬停在菜单项上时,文本显示的颜色。支持 CSS 颜色值,默认由主题决定。

点燃背景色

  • 类型: 文本型
  • 说明: 设置或获取当鼠标悬停在菜单项上时,菜单项的背景颜色。支持 CSS 颜色值,默认透明。

函数详解

添加项目(文本, 标记值, 子菜单项数组)

  • 功能: 添加一个主菜单项,可选择是否附带子菜单。
  • 参数:
    • 文本:文本型,必填,菜单项显示的文字。
    • 标记值:文本型,可选,用于标识该菜单项,可在回调中区分不同的菜单。
    • 子菜单项数组:数组型,可选,子菜单项列表,每个子项为 {文本: "xxx", 标记: "xxx"} 格式的对象。
  • 返回值: 数值型,新添加的菜单项索引位置(从0开始)。
  • 示例:
    ' 无子菜单
    变量 索引1 = 垂直标签框1.添加项目("控制台", "console")
    ' 带子菜单
    变量 索引2 = 垂直标签框1.添加项目("系统", "system", [
        {文本: "用户管理", 标记: "user"},
        {文本: "日志查看", 标记: "log"}
    ])
    

置现行选中项(索引)

  • 功能: 设置当前选中的菜单项(高亮显示)。
  • 参数: 索引(数值型),从0开始,对应 添加项目 返回的索引值。
  • 返回值: 无。
  • 示例: 垂直标签框1.置现行选中项(1)

取现行选中项()

  • 功能: 获取当前选中的菜单项信息。
  • 返回值: 对象,包含选中菜单项的数据(如 {文本: "控制台", 标记: "console"}),若无选中项则返回
  • 示例:
    变量 当前选中 = 垂直标签框1.取现行选中项()
    如果(当前选中 != 空)
        调试输出("当前选中:" + 当前选中.文本)
    结束 如果
    

清空()

  • 功能: 清空所有菜单项,重置为空状态。
  • 返回值: 无。

置项目被单击回调(回调函数)

  • 功能: 设置主菜单项被单击时的回调函数。
  • 参数: 回调函数,拉姆达表达式,格式为 (源对象, 项目文本, 标记值) => { ... }
    • 源对象:触发事件的垂直标签框组件本身。
    • 项目文本:被单击主菜单项的文本。
    • 标记值:被单击主菜单项的标记值。
  • 示例:
    垂直标签框1.置项目被单击回调((源对象, 文本, 标记) => {
        调试输出("点击了:" + 文本 + ",标记:" + 标记)
    })
    

置项目子项被单击回调(回调函数)

  • 功能: 设置子菜单项被单击时的回调函数。
  • 参数: 回调函数,拉姆达表达式,格式为 (源对象, 项目文本) => { ... }
    • 源对象:触发事件的垂直标签框组件本身。
    • 项目文本:被单击子菜单项的文本。
  • 示例:
    垂直标签框1.置项目子项被单击回调((源对象, 文本) => {
        弹出提示("子菜单:" + 文本)
    })
    

事件说明

项目被单击(源对象, 项目文本, 标记值)

  • 功能:置项目被单击回调 等效,适用于设计文件(.spldg)中定义的组件,采用 VB6 风格绑定。
  • 示例:
    事件 垂直标签框1.项目被单击(源对象, 项目文本, 标记值)
        调试输出("主菜单:" + 项目文本)
    结束 事件
    

项目子项被单击(源对象, 项目文本)

  • 功能:置项目子项被单击回调 等效,适用于设计文件中的组件。
  • 示例:
    事件 垂直标签框1.项目子项被单击(源对象, 项目文本)
        调试输出("子菜单:" + 项目文本)
    结束 事件
    

⚠️ 注意事项

  1. 子菜单弹出方向:子菜单默认向右侧弹出,请确保组件右侧有足够的空间,否则可能被裁剪。
  2. 标记值的使用标记值 是区分不同菜单项的重要标识,建议使用唯一字符串(如 "dashboard""userlist"),而不是依赖索引或文本(文本可能重复或国际化变化)。
  3. 选中项高亮:调用 置现行选中项 后,对应菜单项会高亮显示,同时取消之前的高亮。默认情况下,点击菜单项会自动更新高亮,但也可通过代码控制。
  4. 主菜单和子菜单回调区分:点击主菜单触发 置项目被单击回调,点击子菜单触发 置项目子项被单击回调,两者互不干扰。
  5. 清空后的状态:调用 清空() 后,所有菜单项被移除,取现行选中项() 返回
  6. 宽度自适应:组件宽度默认由 宽度 属性控制,子菜单弹出宽度由组件自动计算,无需额外设置。
  7. 子菜单项数组格式:子菜单项数组中每个对象必须包含 文本 字段,标记 字段可选。若省略 标记,回调中无法区分具体子项。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档列表类组件_水平标签框 —— 水平导航菜单组件
  • 文档列表类组件_列表框 —— 通用列表组件
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、对象字面量等
  • 文档综合演示:后台管理侧边菜单 —— 实际应用示例

组件:垂直滚动框

垂直滚动框是一个容器型组件,用于在固定高度区域内展示超出可视范围的内容,并提供垂直方向的滚动能力。它支持动态添加、删除子组件,适合承载数量不固定或高度会动态变化的内容列表。常用于聊天消息列表、动态信息流、长文本展示、商品列表等需要垂直滚动的场景。

典型使用场景:

  • 聊天消息列表(新消息不断追加,自动滚动到底部)
  • 动态信息流(新闻列表、通知列表)
  • 长文本/协议内容展示(用户协议、帮助文档)
  • 商品或卡片列表(高度不固定的商品展示)
  • 任何需要垂直滚动容器的自定义内容区域

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置容器尺寸(决定滚动区域大小)宽度 / 高度垂直滚动框1.宽度 = 400垂直滚动框1.高度 = 300
添加子组件(自动追加到末尾)添加组件(视图对象)垂直滚动框1.添加组件(卡片1)
获取子组件总数取子组件数()变量 数量 = 垂直滚动框1.取子组件数()
获取指定索引的子组件取子组件(索引)变量 组件 = 垂直滚动框1.取子组件(0)
删除指定索引的子组件删除组件(索引)垂直滚动框1.删除组件(2)
清空所有子组件清空()垂直滚动框1.清空()
获取内容包裹层(用于精细控制)取内容包裹层()变量 层 = 垂直滚动框1.取内容包裹层()

样式美化参考

垂直滚动框的样式主要通过继承的视图属性调整:

  • 整体容器:通过 宽度高度 设置滚动区域的尺寸;背景颜色边框边框圆角 等属性美化容器外观。
  • 内容区域:内部内容包裹层默认自动撑开高度,超出容器高度时出现滚动条。
  • 滚动条样式:滚动条样式由浏览器原生控制,可通过 CSS 伪类自定义(需借助 添加样式类内联样式)。
  • 内边距:通过 内边距 为内容区域添加内边距,使内容不贴边。

滚动条美化示例(通过 CSS 类):

' 添加自定义滚动条样式类
垂直滚动框1.添加样式类("custom-scrollbar")

对应的 CSS(在项目 CSS 文件中定义):

.custom-scrollbar::-webkit-scrollbar {
    width: 6px;
}
.custom-scrollbar::-webkit-scrollbar-track {
    background: #f0f0f0;
    border-radius: 4px;
}
.custom-scrollbar::-webkit-scrollbar-thumb {
    background: #c1c1c1;
    border-radius: 4px;
}
.custom-scrollbar::-webkit-scrollbar-thumb:hover {
    background: #a8a8a8;
}

基础示例

创建一个固定高度的滚动容器,添加若干卡片组件,当卡片超出容器高度时自动出现滚动条。

' ========== 创建垂直滚动框 ==========
变量 滚动框1 = 创建 垂直滚动框()
滚动框1.左边 = 50
滚动框1.顶边 = 50
滚动框1.宽度 = 320
滚动框1.高度 = 400
滚动框1.背景颜色 = "#fafafa"
滚动框1.边框 = "1px solid #e8e8e8"
滚动框1.边框圆角 = 8
滚动框1.内边距 = "8px"
添加组件(滚动框1)

' ========== 添加若干卡片 ==========
变量循环(i = 1, 6, 1)
    变量 卡片 = 创建 卡片框()
    卡片.宽度 = 匹配父
    卡片.标题 = "卡片 " + i
    卡片.内容 = "<p>这是第 " + i + " 张卡片的内容,高度会根据内容自动调整。</p>"
    卡片.边框 = "1px solid #d9d9d9"
    卡片.边框圆角 = 4
    卡片.外边距底 = 8
    滚动框1.添加组件(卡片)
结束循环

综合示例:动态消息列表(模拟聊天室)

本示例模拟一个实时消息列表,通过定时器不断添加新消息,并自动滚动到底部显示最新内容。

' ========== 创建界面布局 ==========
' 标题
变量 标题 = 创建 标签()
标题.左边 = 20
标题.顶边 = 20
标题.文本 = "📱 实时消息"
标题.字体大小 = 18
标题.字体粗细 = "bold"
添加组件(标题)

' 垂直滚动框(消息容器)
变量 消息列表 = 创建 垂直滚动框()
消息列表.左边 = 20
消息列表.顶边 = 60
消息列表.宽度 = 400
消息列表.高度 = 350
消息列表.背景颜色 = "#ffffff"
消息列表.边框 = "1px solid #e8e8e8"
消息列表.边框圆角 = 8
消息列表.内边距 = "12px"
添加组件(消息列表)

' 底部控制栏
变量 输入框 = 创建 单行输入框()
输入框.左边 = 20
输入框.顶边 = 425
输入框.宽度 = 300
输入框.提示文本 = "输入消息..."
添加组件(输入框)

变量 发送按钮 = 创建 按钮()
发送按钮.左边 = 330
发送按钮.顶边 = 422
发送按钮.宽度 = 80
发送按钮.高度 = 36
发送按钮.文本 = "发送"
发送按钮.背景颜色 = "#1890ff"
发送按钮.文本颜色 = "#ffffff"
发送按钮.边框圆角 = 6
添加组件(发送按钮)

' 统计标签
变量 统计标签 = 创建 标签()
统计标签.左边 = 20
统计标签.顶边 = 470
统计标签.文本 = "共 0 条消息"
统计标签.文本颜色 = "#999"
统计标签.字体大小 = 12
添加组件(统计标签)

' ========== 辅助函数:添加消息 ==========
函数 添加消息(用户名, 内容)
    ' 创建消息项
    变量 消息容器 = 创建 弹性布局()
    消息容器.方向 = "row"
    消息容器.宽度 = 匹配父
    消息容器.外边距底 = 8
    消息容器.内边距 = "8px 12px"
    消息容器.背景颜色 = "#f5f5f5"
    消息容器.边框圆角 = 6
    
    ' 用户名标签
    变量 用户标签 = 创建 标签()
    用户标签.文本 = 用户名 + ":"
    用户标签.字体大小 = 13
    用户标签.字体粗细 = "bold"
    用户标签.文本颜色 = "#1890ff"
    用户标签.宽度 = 60
    消息容器.添加组件(用户标签)
    
    ' 内容标签
    变量 内容标签 = 创建 标签()
    内容标签.文本 = 内容
    内容标签.字体大小 = 13
    内容标签.文本颜色 = "#333"
    内容标签.宽度 = "flex-grow"
    消息容器.添加组件(内容标签)
    
    ' 添加到滚动框
    消息列表.添加组件(消息容器)
    
    ' 更新统计
    变量 总数 = 消息列表.取子组件数()
    统计标签.文本 = "共 " + 总数 + " 条消息"
    
    ' 自动滚动到底部(通过操作原生 DOM)
    变量 包裹层 = 消息列表.取内容包裹层()
    如果(包裹层 != 空)
        ' 获取父容器(滚动容器)并设置 scrollTop
        变量 父元素 = 包裹层.取父元素()
        如果(父元素 != 空)
            ' 置滚动位置到底部
            父元素.scrollTop = 包裹层.scrollHeight
        结束 如果
    结束 如果
结束 函数

' ========== 模拟接收消息 ==========
变量 消息计数 = 0
变量 模拟用户 = ["张三", "李四", "王五", "系统"]

' 定时添加模拟消息
变量 时钟ID = 创建时钟(() => {
    消息计数 = 消息计数 + 1
    变量 随机用户 = 模拟用户[取随机整数(0, 取数组成员数(模拟用户) - 1)]
    变量 随机内容 = "这是第 " + 消息计数 + " 条消息,来自 " + 随机用户
    添加消息(随机用户, 随机内容)
}, 2000)  ' 每2秒一条

' ========== 发送按钮事件 ==========
发送按钮.置被单击回调((源对象, 事件对象) => {
    变量 文本 = 删首尾空(输入框.内容)
    如果(文本 == "")
        弹出提示("请输入消息内容")
        返回
    结束 如果
    
    添加消息("我", 文本)
    输入框.内容 = ""  ' 清空输入框
    输入框.获取焦点()
})

' 回车发送
输入框.置键盘被按下回调((源对象, 事件对象) => {
    如果(事件对象.keyCode == 13)  ' 回车键
        发送按钮.执行单击()
    结束 如果
})

' ========== 模拟停止按钮(可选) ==========
变量 停止按钮 = 创建 按钮()
停止按钮.左边 = 20
停止按钮.顶边 = 510
停止按钮.宽度 = 100
停止按钮.高度 = 32
停止按钮.文本 = "停止模拟"
停止按钮.边框圆角 = 6
添加组件(停止按钮)

停止按钮.置被单击回调((源对象, 事件对象) => {
    销毁时钟(时钟ID)
    停止按钮.禁用 = 真
    停止按钮.文本 = "已停止"
    弹出提示("消息模拟已停止")
})

函数详解

添加组件(视图对象)

  • 功能: 向滚动框的内容区域末尾添加一个子组件。
  • 参数: 视图对象,必须是继承自 视图 的组件实例(如 标签按钮卡片框 等)。
  • 返回值: 无。
  • 说明: 添加后,如果内容总高度超出滚动框的 高度,会自动出现滚动条。
  • 示例: 滚动框1.添加组件(新卡片)

取子组件数()

  • 功能: 获取当前滚动框中子组件的数量。
  • 返回值: 数值型,子组件总数。
  • 示例: 变量 数量 = 滚动框1.取子组件数()

取子组件(索引)

  • 功能: 获取指定索引位置的子组件对象。
  • 参数: 索引(数值型),从 0 开始。
  • 返回值: 视图对象,若索引无效则返回
  • 示例:
    变量 第一个组件 = 滚动框1.取子组件(0)
    如果(第一个组件 != 空)
        调试输出("第一个组件类型:" + 取数据类型(第一个组件))
    结束 如果
    

取内容包裹层()

  • 功能: 获取滚动框内部用于包裹所有子组件的容器层对象。可用于精细控制布局或操作滚动位置。
  • 返回值: DOM 元素对象(原生 HTML 元素)。
  • 示例:
    变量 包裹层 = 滚动框1.取内容包裹层()
    ' 可以通过包裹层操作 DOM 属性,如 scrollHeight
    变量 内容高度 = 包裹层.scrollHeight
    

删除组件(索引)

  • 功能: 删除指定索引位置的子组件。
  • 参数: 索引(数值型),从 0 开始。
  • 返回值: 无。
  • 示例: 滚动框1.删除组件(0) 删除第一个子组件

清空()

  • 功能: 移除滚动框中的所有子组件。
  • 返回值: 无。
  • 示例: 滚动框1.清空()

⚠️ 注意事项

  1. 必须设置高度:垂直滚动框需要明确的 高度 属性才能确定滚动区域大小,否则内容会无限撑开,无法滚动。
  2. 子组件宽度:子组件的宽度建议设置为 匹配父 或固定宽度,以确保不会超出滚动框宽度导致水平滚动(滚动框本身不提供水平滚动能力)。
  3. 动态内容更新:添加或删除组件后,滚动框会自动调整内部布局,无需手动刷新。
  4. 滚动到底部:如需在添加新内容后自动滚动到底部(如聊天场景),可通过 取内容包裹层() 获取包裹层,然后操作其父容器的 scrollTop 属性实现。
  5. 性能考虑:当子组件数量极大(如数千条)时,建议考虑虚拟滚动方案,否则所有 DOM 节点都会存在于页面中,可能影响性能。
  6. 与水平滚动框的区别:垂直滚动框只提供垂直滚动,若需要水平滚动,请使用 水平滚动框 组件。
  7. 内容包裹层的操作取内容包裹层() 返回的是原生 DOM 对象,可直接操作其属性(如 scrollHeightchildNodes 等),但需注意兼容性。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档布局类组件_弹性布局 —— 配合使用的弹性布局容器
  • 文档列表类组件_水平滚动框 —— 水平滚动容器
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、循环语句等
  • 文档综合演示:实时消息列表 —— 实际应用示例

组件:多选列表框

多选列表框组件用于显示多个可选项并支持多选操作,支持添加项目、插入项目、取选中项目、取未选中项目、设置项目选中状态、寻找项目及置项目被单击回调等特性,常用于多选项选择、权限设置、批量操作等场景。

典型使用场景:

  • 多选项选择(兴趣爱好、技能标签、偏好设置)
  • 权限设置(用户权限、角色权限、功能权限)
  • 批量操作(批量选择、批量删除、批量编辑)
  • 数据筛选(多条件筛选、多标签筛选、多维度筛选)
  • 问卷调研(多选题、满意度调查、评分选择)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图

常用操作速查

操作属性/方法示例
添加列表项添加项目(标题, 选中, 标记)多选列表框1.添加项目("苹果", 假, 1)
插入列表项插入项目(索引, 标题, 选中, 标记)多选列表框1.插入项目(1, "新水果", 假, 4)
设置项目选中置项目选中(索引, 选中)多选列表框1.置项目选中(0, 真)
获取选中项目取选中项目()变量 选中 = 多选列表框1.取选中项目()
获取未选中项目取未选中项目()变量 未选中 = 多选列表框1.取未选中项目()
查找项目寻找项目(目标文本, 模糊查询)变量 索引 = 多选列表框1.寻找项目("苹果", 真)
清空选择清空选择()多选列表框1.清空选择()
获取项目数取项目数()变量 数量 = 多选列表框1.取项目数()
设置点击回调置项目被单击回调(回调)多选列表框1.置项目被单击回调((源对象, 索引) => { ... })

样式美化参考

列表样式变体:

  • 复选框列表:边框 = "1px solid #d9d9d9"边框圆角 = "4px"背景颜色 = "#ffffff"行高 = "32px"
  • 卡片列表:边框 = "none"边框圆角 = "8px"背景颜色 = "#ffffff"阴影 = "0 2px 8px rgba(0,0,0,0.1)"行高 = "40px"
  • 分组列表:边框 = "1px solid #e8e8e8"边框圆角 = "8px"背景颜色 = "#ffffff"分组背景 = "#f8f9fa"行高 = "36px"

选中状态样式:

  • 选中项:背景颜色 = "#e6f7ff"文本颜色 = "#1890ff"边框 = "1px solid #91d5ff"复选框 = "✓"
  • 未选中项:背景颜色 = "#ffffff"文本颜色 = "#333333"边框 = "none"复选框 = "□"
  • 悬停项:背景颜色 = "#f0f0f0"文本颜色 = "#333333"边框 = "none"复选框 = "□"
  • 禁用项:背景颜色 = "#f5f5f5"文本颜色 = "#d9d9d9"边框 = "none"复选框 = "□"透明度 = "0.6"

复选框样式:

  • 方形复选框:复选框样式 = "方形"复选框大小 = "16px"复选框颜色 = "#1890ff"选中颜色 = "#1890ff"
  • 圆形复选框:复选框样式 = "圆形"复选框大小 = "16px"复选框颜色 = "#1890ff"选中颜色 = "#1890ff"
  • 自定义复选框:复选框样式 = "自定义"复选框大小 = "18px"复选框颜色 = "#1890ff"选中颜色 = "#1890ff"

尺寸样式:

  • 小尺寸:宽度 = 200高度 = "自动"行高 = "28px"字体大小 = "14px"
  • 中尺寸:宽度 = 300高度 = "自动"行高 = "32px"字体大小 = "14px"
  • 大尺寸:宽度 = 400高度 = "自动"行高 = "36px"字体大小 = "16px"
  • 自适应:宽度 = "100%"高度 = "自动"最大宽度 = 500行高 = "32px"

状态样式:

  • 正常状态:边框 = "1px solid #d9d9d9"背景颜色 = "#ffffff"光标样式 = "default"
  • 悬停状态:边框 = "1px solid #d9d9d9"背景颜色 = "#f0f0f0"光标样式 = "pointer"
  • 选中状态:边框 = "1px solid #1890ff"背景颜色 = "#e6f7ff"光标样式 = "pointer"
  • 禁用状态:边框 = "1px solid #d9d9d9"背景颜色 = "#f5f5f5"光标样式 = "not-allowed"透明度 = "0.6"

全选样式:

  • 全选按钮:全选文本 = "全选"全选位置 = "顶部"全选颜色 = "#1890ff"全选大小 = "14px"
  • 全选状态:全选背景 = "#e6f7ff"全选边框 = "1px solid #91d5ff"全选文本颜色 = "#1890ff"
  • 全选悬停:全选背景 = "#f0f7ff"全选边框 = "1px solid #91d5ff"全选文本颜色 = "#1890ff"

响应式样式:

  • 移动端适配:宽度 = "100%"最大宽度 = 300行高 = "28px"字体大小 = "14px"
  • 平板端适配:宽度 = "100%"最大宽度 = 400行高 = "32px"字体大小 = "14px"
  • 桌面端适配:宽度 = 300行高 = "32px"字体大小 = "14px"边框圆角 = "4px"

示例代码

' 示例:完整的多选列表框使用演示
' 1. 创建多选列表框
变量 多选列表框1 = 创建 多选列表框()
' 2. 设置属性
多选列表框1.左边 = 100
多选列表框1.顶边 = 100
多选列表框1.宽度 = 300
多选列表框1.添加项目("苹果", 假, 1)
多选列表框1.添加项目("香蕉", 真, 2)
多选列表框1.添加项目("橘子", 真, 3)
多选列表框1.置项目选中(0, 真)
变量 选中 = 多选列表框1.取选中项目()
调试输出("已选:" + 取数组成员数(选中) + " 项")
' 3. 设置事件回调
' 注:箭头函数 ()=>{} 为原生 JS 回调语法,轻语言支持直接使用
多选列表框1.置项目被单击回调((源对象, 索引) => {
	调试输出("单击项:" + 索引)
})
' 4. 渲染并添加到父容器
多选列表框1.渲染()
添加组件(多选列表框1)

属性:拉伸内容

  • 类型: 逻辑型
  • 说明: 设置是否拉伸列表框内容,默认为假,设置为真后,列表框将隐藏滚动条,列表框内容将全部展示。

函数:添加项目(标题, 选中, 标记)

向多选列表框的数据集合中添加一个项目,包含显示文本、是否选中状态和标签信息。

函数:删除项目(索引)

从列表框的数据集合中删除指定索引位置的项目。

函数:更新项目(索引, 项目对象)

更新列表框的数据集合中指定索引位置的项目。

函数:取项目集合()

获取列表框的数据集合。

函数:清空()

清空列表框的数据集合。

函数:取项目数()

获取列表框的数据集合中的项目数量。

函数:渲染()

根据列表框的数据集合和设置的回调函数,渲染列表框的项目到页面上。

函数:插入项目(索引,标题, 选中, 标记)

在列表框中指定位置插入一个项目,包含显示文本、是否选中状态和标签信息。

函数:清空选择()

清空列表框中选择项状态。

函数:取未选中项目()

获取列表框未选中的项目,返回一个数组。

函数:取选中项目()

获取列表框中已选中的项目,返回一个数组。

函数:置项目选中(索引, 选中)

设置列表框中指定索引位置的项目选中状态。

函数:寻找项目(目标文本, 模糊查询)

在列表框中寻找项目,返回项目索引,参数二默认为假,进行精确匹配,如果设置为真则进行模糊匹配。

函数:置项目被单击回调(回调函数)

设置项目被单击时的回调对象。

事件:项目被单击(源对象,索引)

当列表框中的项目被单击时触发该事件。

组件:文本列表框

文本列表框组件用于显示纯文本列表项,每个列表项仅展示一行文本,支持单击事件回调。它是一个轻量级的列表组件,适用于不需要复杂自定义渲染的场景,如菜单列表、选项列表、数据展示等。

典型使用场景:

  • 导航菜单(侧边栏菜单、顶部导航选项)
  • 设置选项列表(系统设置、个人偏好)
  • 简单数据展示(新闻标题列表、公告列表)
  • 历史记录或日志列表

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置是否拉伸内容(隐藏滚动条)拉伸内容文本列表框1.拉伸内容 = 真
添加单个项目添加项目(标题, 标记)文本列表框1.添加项目("选项一", 1)
删除指定项目删除项目(索引)文本列表框1.删除项目(2)
更新指定项目更新项目(索引, 项目对象)文本列表框1.更新项目(1, {标题:"新名称", 标记:2})
获取所有项目取项目集合()变量 全部 = 文本列表框1.取项目集合()
获取项目数量取项目数()变量 数量 = 文本列表框1.取项目数()
清空所有项目清空()文本列表框1.清空()
触发渲染渲染()文本列表框1.渲染()
设置项目点击回调置项目被单击回调(回调函数)文本列表框1.置项目被单击回调((源对象, 索引) => { ... })

样式美化参考

文本列表框的样式主要通过继承的视图属性以及 CSS 类进行美化:

  • 整体容器:设置 宽度高度背景颜色边框边框圆角 等。建议边框圆角设置 "8px" 以得圆润效果。
  • 文本样式:通过 字体大小(建议 "14px")、文本颜色字体粗细 调整列表项的文字外观。
  • 内边距:使用 内边距 控制列表项与边框的距离,使内容不贴边。
  • 列表项样式:每个列表项默认显示为一行文本,可自定义悬停、选中状态的样式(通过 CSS 类)。
  • 拉伸内容:当 拉伸内容 = 真 时,列表高度自动适应所有项目,不出现滚动条;为 (默认)时,超出高度会显示滚动条。

CSS 美化示例(在项目 CSS 文件中定义):

.my-text-list .list-item {
    padding: 10px 16px;
    border-bottom: 1px solid #f0f0f0;
    cursor: pointer;
    transition: background-color 0.2s;
}
.my-text-list .list-item:hover {
    background-color: #f5f5f5;
}
.my-text-list .list-item:active {
    background-color: #e6f7ff;
}

在代码中应用样式类:文本列表框1.添加样式类("my-text-list")


基础示例

创建一个简单的文本列表,包含三个选项,点击时弹出提示。

变量 文本列表框1 = 创建 文本列表框()
文本列表框1.左边 = 50
文本列表框1.顶边 = 50
文本列表框1.宽度 = 200
文本列表框1.高度 = 150
文本列表框1.字体大小 = "14px"
文本列表框1.文本颜色 = "#333"
文本列表框1.边框 = "1px solid #d9d9d9"
文本列表框1.边框圆角 = "6px"
文本列表框1.内边距 = "0px"

' 添加项目
文本列表框1.添加项目("首页", "home")
文本列表框1.添加项目("产品", "product")
文本列表框1.添加项目("关于", "about")

' 设置单击回调
文本列表框1.置项目被单击回调((源对象, 索引) => {
    变量 项目 = 源对象.取项目集合()[索引]
    弹出提示("您点击了:" + 项目.标题)
})

' 渲染并添加到父容器
文本列表框1.渲染()
添加组件(文本列表框1)

综合示例:动态菜单列表

本示例展示一个动态菜单,支持添加、删除菜单项,并实时响应点击事件。

' ========== 创建文本列表框 ==========
变量 菜单列表 = 创建 文本列表框()
菜单列表.左边 = 30
菜单列表.顶边 = 30
菜单列表.宽度 = 240
菜单列表.高度 = 300
菜单列表.背景颜色 = "#ffffff"
菜单列表.边框 = "1px solid #e8e8e8"
菜单列表.边框圆角 = "8px"
菜单列表.字体大小 = "14px"
菜单列表.文本颜色 = "#333"
菜单列表.内边距 = "4px"
添加组件(菜单列表)

' ========== 准备初始数据 ==========
变量 初始菜单 = [
    {标题: "控制台", 标记: "dashboard"},
    {标题: "用户管理", 标记: "users"},
    {标题: "系统设置", 标记: "settings"}
]
变量循环(i = 0, 取数组成员数(初始菜单), 1)
    变量 项 = 初始菜单[i]
    菜单列表.添加项目(项.标题, 项.标记)
结束循环
菜单列表.渲染()

' ========== 点击回调 ==========
菜单列表.置项目被单击回调((源对象, 索引) => {
    变量 项目集合 = 源对象.取项目集合()
    变量 选中项 = 项目集合[索引]
    弹出提示("选择菜单:" + 选中项.标题)
})

' ========== 底部操作面板 ==========
变量 操作面板 = 创建 弹性布局()
操作面板.方向 = "row"
操作面板.左边 = 30
操作面板.顶边 = 350
操作面板.宽度 = 240
操作面板.间距 = 8
添加组件(操作面板)

' 输入新菜单名称
变量 输入_新菜单 = 创建 单行输入框()
输入_新菜单.宽度 = "flex-grow"
输入_新菜单.提示文本 = "新菜单名"
操作面板.添加组件(输入_新菜单)

' 添加按钮
变量 按钮_添加 = 创建 按钮()
按钮_添加.文本 = "添加"
按钮_添加.宽度 = 60
按钮_添加.高度 = 32
按钮_添加.背景颜色 = "#1890ff"
按钮_添加.文本颜色 = "#ffffff"
按钮_添加.边框圆角 = "4px"
操作面板.添加组件(按钮_添加)

' 删除按钮(删除最后一项)
变量 按钮_删除最后 = 创建 按钮()
按钮_删除最后.文本 = "删除最后"
按钮_删除最后.宽度 = 80
按钮_删除最后.高度 = 32
按钮_删除最后.背景颜色 = "#ff4d4f"
按钮_删除最后.文本颜色 = "#ffffff"
按钮_删除最后.边框圆角 = "4px"
操作面板.添加组件(按钮_删除最后)

' ========== 事件绑定 ==========
按钮_添加.置被单击回调((源对象, 事件对象) => {
    变量 新名 = 删首尾空(输入_新菜单.内容)
    如果(新名 == "")
        弹出提示("请输入菜单名称")
        返回
    结束 如果
    菜单列表.添加项目(新名, "menu_" + 取现行时间戳())
    菜单列表.渲染()
    输入_新菜单.内容 = ""
    输入_新菜单.获取焦点()
    弹出提示("已添加:" + 新名)
})

按钮_删除最后.置被单击回调((源对象, 事件对象) => {
    变量 数量 = 菜单列表.取项目数()
    如果(数量 > 0)
        菜单列表.删除项目(数量 - 1)
        菜单列表.渲染()
        弹出提示("已删除最后一项")
    否则
        弹出提示("列表已空")
    结束 如果
})

属性详解

拉伸内容

  • 类型: 逻辑型
  • 说明: 设置是否拉伸列表内容以填满容器高度。当为 时,列表高度自适应所有项目,不显示滚动条;当为 (默认)时,超出容器高度会出现滚动条。

函数详解

添加项目(标题, 标记)

  • 功能: 向列表末尾添加一个项目。
  • 参数:
    • 标题:文本型,必填,显示在列表项中的文本。
    • 标记:任意类型,可选,用于标识该项目,可在回调中区分不同项目。
  • 返回值: 无。
  • 示例: 文本列表框1.添加项目("新选项", "opt_new")

删除项目(索引)

  • 功能: 删除指定索引的项目。
  • 参数: 索引(数值型),从 0 开始。
  • 返回值: 无。

更新项目(索引, 项目对象)

  • 功能: 替换指定索引的项目为新数据。
  • 参数: 索引(数值型),项目对象 须包含 标题标记 字段(结构同添加项目参数)。
  • 返回值: 无。
  • 示例: 文本列表框1.更新项目(0, {标题: "新标题", 标记: "new_tag"})

取项目集合()

  • 功能: 获取所有项目的数组。
  • 返回值: 数组,每个元素为 {标题: "xxx", 标记: xxx} 格式的对象。
  • 示例: 变量 全部 = 文本列表框1.取项目集合()

取项目数()

  • 功能: 获取当前项目数量。
  • 返回值: 数值型。

清空()

  • 功能: 清空所有项目,列表变为空。
  • 返回值: 无。

渲染()

  • 功能: 根据当前数据集合重新生成列表项 DOM。在添加、删除、更新数据后,需要调用该方法刷新界面。
  • 返回值: 无。

置项目被单击回调(回调函数)

  • 功能: 设置项目被单击时的回调函数。
  • 参数: 回调函数,拉姆达表达式,格式为 (源对象, 索引) => { ... }
    • 源对象:触发事件的文本列表框组件本身。
    • 索引:被单击项目的索引(从 0 开始)。
  • 示例:
    文本列表框1.置项目被单击回调((源对象, 索引) => {
        变量 项目 = 源对象.取项目集合()[索引]
        调试输出("单击:" + 项目.标题 + ",标记:" + 项目.标记)
    })
    

事件:项目被单击(源对象,索引)

  • 功能:置项目被单击回调 等效,适用于设计文件(.spldg)中定义的组件,采用 VB6 风格绑定。
  • 示例:
    事件 文本列表框1.项目被单击(源对象, 索引)
        调试输出("单击项索引:" + 索引)
    结束 事件
    

⚠️ 注意事项

  1. 必须调用 渲染():在添加、删除、更新数据后,必须手动调用 渲染() 方法,否则界面不会刷新。
  2. 项目数据结构固定:每个项目由 标题(显示文本)和 标记(可选标识)组成,不支持自定义复杂内容。如需更复杂的列表项,请使用 列表框 组件。
  3. 点击回调中的索引:回调返回的 索引 是基于当前数据集合的索引,在数据变更后可能变化,建议通过标记值区分项目,而非依赖索引。
  4. 拉伸内容与滚动:当 拉伸内容 = 假(默认)时,容器高度固定,内容溢出会出现滚动条;若为 ,高度由内容撑开,不滚动。
  5. 样式定制:列表项内部样式(如悬停、选中)可通过 CSS 类定义,组件本身不提供直接属性设置每项样式。
  6. 清空操作清空() 会删除所有项目,但不会重置 拉伸内容 等属性,需手动重新添加数据。
  7. 性能:适用于项目数量不多的场景(一般不超过几百项),大量数据建议使用虚拟滚动或分页。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档列表类组件_列表框 —— 支持自定义渲染的通用列表组件
  • 文档列表类组件_单选列表框 —— 支持单选的列表组件
  • 文档列表类组件_多选列表框 —— 支持多选的列表组件
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、数组操作等
  • 文档综合演示:动态菜单列表 —— 实际应用示例

组件:树形框

树形框组件用于以树状结构展示层级数据,支持节点展开/折叠、复选框选择、自定义图标、右键菜单等功能。它适用于文件目录浏览、组织架构展示、分类导航、权限配置等需要呈现父子层级关系的场景。树形框提供了灵活的节点管理方式,支持动态添加、删除、更新节点,并提供了丰富的交互事件。

典型使用场景:

  • 文件目录浏览器(文件夹与文件的层级展示)
  • 组织架构图(公司部门、员工层级)
  • 分类导航(商品分类、文章栏目)
  • 权限管理(菜单权限、功能权限的树形分配)
  • 配置项管理(系统设置的分组与子项)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
显示/隐藏节点前的复选框显示复选框树形框1.显示复选框 = 真
添加文本节点(叶子节点)添加文本节点(文本, 父节点, ID, 图标URL, 复选框状态)树形框1.添加文本节点("张三", 分组1, "u1", "", 真)
添加分组节点(可包含子节点)添加分组节点(文本, 父节点, 子节点数组, 是否折叠, ID, 图标URL, 复选框状态)树形框1.添加分组节点("部门A", 空, [], 假, "dept1")
通用添加节点(自定义结构)添加节点(节点对象, 父节点)树形框1.添加节点({id:"n1", text:"节点", children:[]}, 空)
展开指定节点展开指定节点(节点ID)树形框1.展开指定节点("dept1")
折叠指定节点折叠指定节点(节点ID)树形框1.折叠指定节点("dept1")
展开所有节点展开全部()树形框1.展开全部()
折叠所有节点折叠全部()树形框1.折叠全部()
获取当前选中的节点获取选中节点()变量 节点 = 树形框1.获取选中节点()
获取节点状态(展开/选中)获取节点状态(节点ID)变量 状态 = 树形框1.获取节点状态("u1")
查找并高亮节点查找节点(文本)树形框1.查找节点("张三")
设置右键菜单置右键菜单(菜单项数组)树形框1.置右键菜单([{文本:"编辑", 回调:...}])
清空所有节点清空()树形框1.清空()
设置节点图标(按类型)置节点图标(节点类型, 图标URL)树形框1.置节点图标("folder", "folder.png")
设置节点单击回调置节点被单击回调(回调函数)树形框1.置节点被单击回调((源对象, 节点) => { ... })
设置复选框状态变化回调置节点被选中回调(回调函数)树形框1.置节点被选中回调((源对象, 节点, 选中状态) => { ... })

样式美化参考

树形框的外观可通过继承的视图属性和 CSS 类进行美化:

  • 整体容器:设置 宽度高度背景颜色边框边框圆角(建议 "8px")等。
  • 字体样式:通过 字体大小(建议 "14px")、文本颜色字体粗细 控制节点文本外观。
  • 内边距:使用 内边距 让节点列表与边框保持距离。
  • 节点缩进:树形框默认会根据层级自动缩进,缩进量由组件内部控制。
  • 复选框:通过 显示复选框 属性控制是否显示节点前的复选框,复选框样式可由 CSS 自定义。
  • 节点图标:可通过 置节点图标 为特定类型的节点设置自定义图标,或直接在添加节点时指定 icon 属性。

CSS 美化示例(在项目 CSS 文件中定义):

.my-tree .tree-node {
    padding: 4px 8px;
    border-radius: 4px;
    cursor: pointer;
}
.my-tree .tree-node:hover {
    background-color: #f5f5f5;
}
.my-tree .tree-node.selected {
    background-color: #e6f7ff;
    color: #1890ff;
}

在代码中应用样式类:树形框1.添加样式类("my-tree")


基础示例

创建一个简单的组织架构树,包含两个部门及其成员,并显示复选框。

变量 树形框1 = 创建 树形框()
树形框1.左边 = 50
树形框1.顶边 = 50
树形框1.宽度 = 300
树形框1.高度 = 300
树形框1.字体大小 = "14px"
树形框1.边框 = "1px solid #d9d9d9"
树形框1.边框圆角 = "8px"
树形框1.内边距 = "8px"
树形框1.显示复选框 = 真

' 添加根节点(无父节点,父节点传空)
变量 根节点 = 树形框1.添加分组节点("公司总部", 空, [], 假, "root")

' 添加部门节点
变量 部门1 = 树形框1.添加分组节点("研发部", 根节点, [], 假, "dev")
树形框1.添加文本节点("张三", 部门1, "u1", "", 真)
树形框1.添加文本节点("李四", 部门1, "u2", "", 假)

变量 部门2 = 树形框1.添加分组节点("市场部", 根节点, [], 真, "mkt")  ' 默认折叠
树形框1.添加文本节点("王五", 部门2, "u3", "", 假)
树形框1.添加文本节点("赵六", 部门2, "u4", "", 真)

' 设置单击回调
树形框1.置节点被单击回调((源对象, 节点对象) => {
    弹出提示("点击了:" + 节点对象.text)
})

' 设置复选框回调
树形框1.置节点被选中回调((源对象, 节点对象, 选中状态) => {
    调试输出("节点 " + 节点对象.text + " 选中状态:" + 选中状态)
})

' 展开所有节点
树形框1.展开全部()
添加组件(树形框1)

综合示例:文件目录浏览器

本示例模拟一个文件目录树,支持文件夹的展开/折叠,文件节点的单击打开操作,并带有右键菜单。

' ========== 创建树形框 ==========
变量 文件树 = 创建 树形框()
文件树.左边 = 30
文件树.顶边 = 30
文件树.宽度 = 350
文件树.高度 = 450
文件树.背景颜色 = "#ffffff"
文件树.边框 = "1px solid #e8e8e8"
文件树.边框圆角 = "8px"
文件树.内边距 = "8px"
文件树.字体大小 = "14px"
文件树.显示复选框 = 假  ' 本例不使用复选框
添加组件(文件树)

' 设置节点图标(按类型)
文件树.置节点图标("folder", "📁")
文件树.置节点图标("file", "📄")

' ========== 构建目录树 ==========
' 根节点(我的电脑)
变量 根 = 文件树.添加分组节点("我的电脑", 空, [], 假, "root")

' 系统盘 (C:)
变量 盘C = 文件树.添加分组节点("C:", 根, [], 假, "c")
文件树.添加文本节点("Windows", 盘C, "c1", "", 假, "folder")
文件树.添加文本节点("Program Files", 盘C, "c2", "", 假, "folder")
文件树.添加文本节点("Users", 盘C, "c3", "", 假, "folder")
    ' Users 下的子文件夹
    变量 usersFolder = 文件树.添加分组节点("Users", 盘C, [], 假, "c3_sub")
    文件树.添加文本节点("Administrator", usersFolder, "u1", "", 假, "folder")
    文件树.添加文本节点("Public", usersFolder, "u2", "", 假, "folder")

' 数据盘 (D:)
变量 盘D = 文件树.添加分组节点("D:", 根, [], 真, "d")  ' 默认折叠
文件树.添加文本节点("Documents", 盘D, "d1", "", 假, "folder")
文件树.添加文本节点("Downloads", 盘D, "d2", "", 假, "folder")
文件树.添加文本节点("readme.txt", 盘D, "d3", "", 假, "file")

' ========== 事件回调 ==========
' 节点单击(打开文件/文件夹)
文件树.置节点被单击回调((源对象, 节点对象) => {
    如果(节点对象.type == "file")
        弹出提示("打开文件:" + 节点对象.text)
    否则
        弹出提示("进入文件夹:" + 节点对象.text)
    结束 如果
})

' 右键菜单
文件树.置右键菜单([
    {文本: "新建文件夹", 回调: (节点对象) => {
        弹出提示("在 " + 节点对象.text + " 下新建文件夹")
    }},
    {文本: "重命名", 回调: (节点对象) => {
        弹出提示("重命名:" + 节点对象.text)
    }},
    {文本: "删除", 回调: (节点对象) => {
        弹出提示("删除:" + 节点对象.text)
    }}
])

' ========== 展开全部 ==========
文件树.展开全部()

' ========== 底部信息栏 ==========
变量 信息标签 = 创建 标签()
信息标签.左边 = 30
信息标签.顶边 = 495
信息标签.文本 = "当前选中:无"
信息标签.字体大小 = "12px"
信息标签.文本颜色 = "#999"
添加组件(信息标签)

' 监听节点选中(通过单击回调也可以更新选中信息,但树形框本身有选中状态)
' 这里我们通过获取选中节点来更新(由于没有单选选中事件,我们可以在单击回调中更新)
' 修改节点单击回调,增加更新信息标签
文件树.置节点被单击回调((源对象, 节点对象) => {
    信息标签.文本 = "当前选中:" + 节点对象.text
    如果(节点对象.type == "file")
        弹出提示("打开文件:" + 节点对象.text)
    否则
        弹出提示("进入文件夹:" + 节点对象.text)
    结束 如果
})

属性详解

显示复选框

  • 类型: 逻辑型
  • 说明: 设置是否在每个节点前显示复选框。当为 时,节点前会出现复选框,用户可勾选/取消勾选,并触发 置节点被选中回调。默认为

函数详解

置节点图标(节点类型, 图标URL)

  • 功能: 为指定类型的节点设置默认图标。图标可以是图片 URL 或 Emoji 字符。
  • 参数:
    • 节点类型:文本型,用于匹配节点的 type 属性。
    • 图标URL:文本型,图标地址或 Emoji 字符。
  • 返回值: 无。
  • 示例: 树形框1.置节点图标("folder", "📁")

添加节点(节点对象, 父节点)

  • 功能: 向树中添加一个节点,可以指定完整的节点配置。该函数提供了最大的灵活性。
  • 参数:
    • 节点对象:对象,必须包含以下字段:
      • id:文本型,唯一标识(必须)
      • text:文本型,显示文本(必须)
      • type:文本型,节点类型,用于匹配图标(可选)
      • icon:文本型,直接指定节点的图标(可选,优先级高于类型图标)
      • checked:逻辑型,复选框状态(可选)
      • collapsed:逻辑型,是否折叠(可选,默认
      • children:数组,子节点列表(可选)
    • 父节点:对象,父节点对象(由之前的添加函数返回),若为 则表示根节点。
  • 返回值: 创建的节点对象(可用于后续操作)。
  • 示例:
    变量 新节点 = 树形框1.添加节点({
        id: "n123",
        text: "新项目",
        type: "folder",
        children: []
    }, 父节点)
    

添加文本节点(文本, 父节点, ID, 图标URL, 复选框状态)

  • 功能: 快捷添加一个叶子节点(无子节点)。
  • 参数:
    • 文本:必填,显示文本。
    • 父节点:父节点对象,若为 则添加到根。
    • ID:可选,节点唯一标识,若省略则自动生成。
    • 图标URL:可选,节点图标。
    • 复选框状态:可选,逻辑型,默认
  • 返回值: 创建的节点对象。
  • 示例: 树形框1.添加文本节点("张三", 部门1, "u1", "", 真)

添加分组节点(文本, 父节点, 子节点数组, 是否折叠, ID, 图标URL, 复选框状态)

  • 功能: 快捷添加一个可包含子节点的分组节点。
  • 参数:
    • 文本:必填。
    • 父节点:父节点对象。
    • 子节点数组:可选,预先添加的子节点数组。
    • 是否折叠:可选,逻辑型,默认 (展开)。
    • ID:可选。
    • 图标URL:可选。
    • 复选框状态:可选。
  • 返回值: 创建的节点对象。

展开指定节点(节点ID)

  • 功能: 展开指定 ID 的节点(如果该节点是分组节点且当前折叠)。
  • 参数: 节点ID(文本型)。
  • 返回值: 无。

折叠指定节点(节点ID)

  • 功能: 折叠指定 ID 的节点。
  • 参数: 节点ID(文本型)。
  • 返回值: 无。

展开全部()

  • 功能: 展开树中所有节点。
  • 返回值: 无。

折叠全部()

  • 功能: 折叠树中所有节点。
  • 返回值: 无。

获取选中节点()

  • 功能: 获取当前选中的节点(通常指被单击选中的节点)。
  • 返回值: 节点对象,若无选中则返回

获取节点状态(节点ID)

  • 功能: 获取指定节点的展开状态和复选框状态。
  • 参数: 节点ID(文本型)。
  • 返回值: 对象,包含 collapsed(是否折叠)和 checked(是否选中)属性。若节点不存在则返回

查找节点(文本)

  • 功能: 在树中搜索包含指定文本的节点,并高亮显示(滚动到可视区域)。
  • 参数: 文本(文本型)。
  • 返回值: 找到的第一个节点对象,若无则返回

置右键菜单(菜单项数组)

  • 功能: 为树节点设置右键上下文菜单。当用户在节点上右键点击时,弹出菜单。
  • 参数: 菜单项数组,每个元素为对象,包含 文本(显示文字)和 回调(点击时的回调函数,参数为当前右键点击的节点对象)。
  • 返回值: 无。
  • 示例:
    树形框1.置右键菜单([
        {文本: "编辑", 回调: (节点) => { 弹出提示("编辑:" + 节点.text) }},
        {文本: "删除", 回调: (节点) => { 弹出提示("删除:" + 节点.text) }}
    ])
    

清空()

  • 功能: 清空树中所有节点。
  • 返回值: 无。

置节点被单击回调(回调函数)

  • 功能: 设置节点被单击时的回调函数。
  • 参数: 回调函数,格式为 (源对象, 节点对象) => { ... }
    • 源对象:树形框组件本身。
    • 节点对象:被单击的节点对象。
  • 返回值: 无。

置节点被选中回调(回调函数)

  • 功能: 设置节点复选框状态变化时的回调函数。
  • 参数: 回调函数,格式为 (源对象, 节点对象, 选中状态) => { ... }
    • 源对象:树形框组件本身。
    • 节点对象:状态变化的节点。
    • 选中状态:逻辑型,表示新的选中状态。
  • 返回值: 无。

事件说明

节点被单击(源对象, 节点对象)

  • 功能:置节点被单击回调 等效,适用于设计文件(.spldg)中定义的组件。
  • 示例:
    事件 树形框1.节点被单击(源对象, 节点对象)
        调试输出("单击:" + 节点对象.text)
    结束 事件
    

节点被选中(源对象, 节点对象, 选中状态)

  • 功能:置节点被选中回调 等效,适用于设计文件。
  • 示例:
    事件 树形框1.节点被选中(源对象, 节点对象, 选中状态)
        调试输出("节点 " + 节点对象.text + " 选中:" + 选中状态)
    结束 事件
    

⚠️ 注意事项

  1. 节点 ID 唯一性:每个节点的 id 应保持唯一,否则可能导致操作混乱(如展开指定节点时无法准确定位)。
  2. 父节点引用:添加节点时,父节点 参数必须传入由同一树形框先前创建函数返回的节点对象,不能传入 以外的任意对象。
  3. 复选框回调:只有 显示复选框 时,复选框才会显示,置节点被选中回调 才会在用户勾选/取消勾选时触发。
  4. 展开/折叠状态:使用 添加分组节点 时可通过 是否折叠 参数控制初始状态,也可后续通过 展开指定节点/折叠指定节点 动态控制。
  5. 右键菜单:菜单项的回调函数参数为当前右键点击的节点对象,可据此执行针对该节点的操作。
  6. 查找节点查找节点 只高亮显示第一个匹配的节点,不会展开路径,若节点在折叠的父节点下,可能无法看到。
  7. 性能考虑:树形框适用于节点数量较大的场景(如数百个节点),但若节点数量极大(数千以上),建议考虑分页或异步加载。
  8. 节点数据更新:若需修改已有节点的属性(如文本、图标),目前没有直接的更新方法,建议删除旧节点并重新添加,或通过 添加节点 时传入完整结构覆盖。
  9. 根节点:树可以没有根节点(即添加节点时父节点传 会有多个顶层节点),也可以创建一个根节点作为统一入口。
  10. 样式定制:节点缩进、图标大小等细节由组件内部控制,可通过 CSS 类覆盖,但需了解内部 DOM 结构。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档列表类组件_列表框 —— 其他列表类组件
  • 文档文本类组件_标签 —— 配合树形框显示节点信息
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、对象操作等
  • 文档综合演示:文件目录树 —— 实际应用示例

组件:树形框

树形框组件用于以树状结构展示层级数据,支持节点展开/折叠、复选框选择、自定义图标、右键菜单等功能。它适用于文件目录浏览、组织架构展示、分类导航、权限配置等需要呈现父子层级关系的场景。树形框提供了灵活的节点管理方式,支持动态添加、删除、更新节点,并提供了丰富的交互事件。

典型使用场景:

  • 文件目录浏览器(文件夹与文件的层级展示)
  • 组织架构图(公司部门、员工层级)
  • 分类导航(商品分类、文章栏目)
  • 权限管理(菜单权限、功能权限的树形分配)
  • 配置项管理(系统设置的分组与子项)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
显示/隐藏节点前的复选框显示复选框树形框1.显示复选框 = 真
添加文本节点(叶子节点)添加文本节点(文本, 父节点, ID, 图标URL, 复选框状态)树形框1.添加文本节点("张三", 分组1, "u1", "", 真)
添加分组节点(可包含子节点)添加分组节点(文本, 父节点, 子节点数组, 是否折叠, ID, 图标URL, 复选框状态)树形框1.添加分组节点("部门A", 空, [], 假, "dept1")
通用添加节点(自定义结构)添加节点(节点对象, 父节点)树形框1.添加节点({id:"n1", text:"节点", children:[]}, 空)
展开指定节点展开指定节点(节点ID)树形框1.展开指定节点("dept1")
折叠指定节点折叠指定节点(节点ID)树形框1.折叠指定节点("dept1")
展开所有节点展开全部()树形框1.展开全部()
折叠所有节点折叠全部()树形框1.折叠全部()
获取当前选中的节点获取选中节点()变量 节点 = 树形框1.获取选中节点()
获取节点状态(展开/选中)获取节点状态(节点ID)变量 状态 = 树形框1.获取节点状态("u1")
查找并高亮节点查找节点(文本)树形框1.查找节点("张三")
设置右键菜单置右键菜单(菜单项数组)树形框1.置右键菜单([{文本:"编辑", 回调:...}])
清空所有节点清空()树形框1.清空()
设置节点图标(按类型)置节点图标(节点类型, 图标URL)树形框1.置节点图标("folder", "folder.png")
设置节点单击回调置节点被单击回调(回调函数)树形框1.置节点被单击回调((源对象, 节点) => { ... })
设置复选框状态变化回调置节点被选中回调(回调函数)树形框1.置节点被选中回调((源对象, 节点, 选中状态) => { ... })

样式美化参考

树形框的外观可通过继承的视图属性和 CSS 类进行美化:

  • 整体容器:设置 宽度高度背景颜色边框边框圆角(建议 "8px")等。
  • 字体样式:通过 字体大小(建议 "14px")、文本颜色字体粗细 控制节点文本外观。
  • 内边距:使用 内边距 让节点列表与边框保持距离。
  • 节点缩进:树形框默认会根据层级自动缩进,缩进量由组件内部控制。
  • 复选框:通过 显示复选框 属性控制是否显示节点前的复选框,复选框样式可由 CSS 自定义。
  • 节点图标:可通过 置节点图标 为特定类型的节点设置自定义图标,或直接在添加节点时指定 icon 属性。

CSS 美化示例(在项目 CSS 文件中定义):

.my-tree .tree-node {
    padding: 4px 8px;
    border-radius: 4px;
    cursor: pointer;
}
.my-tree .tree-node:hover {
    background-color: #f5f5f5;
}
.my-tree .tree-node.selected {
    background-color: #e6f7ff;
    color: #1890ff;
}

在代码中应用样式类:树形框1.添加样式类("my-tree")


基础示例

创建一个简单的组织架构树,包含两个部门及其成员,并显示复选框。

变量 树形框1 = 创建 树形框()
树形框1.左边 = 50
树形框1.顶边 = 50
树形框1.宽度 = 300
树形框1.高度 = 300
树形框1.字体大小 = "14px"
树形框1.边框 = "1px solid #d9d9d9"
树形框1.边框圆角 = "8px"
树形框1.内边距 = "8px"
树形框1.显示复选框 = 真

' 添加根节点(无父节点,父节点传空)
变量 根节点 = 树形框1.添加分组节点("公司总部", 空, [], 假, "root")

' 添加部门节点
变量 部门1 = 树形框1.添加分组节点("研发部", 根节点, [], 假, "dev")
树形框1.添加文本节点("张三", 部门1, "u1", "", 真)
树形框1.添加文本节点("李四", 部门1, "u2", "", 假)

变量 部门2 = 树形框1.添加分组节点("市场部", 根节点, [], 真, "mkt")  ' 默认折叠
树形框1.添加文本节点("王五", 部门2, "u3", "", 假)
树形框1.添加文本节点("赵六", 部门2, "u4", "", 真)

' 设置单击回调
树形框1.置节点被单击回调((源对象, 节点对象) => {
    弹出提示("点击了:" + 节点对象.text)
})

' 设置复选框回调
树形框1.置节点被选中回调((源对象, 节点对象, 选中状态) => {
    调试输出("节点 " + 节点对象.text + " 选中状态:" + 选中状态)
})

' 展开所有节点
树形框1.展开全部()
添加组件(树形框1)

综合示例:文件目录浏览器

本示例模拟一个文件目录树,支持文件夹的展开/折叠,文件节点的单击打开操作,并带有右键菜单。

' ========== 创建树形框 ==========
变量 文件树 = 创建 树形框()
文件树.左边 = 30
文件树.顶边 = 30
文件树.宽度 = 350
文件树.高度 = 450
文件树.背景颜色 = "#ffffff"
文件树.边框 = "1px solid #e8e8e8"
文件树.边框圆角 = "8px"
文件树.内边距 = "8px"
文件树.字体大小 = "14px"
文件树.显示复选框 = 假  ' 本例不使用复选框
添加组件(文件树)

' 设置节点图标(按类型)
文件树.置节点图标("folder", "📁")
文件树.置节点图标("file", "📄")

' ========== 构建目录树 ==========
' 根节点(我的电脑)
变量 根 = 文件树.添加分组节点("我的电脑", 空, [], 假, "root")

' 系统盘 (C:)
变量 盘C = 文件树.添加分组节点("C:", 根, [], 假, "c")
文件树.添加文本节点("Windows", 盘C, "c1", "", 假, "folder")
文件树.添加文本节点("Program Files", 盘C, "c2", "", 假, "folder")
文件树.添加文本节点("Users", 盘C, "c3", "", 假, "folder")
    ' Users 下的子文件夹
    变量 usersFolder = 文件树.添加分组节点("Users", 盘C, [], 假, "c3_sub")
    文件树.添加文本节点("Administrator", usersFolder, "u1", "", 假, "folder")
    文件树.添加文本节点("Public", usersFolder, "u2", "", 假, "folder")

' 数据盘 (D:)
变量 盘D = 文件树.添加分组节点("D:", 根, [], 真, "d")  ' 默认折叠
文件树.添加文本节点("Documents", 盘D, "d1", "", 假, "folder")
文件树.添加文本节点("Downloads", 盘D, "d2", "", 假, "folder")
文件树.添加文本节点("readme.txt", 盘D, "d3", "", 假, "file")

' ========== 事件回调 ==========
' 节点单击(打开文件/文件夹)
文件树.置节点被单击回调((源对象, 节点对象) => {
    如果(节点对象.type == "file")
        弹出提示("打开文件:" + 节点对象.text)
    否则
        弹出提示("进入文件夹:" + 节点对象.text)
    结束 如果
})

' 右键菜单
文件树.置右键菜单([
    {文本: "新建文件夹", 回调: (节点对象) => {
        弹出提示("在 " + 节点对象.text + " 下新建文件夹")
    }},
    {文本: "重命名", 回调: (节点对象) => {
        弹出提示("重命名:" + 节点对象.text)
    }},
    {文本: "删除", 回调: (节点对象) => {
        弹出提示("删除:" + 节点对象.text)
    }}
])

' ========== 展开全部 ==========
文件树.展开全部()

' ========== 底部信息栏 ==========
变量 信息标签 = 创建 标签()
信息标签.左边 = 30
信息标签.顶边 = 495
信息标签.文本 = "当前选中:无"
信息标签.字体大小 = "12px"
信息标签.文本颜色 = "#999"
添加组件(信息标签)

' 监听节点选中(通过单击回调也可以更新选中信息,但树形框本身有选中状态)
' 这里我们通过获取选中节点来更新(由于没有单选选中事件,我们可以在单击回调中更新)
' 修改节点单击回调,增加更新信息标签
文件树.置节点被单击回调((源对象, 节点对象) => {
    信息标签.文本 = "当前选中:" + 节点对象.text
    如果(节点对象.type == "file")
        弹出提示("打开文件:" + 节点对象.text)
    否则
        弹出提示("进入文件夹:" + 节点对象.text)
    结束 如果
})

属性详解

显示复选框

  • 类型: 逻辑型
  • 说明: 设置是否在每个节点前显示复选框。当为 时,节点前会出现复选框,用户可勾选/取消勾选,并触发 置节点被选中回调。默认为

函数详解

置节点图标(节点类型, 图标URL)

  • 功能: 为指定类型的节点设置默认图标。图标可以是图片 URL 或 Emoji 字符。
  • 参数:
    • 节点类型:文本型,用于匹配节点的 type 属性。
    • 图标URL:文本型,图标地址或 Emoji 字符。
  • 返回值: 无。
  • 示例: 树形框1.置节点图标("folder", "📁")

添加节点(节点对象, 父节点)

  • 功能: 向树中添加一个节点,可以指定完整的节点配置。该函数提供了最大的灵活性。
  • 参数:
    • 节点对象:对象,必须包含以下字段:
      • id:文本型,唯一标识(必须)
      • text:文本型,显示文本(必须)
      • type:文本型,节点类型,用于匹配图标(可选)
      • icon:文本型,直接指定节点的图标(可选,优先级高于类型图标)
      • checked:逻辑型,复选框状态(可选)
      • collapsed:逻辑型,是否折叠(可选,默认
      • children:数组,子节点列表(可选)
    • 父节点:对象,父节点对象(由之前的添加函数返回),若为 则表示根节点。
  • 返回值: 创建的节点对象(可用于后续操作)。
  • 示例:
    变量 新节点 = 树形框1.添加节点({
        id: "n123",
        text: "新项目",
        type: "folder",
        children: []
    }, 父节点)
    

添加文本节点(文本, 父节点, ID, 图标URL, 复选框状态)

  • 功能: 快捷添加一个叶子节点(无子节点)。
  • 参数:
    • 文本:必填,显示文本。
    • 父节点:父节点对象,若为 则添加到根。
    • ID:可选,节点唯一标识,若省略则自动生成。
    • 图标URL:可选,节点图标。
    • 复选框状态:可选,逻辑型,默认
  • 返回值: 创建的节点对象。
  • 示例: 树形框1.添加文本节点("张三", 部门1, "u1", "", 真)

添加分组节点(文本, 父节点, 子节点数组, 是否折叠, ID, 图标URL, 复选框状态)

  • 功能: 快捷添加一个可包含子节点的分组节点。
  • 参数:
    • 文本:必填。
    • 父节点:父节点对象。
    • 子节点数组:可选,预先添加的子节点数组。
    • 是否折叠:可选,逻辑型,默认 (展开)。
    • ID:可选。
    • 图标URL:可选。
    • 复选框状态:可选。
  • 返回值: 创建的节点对象。

展开指定节点(节点ID)

  • 功能: 展开指定 ID 的节点(如果该节点是分组节点且当前折叠)。
  • 参数: 节点ID(文本型)。
  • 返回值: 无。

折叠指定节点(节点ID)

  • 功能: 折叠指定 ID 的节点。
  • 参数: 节点ID(文本型)。
  • 返回值: 无。

展开全部()

  • 功能: 展开树中所有节点。
  • 返回值: 无。

折叠全部()

  • 功能: 折叠树中所有节点。
  • 返回值: 无。

获取选中节点()

  • 功能: 获取当前选中的节点(通常指被单击选中的节点)。
  • 返回值: 节点对象,若无选中则返回

获取节点状态(节点ID)

  • 功能: 获取指定节点的展开状态和复选框状态。
  • 参数: 节点ID(文本型)。
  • 返回值: 对象,包含 collapsed(是否折叠)和 checked(是否选中)属性。若节点不存在则返回

查找节点(文本)

  • 功能: 在树中搜索包含指定文本的节点,并高亮显示(滚动到可视区域)。
  • 参数: 文本(文本型)。
  • 返回值: 找到的第一个节点对象,若无则返回

置右键菜单(菜单项数组)

  • 功能: 为树节点设置右键上下文菜单。当用户在节点上右键点击时,弹出菜单。
  • 参数: 菜单项数组,每个元素为对象,包含 文本(显示文字)和 回调(点击时的回调函数,参数为当前右键点击的节点对象)。
  • 返回值: 无。
  • 示例:
    树形框1.置右键菜单([
        {文本: "编辑", 回调: (节点) => { 弹出提示("编辑:" + 节点.text) }},
        {文本: "删除", 回调: (节点) => { 弹出提示("删除:" + 节点.text) }}
    ])
    

清空()

  • 功能: 清空树中所有节点。
  • 返回值: 无。

置节点被单击回调(回调函数)

  • 功能: 设置节点被单击时的回调函数。
  • 参数: 回调函数,格式为 (源对象, 节点对象) => { ... }
    • 源对象:树形框组件本身。
    • 节点对象:被单击的节点对象。
  • 返回值: 无。

置节点被选中回调(回调函数)

  • 功能: 设置节点复选框状态变化时的回调函数。
  • 参数: 回调函数,格式为 (源对象, 节点对象, 选中状态) => { ... }
    • 源对象:树形框组件本身。
    • 节点对象:状态变化的节点。
    • 选中状态:逻辑型,表示新的选中状态。
  • 返回值: 无。

事件说明

节点被单击(源对象, 节点对象)

  • 功能:置节点被单击回调 等效,适用于设计文件(.spldg)中定义的组件。
  • 示例:
    事件 树形框1.节点被单击(源对象, 节点对象)
        调试输出("单击:" + 节点对象.text)
    结束 事件
    

节点被选中(源对象, 节点对象, 选中状态)

  • 功能:置节点被选中回调 等效,适用于设计文件。
  • 示例:
    事件 树形框1.节点被选中(源对象, 节点对象, 选中状态)
        调试输出("节点 " + 节点对象.text + " 选中:" + 选中状态)
    结束 事件
    

⚠️ 注意事项

  1. 节点 ID 唯一性:每个节点的 id 应保持唯一,否则可能导致操作混乱(如展开指定节点时无法准确定位)。
  2. 父节点引用:添加节点时,父节点 参数必须传入由同一树形框先前创建函数返回的节点对象,不能传入 以外的任意对象。
  3. 复选框回调:只有 显示复选框 时,复选框才会显示,置节点被选中回调 才会在用户勾选/取消勾选时触发。
  4. 展开/折叠状态:使用 添加分组节点 时可通过 是否折叠 参数控制初始状态,也可后续通过 展开指定节点/折叠指定节点 动态控制。
  5. 右键菜单:菜单项的回调函数参数为当前右键点击的节点对象,可据此执行针对该节点的操作。
  6. 查找节点查找节点 只高亮显示第一个匹配的节点,不会展开路径,若节点在折叠的父节点下,可能无法看到。
  7. 性能考虑:树形框适用于节点数量较大的场景(如数百个节点),但若节点数量极大(数千以上),建议考虑分页或异步加载。
  8. 节点数据更新:若需修改已有节点的属性(如文本、图标),目前没有直接的更新方法,建议删除旧节点并重新添加,或通过 添加节点 时传入完整结构覆盖。
  9. 根节点:树可以没有根节点(即添加节点时父节点传 会有多个顶层节点),也可以创建一个根节点作为统一入口。
  10. 样式定制:节点缩进、图标大小等细节由组件内部控制,可通过 CSS 类覆盖,但需了解内部 DOM 结构。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档列表类组件_列表框 —— 其他列表类组件
  • 文档文本类组件_标签 —— 配合树形框显示节点信息
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、对象操作等
  • 文档综合演示:文件目录树 —— 实际应用示例

组件:水平滚动框

水平滚动框是一个容器型组件,用于在固定宽度区域内展示超出可视范围的内容,并提供水平方向的滚动能力。它支持动态添加、删除子组件,适合承载横向排列且宽度会动态变化的内容集合,如图片轮播、横向导航菜单、标签页、卡片横向滚动等场景。与垂直滚动框相比,它的滚动方向为水平,且子组件默认从左到右排列。

典型使用场景:

  • 横向导航菜单(分类标签、频道切换)
  • 图片/卡片横向滚动展示(产品展示、相册)
  • 标签页栏(多标签横向排列,超出可滚动)
  • 横向时间线或步骤指示器
  • 任何需要水平滚动的自定义内容区域

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置容器尺寸(决定滚动区域大小)宽度 / 高度水平滚动框1.宽度 = 600水平滚动框1.高度 = 160
添加子组件(自动追加到末尾)添加组件(视图对象)水平滚动框1.添加组件(图片1)
获取子组件总数取子组件数()变量 数量 = 水平滚动框1.取子组件数()
获取指定索引的子组件取子组件(索引)变量 组件 = 水平滚动框1.取子组件(0)
删除指定索引的子组件删除组件(索引)水平滚动框1.删除组件(2)
清空所有子组件清空()水平滚动框1.清空()
获取内容包裹层(用于精细控制)取内容包裹层()变量 层 = 水平滚动框1.取内容包裹层()

样式美化参考

水平滚动框的样式主要通过继承的视图属性调整:

  • 整体容器:通过 宽度高度 设置滚动区域的尺寸;背景颜色边框边框圆角(建议 "8px")等属性美化容器外观。
  • 内容区域:内部内容包裹层默认水平排列,子组件宽度由各自属性决定,超出容器宽度时出现水平滚动条。
  • 滚动条样式:滚动条样式由浏览器原生控制,可通过 CSS 伪类自定义(需借助 添加样式类内联样式)。
  • 内边距:通过 内边距 为内容区域添加内边距,使内容不贴边。

滚动条美化示例(通过 CSS 类):

' 添加自定义滚动条样式类
水平滚动框1.添加样式类("custom-h-scrollbar")

对应的 CSS(在项目 CSS 文件中定义):

.custom-h-scrollbar::-webkit-scrollbar {
    height: 6px;
}
.custom-h-scrollbar::-webkit-scrollbar-track {
    background: #f0f0f0;
    border-radius: 4px;
}
.custom-h-scrollbar::-webkit-scrollbar-thumb {
    background: #c1c1c1;
    border-radius: 4px;
}
.custom-h-scrollbar::-webkit-scrollbar-thumb:hover {
    background: #a8a8a8;
}

基础示例

创建一个固定宽度的水平滚动容器,添加若干图片框,当图片总宽度超出容器宽度时自动出现滚动条。

' ========== 创建水平滚动框 ==========
变量 滚动框1 = 创建 水平滚动框()
滚动框1.左边 = 50
滚动框1.顶边 = 50
滚动框1.宽度 = 640
滚动框1.高度 = 180
滚动框1.背景颜色 = "#fafafa"
滚动框1.边框 = "1px solid #e8e8e8"
滚动框1.边框圆角 = "8px"
滚动框1.内边距 = "8px"
添加组件(滚动框1)

' ========== 添加若干图片框 ==========
变量 图片地址 = [
    "https://picsum.photos/200/140?random=1",
    "https://picsum.photos/200/140?random=2",
    "https://picsum.photos/200/140?random=3",
    "https://picsum.photos/200/140?random=4",
    "https://picsum.photos/200/140?random=5",
    "https://picsum.photos/200/140?random=6"
]

变量循环(i = 0, 取数组成员数(图片地址), 1)
    变量 图 = 创建 图片框()
    图.图片宽度 = 200
    图.图片高度 = 140
    图.图片 = 图片地址[i]
    图.边框圆角 = "4px"
    图.外边距右 = 12  ' 图片间距
    滚动框1.添加组件(图)
结束循环

综合示例:横向标签导航(可滚动分类栏)

本示例模拟一个可横向滚动的分类标签栏,每个标签可点击切换,并配合内容区域展示对应分类信息。

' ========== 创建水平滚动框(标签栏) ==========
变量 标签栏 = 创建 水平滚动框()
标签栏.左边 = 20
标签栏.顶边 = 20
标签栏.宽度 = 480
标签栏.高度 = 44
标签栏.背景颜色 = "#ffffff"
标签栏.边框 = "1px solid #e8e8e8"
标签栏.边框圆角 = "8px"
标签栏.内边距 = "4px"
添加组件(标签栏)

' ========== 添加标签按钮 ==========
变量 分类数据 = [
    "全部", "电子产品", "家居用品", "图书文具", "服装服饰",
    "食品饮料", "运动户外", "汽车配件", "美妆护肤", "母婴用品"
]

' 存储标签按钮的引用,用于更新选中状态
变量 标签按钮列表 = []

变量循环(i = 0, 取数组成员数(分类数据), 1)
    变量 标签文本 = 分类数据[i]
    变量 按钮 = 创建 按钮()
    按钮.文本 = 标签文本
    按钮.宽度 = 80
    按钮.高度 = 32
    按钮.背景颜色 = "transparent"
    按钮.文本颜色 = "#333"
    按钮.字体大小 = "14px"
    按钮.边框 = "none"
    按钮.边框圆角 = "4px"
    按钮.光标样式 = "pointer"
    标签栏.添加组件(按钮)
    
    ' 存储引用
    添加成员(标签按钮列表, 按钮)
结束循环

' ========== 内容显示区域 ==========
变量 内容标签 = 创建 标签()
内容标签.左边 = 20
内容标签.顶边 = 80
内容标签.文本 = "当前分类:全部"
内容标签.字体大小 = "18px"
内容标签.字体粗细 = "bold"
添加组件(内容标签)

' ========== 辅助函数:重置所有按钮样式 ==========
函数 重置按钮样式()
    变量循环(i = 0, 取数组成员数(标签按钮列表), 1)
        变量 按钮 = 标签按钮列表[i]
        按钮.背景颜色 = "transparent"
        按钮.文本颜色 = "#333"
    结束循环
结束 函数

' ========== 为每个按钮绑定点击事件 ==========
变量 选中索引 = 0
变量循环(i = 0, 取数组成员数(标签按钮列表), 1)
    变量 按钮 = 标签按钮列表[i]
    变量 分类名 = 分类数据[i]
    
    按钮.置被单击回调((源对象, 事件对象) => {
        ' 重置所有按钮样式
        重置按钮样式()
        ' 高亮当前按钮
        源对象.背景颜色 = "#1890ff"
        源对象.文本颜色 = "#ffffff"
        ' 更新内容
        内容标签.文本 = "当前分类:" + 分类名
        ' 模拟加载数据
        弹出提示("加载 " + 分类名 + " 数据")
    })
结束循环

' 默认选中第一项
变量 默认按钮 = 标签按钮列表[0]
默认按钮.背景颜色 = "#1890ff"
默认按钮.文本颜色 = "#ffffff"

函数详解

添加组件(视图对象)

  • 功能: 向滚动框的内容区域末尾添加一个子组件。
  • 参数: 视图对象,必须是继承自 视图 的组件实例(如 标签按钮图片框 等)。
  • 返回值: 无。
  • 说明: 添加后,如果内容总宽度超出滚动框的 宽度,会自动出现水平滚动条。
  • 示例: 滚动框1.添加组件(新卡片)

取子组件数()

  • 功能: 获取当前滚动框中子组件的数量。
  • 返回值: 数值型,子组件总数。
  • 示例: 变量 数量 = 滚动框1.取子组件数()

取子组件(索引)

  • 功能: 获取指定索引位置的子组件对象。
  • 参数: 索引(数值型),从 0 开始。
  • 返回值: 视图对象,若索引无效则返回
  • 示例:
    变量 第一个组件 = 滚动框1.取子组件(0)
    如果(第一个组件 != 空)
        调试输出("第一个组件类型:" + 取数据类型(第一个组件))
    结束 如果
    

取内容包裹层()

  • 功能: 获取滚动框内部用于包裹所有子组件的容器层对象。可用于精细控制布局或操作滚动位置。
  • 返回值: DOM 元素对象(原生 HTML 元素)。
  • 示例:
    变量 包裹层 = 滚动框1.取内容包裹层()
    ' 可以通过包裹层操作 DOM 属性,如 scrollWidth
    变量 内容总宽 = 包裹层.scrollWidth
    

删除组件(索引)

  • 功能: 删除指定索引位置的子组件。
  • 参数: 索引(数值型),从 0 开始。
  • 返回值: 无。
  • 示例: 滚动框1.删除组件(0) 删除第一个子组件

清空()

  • 功能: 移除滚动框中的所有子组件。
  • 返回值: 无。
  • 示例: 滚动框1.清空()

⚠️ 注意事项

  1. 必须设置宽度:水平滚动框需要明确的 宽度 属性才能确定可视区域宽度,否则内容会无限撑开,无法滚动(或产生水平溢出但无滚动条)。
  2. 子组件高度:子组件的高度建议设置为小于等于滚动框的 高度,否则会出现垂直溢出(但滚动框不提供垂直滚动),可配合 溢出隐藏 或调整子组件高度。
  3. 子组件宽度:子组件的宽度由自身决定,各子组件宽度之和超出滚动框宽度时出现水平滚动条。
  4. 动态内容更新:添加或删除组件后,滚动框会自动调整内部布局,无需手动刷新。
  5. 滚动到指定位置:如需在添加新内容后自动滚动到最右侧(如新增标签),可通过 取内容包裹层() 获取包裹层,然后操作其父容器的 scrollLeft 属性实现。
  6. 性能考虑:当子组件数量极大时,所有 DOM 节点都会存在于页面中,可能影响性能。建议合理控制数量。
  7. 与垂直滚动框的区别:水平滚动框只提供水平滚动,若需要垂直滚动,请使用 垂直滚动框 组件。
  8. 内容包裹层的操作取内容包裹层() 返回的是原生 DOM 对象,可直接操作其属性(如 scrollWidthchildNodes 等),但需注意兼容性。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档布局类组件_弹性布局 —— 配合使用的弹性布局容器
  • 文档列表类组件_垂直滚动框 —— 垂直滚动容器
  • 文档图像类组件_图片框 —— 常用于水平滚动框展示图片
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、循环语句等
  • 文档综合演示:横向分类导航 —— 实际应用示例

组件:组合框

组合框组件用于提供下拉选择功能,允许用户从预定义的选项列表中选择一个值。它基于 HTML <select> 元素封装,支持添加/清空选项、设置选中项以及值变化回调。常用于表单中的选项选择、数据筛选、分类切换等场景。

典型使用场景:

  • 表单中的下拉选择(性别、城市、职业等)
  • 数据筛选与查询(按分类、状态、时间筛选)
  • 设置选项(语言选择、主题选择)
  • 分类导航(产品分类、文章栏目)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
添加选项添加项目(文本, 值)组合框1.添加项目("北京", "BJ")
清空所有选项清空()组合框1.清空()
渲染选项到界面渲染()组合框1.渲染()
设置选择变化回调置项目被选择回调(回调函数)组合框1.置项目被选择回调((源对象, 事件, 值, 文本) => { ... })
获取当前选中值通过 取属性值("value")变量 值 = 组合框1.取属性值("value")
获取当前选中文本通过 文本 属性变量 文本 = 组合框1.文本
禁用/启用组合框禁用组合框1.禁用 = 真
设置默认选中项通过 置属性值("value", 值)组合框1.置属性值("value", "SH")

样式美化参考

组合框的样式主要通过继承的视图属性和 CSS 类进行美化:

  • 整体容器:通过 宽度高度背景颜色边框(建议 "1px solid #d9d9d9")、边框圆角(建议 "6px")等属性调整外观。
  • 字体样式:通过 字体大小(建议 "14px")、文本颜色 控制选项文字外观。
  • 内边距:使用 内边距(如 "4px 12px")控制下拉框内边距。
  • 禁用状态禁用 = 真 时,组合框变灰且不可交互。
  • 下拉箭头:默认浏览器样式,可通过 CSS 自定义(需了解 <select> 伪元素)。

CSS 美化示例(在项目 CSS 文件中定义):

.my-combobox {
    padding: 6px 12px;
    border: 1px solid #d9d9d9;
    border-radius: 6px;
    font-size: 14px;
    background-color: #ffffff;
    appearance: auto;  /* 保留原生下拉箭头 */
    cursor: pointer;
}
.my-combobox:focus {
    border-color: #1890ff;
    outline: none;
    box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
}
.my-combobox:disabled {
    background-color: #f5f5f5;
    cursor: not-allowed;
}

在代码中应用样式类:组合框1.添加样式类("my-combobox")


基础示例

创建一个简单的城市选择组合框,包含三个选项,选中时弹出提示。

变量 组合框1 = 创建 组合框()
组合框1.左边 = 50
组合框1.顶边 = 50
组合框1.宽度 = 200
组合框1.高度 = 36
组合框1.字体大小 = "14px"
组合框1.边框 = "1px solid #d9d9d9"
组合框1.边框圆角 = "6px"
组合框1.内边距 = "4px 12px"

' 添加选项
组合框1.添加项目("北京", "BJ")
组合框1.添加项目("上海", "SH")
组合框1.添加项目("深圳", "SZ")
组合框1.添加项目("广州", "GZ")

' 渲染到界面
组合框1.渲染()

' 设置选择回调
组合框1.置项目被选择回调((源对象, 事件对象, 选中值, 选中文本) => {
    弹出提示("选择了:" + 选中文本 + "(值:" + 选中值 + ")")
})

添加组件(组合框1)

综合示例:商品筛选面板

本示例构建一个商品筛选面板,包含城市、品类、排序三个组合框,联动筛选并更新商品列表。

' ========== 创建筛选面板 ==========
变量 筛选面板 = 创建 弹性布局()
筛选面板.方向 = "row"
筛选面板.左边 = 20
筛选面板.顶边 = 20
筛选面板.宽度 = 500
筛选面板.间距 = 16
筛选面板.侧轴对齐 = "center"
添加组件(筛选面板)

' ========== 城市选择 ==========
变量 标签_城市 = 创建 标签()
标签_城市.文本 = "城市:"
标签_城市.字体大小 = "14px"
筛选面板.添加组件(标签_城市)

变量 组合框_城市 = 创建 组合框()
组合框_城市.宽度 = 120
组合框_城市.高度 = 32
组合框_城市.边框 = "1px solid #d9d9d9"
组合框_城市.边框圆角 = "4px"
组合框_城市.添加项目("全部", "all")
组合框_城市.添加项目("北京", "BJ")
组合框_城市.添加项目("上海", "SH")
组合框_城市.添加项目("深圳", "SZ")
组合框_城市.渲染()
筛选面板.添加组件(组合框_城市)

' ========== 品类选择 ==========
变量 标签_品类 = 创建 标签()
标签_品类.文本 = "品类:"
标签_品类.字体大小 = "14px"
筛选面板.添加组件(标签_品类)

变量 组合框_品类 = 创建 组合框()
组合框_品类.宽度 = 120
组合框_品类.高度 = 32
组合框_品类.边框 = "1px solid #d9d9d9"
组合框_品类.边框圆角 = "4px"
组合框_品类.添加项目("全部", "all")
组合框_品类.添加项目("电子产品", "elec")
组合框_品类.添加项目("家居用品", "home")
组合框_品类.添加项目("图书文具", "book")
组合框_品类.渲染()
筛选面板.添加组件(组合框_品类)

' ========== 排序选择 ==========
变量 标签_排序 = 创建 标签()
标签_排序.文本 = "排序:"
标签_排序.字体大小 = "14px"
筛选面板.添加组件(标签_排序)

变量 组合框_排序 = 创建 组合框()
组合框_排序.宽度 = 120
组合框_排序.高度 = 32
组合框_排序.边框 = "1px solid #d9d9d9"
组合框_排序.边框圆角 = "4px"
组合框_排序.添加项目("默认", "default")
组合框_排序.添加项目("价格从低到高", "price_asc")
组合框_排序.添加项目("价格从高到低", "price_desc")
组合框_排序.添加项目("销量优先", "sales")
组合框_排序.渲染()
筛选面板.添加组件(组合框_排序)

' ========== 商品列表显示 ==========
变量 商品列表标签 = 创建 标签()
商品列表标签.左边 = 20
商品列表标签.顶边 = 80
商品列表标签.宽度 = 500
商品列表标签.文本 = "商品列表将根据筛选条件更新"
商品列表标签.字体大小 = "14px"
商品列表标签.背景颜色 = "#f5f5f5"
商品列表标签.边框圆角 = "6px"
商品列表标签.内边距 = "16px"
添加组件(商品列表标签)

' ========== 模拟商品数据 ==========
变量 模拟商品 = [
    {名称: "手机", 城市: "BJ", 品类: "elec", 价格: 2999},
    {名称: "电脑", 城市: "SH", 品类: "elec", 价格: 5999},
    {名称: "沙发", 城市: "SZ", 品类: "home", 价格: 3999},
    {名称: "小说", 城市: "BJ", 品类: "book", 价格: 39},
    {名称: "电视", 城市: "GZ", 品类: "elec", 价格: 4999},
    {名称: "床垫", 城市: "SH", 品类: "home", 价格: 2999},
    {名称: "杂志", 城市: "SZ", 品类: "book", 价格: 25}
]

' ========== 筛选函数 ==========
函数 筛选商品()
    变量 城市 = 组合框_城市.取属性值("value")
    变量 品类 = 组合框_品类.取属性值("value")
    变量 排序 = 组合框_排序.取属性值("value")
    
    ' 筛选
    变量 结果 = []
    变量循环(i = 0, 取数组成员数(模拟商品), 1)
        变量 商品 = 模拟商品[i]
        变量 匹配城市 = (城市 == "all" 或 商品.城市 == 城市)
        变量 匹配品类 = (品类 == "all" 或 商品.品类 == 品类)
        如果(匹配城市 且 匹配品类)
            添加成员(结果, 商品)
        结束 如果
    结束循环
    
    ' 排序(简化为按价格)
    如果(排序 == "price_asc")
        数组排序(结果, 真)  ' 正序
    否则 如果(排序 == "price_desc")
        数组排序(结果, 假)  ' 倒序
    结束 如果
    
    ' 更新显示
    变量 显示文本 = "找到 " + 取数组成员数(结果) + " 件商品:\n"
    变量循环(i = 0, 取数组成员数(结果), 1)
        变量 商品 = 结果[i]
        显示文本 = 显示文本 + "• " + 商品.名称 + "(¥" + 商品.价格 + ")\n"
    结束循环
    商品列表标签.文本 = 显示文本
结束 函数

' ========== 绑定筛选事件 ==========
组合框_城市.置项目被选择回调((源对象, 事件对象, 选中值, 选中文本) => {
    筛选商品()
})

组合框_品类.置项目被选择回调((源对象, 事件对象, 选中值, 选中文本) => {
    筛选商品()
})

组合框_排序.置项目被选择回调((源对象, 事件对象, 选中值, 选中文本) => {
    筛选商品()
})

' 初始化筛选
筛选商品()

属性详解

组合框除了继承自 视图 的通用属性外,本身没有定义额外的专属属性。但以下继承属性在组合框中尤为常用:

属性类型说明
宽度数值型设置下拉框宽度,建议根据选项长度合理设置
高度数值型设置下拉框高度,通常为 32px ~ 40px
字体大小文本型设置选项文字大小,建议 "14px"
边框文本型设置边框样式,如 "1px solid #d9d9d9"
边框圆角文本型设置边框圆角,建议 "4px""6px"
禁用逻辑型设为 时禁用下拉框
文本文本型获取当前选中的选项显示文本(只读)

函数详解

添加项目(文本, 值)

  • 功能: 向组合框的数据集合中添加一个选项。
  • 参数:
    • 文本:文本型,必填,显示在下拉列表中的文字。
    • :文本型,可选,选项对应的值,用于程序识别。若不传,默认与 文本 相同。
  • 返回值: 无。
  • 示例: 组合框1.添加项目("北京", "BJ")

清空()

  • 功能: 清空组合框中所有选项,并清除选中状态。
  • 返回值: 无。
  • 示例: 组合框1.清空()

渲染()

  • 功能: 将数据集合中的选项渲染到界面上(生成 <option> 元素)。在添加项目后必须调用此方法,否则选项不会出现在下拉列表中。
  • 返回值: 无。
  • 示例: 组合框1.渲染()

置项目被选择回调(回调函数)

  • 功能: 设置当用户选择(改变)选项时的回调函数。
  • 参数: 回调函数,拉姆达表达式,格式为 (源对象, 事件对象, 选中值, 选中文本) => { ... }
    • 源对象:触发的组合框组件本身。
    • 事件对象:原生事件对象。
    • 选中值:当前选中项的
    • 选中文本:当前选中项的显示文本。
  • 返回值: 无。
  • 示例:
    组合框1.置项目被选择回调((源对象, 事件, 值, 文本) => {
        调试输出("选中值:" + 值 + ",选中文本:" + 文本)
    })
    

事件说明

项目被选择(源对象, 事件对象, 选中值, 选中项文本)

  • 功能:置项目被选择回调 等效,适用于设计文件(.spldg)中定义的组件。
  • 示例:
    事件 组合框1.项目被选择(源对象, 事件对象, 选中值, 选中项文本)
        调试输出("选中:" + 选中项文本 + " / " + 选中值)
    结束 事件
    

⚠️ 注意事项

  1. 必须调用 渲染():在添加项目后,必须调用 渲染() 方法,否则下拉列表为空。添加多个项目后只需调用一次 渲染()
  2. 获取选中值的方式:推荐在回调中使用 选中值 参数,也可通过 取属性值("value") 获取当前值,或通过 文本 属性获取当前显示的文本。
  3. 设置默认选中项:可在 渲染() 之后调用 置属性值("value", "期望值") 来设置默认选中项,该值需与某选项的 匹配。
  4. 禁用状态禁用 = 真 时,下拉框不可交互,样式变灰。
  5. 选项数据存储:选项数据存储在内部数据集合中,渲染() 会将其同步到 DOM。修改数据后需重新调用 渲染() 刷新。
  6. 选项值唯一性:建议每个选项的 保持唯一,以便在回调中准确识别选中项。
  7. 清空与重新添加:调用 清空() 后,数据集合被清空,但 DOM 中的 <select> 元素仍然存在,需重新添加项目并调用 渲染()
  8. 高度设置:组合框的高度可通过 高度 属性设置,但实际下拉列表选项的高度由浏览器控制,设置过小可能导致显示不全。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档文本类组件_表单输入框 —— 配合表单使用
  • 文档列表类组件_列表框 —— 类似的选择类组件
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、数组操作等
  • 文档综合演示:商品筛选面板 —— 实际应用示例

组件:表格

表格组件用于以二维表格形式展示结构化数据,支持设置表头、添加/删除/更新行、获取行数据等操作,是数据管理、报表展示、后台列表等场景的常用组件。表格基于 HTML <table> 元素封装,具有清晰的列结构,便于阅读和操作。

典型使用场景:

  • 数据列表展示(用户列表、订单列表、商品列表)
  • 后台管理系统的数据表格
  • 报表数据呈现(统计报表、财务报表)
  • 简单数据录入与编辑(配合表单使用)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置表头(列标题)置表头(...表头数组)表格1.置表头("编号", "姓名", "年龄")
添加一行数据添加一行(...行数据数组)表格1.添加一行(1, "张三", 25)
删除指定行删除行(行索引)表格1.删除行(0)
更新指定行更新行(行索引, ...行数据数组)表格1.更新行(1, 2, "李四", 29)
获取指定行数据取一行(行索引)变量 行 = 表格1.取一行(0)
获取所有行数据取项目集合()变量 全部 = 表格1.取项目集合()
清空所有数据清空()表格1.清空()

样式美化参考

表格的样式主要通过继承的视图属性进行调整:

  • 整体容器:通过 宽度高度背景颜色边框边框圆角 等属性美化表格外观。建议边框圆角设置为 "8px" 以获得圆润效果。
  • 表头样式:表头默认会加粗并具有浅灰色背景,可通过添加 CSS 类或内联样式自定义(如 置内联样式("background-color", "#fafafa"))。
  • 单元格样式:表格内单元格的边框、内边距等可通过 CSS 类统一控制。若需调整字体大小、颜色,可使用继承的 字体大小文本颜色 等属性,但需注意这些属性作用于整个表格,如需精细化控制,建议使用 CSS 样式表。
  • 斑马纹效果:可通过 CSS 类实现隔行变色,增强可读性。
  • 滚动支持:当表格内容超出容器高度时,可在外层包裹 垂直滚动框 实现滚动。

CSS 美化示例(在项目 CSS 文件中定义):

/* 表格整体 */
.my-table {
    border-collapse: collapse;
    width: 100%;
    font-size: 14px;
}
.my-table th {
    background-color: #f5f5f5;
    font-weight: bold;
    padding: 12px 16px;
    text-align: left;
    border-bottom: 2px solid #e8e8e8;
}
.my-table td {
    padding: 10px 16px;
    border-bottom: 1px solid #e8e8e8;
}
/* 斑马纹 */
.my-table tbody tr:nth-child(even) {
    background-color: #fafafa;
}
.my-table tbody tr:hover {
    background-color: #e6f7ff;
}

在轻语言代码中应用样式类:

表格1.添加样式类("my-table")

基础示例

创建一个简单的用户信息表格,包含编号、姓名、年龄三列,并填充三行数据。

变量 表格1 = 创建 表格()
表格1.左边 = 50
表格1.顶边 = 50
表格1.宽度 = 400
表格1.边框圆角 = "8px"
表格1.边框 = "1px solid #d9d9d9"

' 设置表头
表格1.置表头("编号", "姓名", "年龄")

' 添加数据行
表格1.添加一行(1, "张三", 25)
表格1.添加一行(2, "李四", 28)
表格1.添加一行(3, "王五", 30)

' 获取第一行姓名并输出
变量 第一行 = 表格1.取一行(0)
调试输出("第一行姓名:" + 第一行[1])

添加组件(表格1)

综合示例:订单管理表格

本示例展示一个包含订单编号、客户、金额、状态、操作按钮的完整表格,并演示添加、删除、更新行的操作。

' ========== 创建表格 ==========
变量 表格_订单 = 创建 表格()
表格_订单.左边 = 20
表格_订单.顶边 = 20
表格_订单.宽度 = 700
表格_订单.边框圆角 = "8px"
表格_订单.边框 = "1px solid #e8e8e8"
表格_订单.添加样式类("order-table")  ' 需在 CSS 中定义样式
添加组件(表格_订单)

' 设置表头(列标题)
表格_订单.置表头("订单编号", "客户", "金额(元)", "状态", "操作")

' ========== 添加初始数据 ==========
变量 初始数据 = [
    [1001, "张三", 299.00, "待付款"],
    [1002, "李四", 188.50, "已发货"],
    [1003, "王五", 520.00, "已完成"],
    [1004, "赵六", 76.00, "待付款"]
]
变量循环(i = 0, 取数组成员数(初始数据), 1)
    变量 行 = 初始数据[i]
    表格_订单.添加一行(行[0], 行[1], 行[2], 行[3], "查看 | 删除")
结束循环

' ========== 创建操作面板 ==========
变量 面板 = 创建 弹性布局()
面板.方向 = "row"
面板.左边 = 20
面板.顶边 = 250
面板.宽度 = 700
面板.间距 = 16
添加组件(面板)

' 输入框:编号
变量 输入_编号 = 创建 单行输入框()
输入_编号.宽度 = 100
输入_编号.提示文本 = "编号"
面板.添加组件(输入_编号)

' 输入框:客户
变量 输入_客户 = 创建 单行输入框()
输入_客户.宽度 = 120
输入_客户.提示文本 = "客户"
面板.添加组件(输入_客户)

' 输入框:金额
变量 输入_金额 = 创建 单行输入框()
输入_金额.宽度 = 100
输入_金额.提示文本 = "金额"
面板.添加组件(输入_金额)

' 下拉框:状态
变量 下拉_状态 = 创建 组合框()
下拉_状态.宽度 = 110
下拉_状态.添加项目("待付款", "pending")
下拉_状态.添加项目("已发货", "shipped")
下拉_状态.添加项目("已完成", "done")
下拉_状态.渲染()
面板.添加组件(下拉_状态)

' 添加按钮
变量 按钮_添加 = 创建 按钮()
按钮_添加.文本 = "添加行"
按钮_添加.背景颜色 = "#1890ff"
按钮_添加.文本颜色 = "#ffffff"
按钮_添加.边框圆角 = "6px"
按钮_添加.宽度 = 90
面板.添加组件(按钮_添加)

' 删除按钮(删除最后一行)
变量 按钮_删除 = 创建 按钮()
按钮_删除.文本 = "删除最后行"
按钮_删除.背景颜色 = "#ff4d4f"
按钮_删除.文本颜色 = "#ffffff"
按钮_删除.边框圆角 = "6px"
按钮_删除.宽度 = 100
面板.添加组件(按钮_删除)

' ========== 业务逻辑 ==========
' 添加行
按钮_添加.置被单击回调((源对象, 事件对象) => {
    变量 编号 = 到整数(输入_编号.内容)
    变量 客户 = 输入_客户.内容
    变量 金额 = 到小数(输入_金额.内容)
    变量 状态文本 = ""
    变量 选中值 = 下拉_状态.取选中值()
    如果(选中值 == "pending")
        状态文本 = "待付款"
    否则 如果(选中值 == "shipped")
        状态文本 = "已发货"
    否则
        状态文本 = "已完成"
    结束 如果
    
    如果(编号 <= 0 或 客户 == "" 或 金额 <= 0)
        弹出提示("请完整填写所有字段")
        返回
    结束 如果
    
    表格_订单.添加一行(编号, 客户, 金额, 状态文本, "查看 | 删除")
    弹出提示("添加成功")
    
    ' 清空输入
    输入_编号.内容 = ""
    输入_客户.内容 = ""
    输入_金额.内容 = ""
})

' 删除最后一行
按钮_删除.置被单击回调((源对象, 事件对象) => {
    变量 总数 = 取数组成员数(表格_订单.取项目集合())
    如果(总数 > 0)
        表格_订单.删除行(总数 - 1)
        弹出提示("已删除最后一行")
    否则
        弹出提示("表格已为空")
    结束 如果
})

函数详解

置表头(...表头数组)

  • 功能: 设置表格的列标题。每列标题对应表格的一列,后续添加的行数据必须与表头数量一致。
  • 参数: 可变参数,每个参数为一个文本型字符串,表示列标题。
  • 返回值: 无。
  • 示例: 表格1.置表头("列1", "列2", "列3")

添加一行(...行数据数组)

  • 功能: 向表格末尾添加一行数据。
  • 参数: 可变参数,每个参数对应一列的值,数量必须与表头列数一致。支持任意数据类型(数值、文本、布尔值等)。
  • 返回值: 无。
  • 示例: 表格1.添加一行(1001, "张三", 25)

删除行(行索引)

  • 功能: 删除指定索引的行。
  • 参数: 行索引(数值型),从 0 开始。
  • 返回值: 无。
  • 示例: 表格1.删除行(0) 删除第一行

更新行(行索引, ...行数据数组)

  • 功能: 更新指定索引行的数据。
  • 参数: 行索引(数值型),后跟可变数量的列值,数量需与表头列数一致。
  • 返回值: 无。
  • 示例: 表格1.更新行(1, 1002, "李四", 26) 将第二行更新为新数据

取一行(行索引)

  • 功能: 获取指定索引行的数据。
  • 参数: 行索引(数值型),从 0 开始。
  • 返回值: 数组,包含该行所有列的值。若索引无效则返回
  • 示例:
    变量 行 = 表格1.取一行(0)
    如果(行 != 空)
        调试输出("第一列值:" + 行[0])
    结束 如果
    

取项目集合()

  • 功能: 获取表格中所有行数据。
  • 返回值: 二维数组,每个元素为一行数据(数组)。
  • 示例:
    变量 全部数据 = 表格1.取项目集合()
    调试输出("总行数:" + 取数组成员数(全部数据))
    

清空()

  • 功能: 清空表格中所有数据(包括表头?注意:表头不会被清空,仅清空数据行)。
  • 返回值: 无。
  • 示例: 表格1.清空()

⚠️ 注意事项

  1. 表头与数据列数必须一致置表头 设置的列数必须与 添加一行更新行 传入的列值数量相同,否则可能导致显示异常或报错。
  2. 行索引从 0 开始:所有行索引均从 0 开始,与数组索引一致。
  3. 表格高度未设置时自适应:若不设置 高度,表格高度会随数据行数自动撑开,可能超出容器。建议设置固定 高度 并结合滚动容器使用。
  4. 数据更新后需重新渲染? 表格组件在调用 添加一行更新行删除行 等操作后,会自动更新界面,无需手动调用 渲染(与 列表框 不同)。
  5. 表头保留清空() 只会清除数据行,表头依然存在。如需重新设置表头,可再次调用 置表头
  6. 单元格内容支持任意类型:数值、文本、布尔值均可自动转为字符串显示。如需显示 HTML 内容,可考虑使用 InnerHTML 或自定义渲染(当前组件不支持直接渲染组件,仅支持文本)。
  7. 操作列:若需要操作按钮(如“编辑”、“删除”),可将按钮文本作为列值传入,然后通过 CSS 样式美化按钮样式。但点击事件需通过原生 DOM 绑定实现(或在外层捕获点击后根据行列判断)。
  8. 样式定制:表格组件未提供直接的方法设置单元格样式,需通过 CSS 类或内联样式修改。建议在项目 CSS 文件中定义表格样式类,并通过 添加样式类 应用。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档列表类组件_组合框 —— 下拉选择组件,配合表格使用
  • 文档文本类组件_单行输入框 —— 配合表格输入数据
  • 文档列表类组件_列表框 —— 类似的数据驱动列表组件
  • 文档轻语言网站:轻语言语法速查 —— 数组操作、循环语句等
  • 文档综合演示:订单管理表格 —— 实际应用示例

组件:相机

相机组件用于调用设备摄像头进行拍照和录像,支持实时预览、拍照、开始/停止录像、保存文件以及释放资源等操作。它适用于头像上传、身份验证、视频录制、扫码识别等需要调用摄像头的场景。注意: 该组件为可视组件,但实际显示依赖于其关联的 视频播放器画布 组件,需要将相机实例与预览组件关联后才能看到画面。

典型使用场景:

  • 用户头像拍摄与上传(社交应用、个人资料)
  • 身份验证(人脸识别、证件拍照)
  • 视频录制(短视频、教学视频)
  • 二维码/条形码扫描(配合扫码库)
  • 实时视频预览(视频聊天、监控)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


快速索引

你想知道什么直接看这里
如何设置视频预览视频播放器 属性
如何初始化摄像头初始化()
如何拍照拍照()
如何保存照片到本地保存文件(文件名前缀)
如何开始录像开始录像()
如何停止录像并获取视频停止录像()
如何停止所有操作停止所有操作()
如何释放摄像头资源关闭()

⚠️ 使用前提

  1. 用户授权:使用摄像头需要用户明确授权,浏览器会在调用 初始化() 时弹出权限请求弹窗。若用户拒绝授权,摄像头无法开启。
  2. HTTPS 环境:摄像头访问要求在安全上下文(HTTPS)或 localhost 下使用,否则 API 会被拒绝。
  3. 设备支持:请确保设备具有摄像头硬件且驱动正常(PC 端通常需外接摄像头)。
  4. 预览关联:相机本身不直接显示画面,需将 视频播放器 属性设置为一个 视频播放器 组件的实例,用于显示摄像头画面。

生命周期流程

相机的使用通常遵循以下流程:

创建实例 → 设置预览组件 → 初始化(请求权限)→ 拍照 / 开始录像 → 停止录像 / 保存照片 → 关闭(释放资源)

属性详解

视频播放器

  • 类型: 对象视频播放器 组件实例或原生 <video> 元素)
  • 说明: 设置用于显示摄像头实时预览画面的视频播放器组件。必须在调用 初始化() 之前设置此属性,否则无法看到画面。
  • 示例:
    相机1.视频播放器 = 预览视频组件
    

画布

  • 类型: 对象画板 组件实例或原生 <canvas> 元素)
  • 说明: 设置用于拍照时绘制画面的画布组件。如果未设置,拍照时系统会自动创建一个临时画布。通常配合拍照功能使用,可在画布上叠加 UI 元素或对照片做进一步处理。
  • 示例:
    相机1.画布 = 画板1
    

常用操作速查

操作属性/方法示例
关联预览组件视频播放器相机1.视频播放器 = 预览组件
初始化摄像头初始化()相机1.初始化()
拍摄照片拍照()相机1.拍照()
保存照片到本地保存文件(文件名前缀)相机1.保存文件("头像")
开始录像开始录像()相机1.开始录像()
停止录像并获取视频停止录像()变量 视频 = 相机1.停止录像()
停止所有操作停止所有操作()相机1.停止所有操作()
关闭摄像头释放资源关闭()相机1.关闭()

基础示例

最简单的相机使用流程:创建相机 → 关联预览 → 初始化 → 拍照。

' 1. 创建预览视频组件
变量 预览器 = 创建 视频播放器()
预览器.左边 = 50
预览器.顶边 = 50
预览器.视频宽度 = 480
预览器.视频高度 = 360
预览器.边框 = "1px solid #d9d9d9"
预览器.边框圆角 = "8px"
添加组件(预览器)

' 2. 创建相机并关联预览
变量 相机1 = 创建 相机()
相机1.视频播放器 = 预览器

' 3. 初始化摄像头
相机1.初始化()

' 4. 等待2秒后拍照(给用户调整姿势的时间)
延时执行(() => {
    相机1.拍照()
    弹出提示("拍照完成")
    ' 5. 保存照片到本地(下载)
    相机1.保存文件("我的照片")
}, 2000)

综合示例:头像拍照与上传

本示例构建一个完整的头像拍照界面,包含摄像头预览、拍照按钮、拍照预览、重拍和上传功能。

' ========== 创建UI布局 ==========
' 标题
变量 标题 = 创建 标签()
标题.左边 = 30
标题.顶边 = 20
标题.文本 = "📷 拍摄头像"
标题.字体大小 = "20px"
标题.字体粗细 = "bold"
添加组件(标题)

' 提示标签
变量 提示标签 = 创建 标签()
提示标签.左边 = 30
提示标签.顶边 = 55
提示标签.文本 = "请将面部置于框内,点击拍照"
提示标签.字体大小 = "14px"
提示标签.文本颜色 = "#999"
添加组件(提示标签)

' 预览视频组件(摄像头实时画面)
变量 预览器 = 创建 视频播放器()
预览器.左边 = 30
预览器.顶边 = 85
预览器.视频宽度 = 480
预览器.视频高度 = 360
预览器.边框 = "2px solid #d9d9d9"
预览器.边框圆角 = "8px"
预览器.背景颜色 = "#000"
添加组件(预览器)

' 拍照按钮
变量 拍照按钮 = 创建 按钮()
拍照按钮.左边 = 30
拍照按钮.顶边 = 460
拍照按钮.宽度 = 120
拍照按钮.高度 = 44
拍照按钮.文本 = "📸 拍照"
拍照按钮.背景颜色 = "#1890ff"
拍照按钮.文本颜色 = "#ffffff"
拍照按钮.字体大小 = "16px"
拍照按钮.边框圆角 = "6px"
添加组件(拍照按钮)

' 重拍按钮(初始禁用)
变量 重拍按钮 = 创建 按钮()
重拍按钮.左边 = 170
重拍按钮.顶边 = 460
重拍按钮.宽度 = 120
重拍按钮.高度 = 44
重拍按钮.文本 = "🔄 重拍"
重拍按钮.背景颜色 = "#d9d9d9"
重拍按钮.文本颜色 = "#666"
重拍按钮.字体大小 = "16px"
重拍按钮.边框圆角 = "6px"
重拍按钮.禁用 = 真
添加组件(重拍按钮)

' 上传按钮(初始禁用)
变量 上传按钮 = 创建 按钮()
上传按钮.左边 = 310
上传按钮.顶边 = 460
上传按钮.宽度 = 120
上传按钮.高度 = 44
上传按钮.文本 = "⬆ 上传"
上传按钮.背景颜色 = "#52c41a"
上传按钮.文本颜色 = "#ffffff"
上传按钮.字体大小 = "16px"
上传按钮.边框圆角 = "6px"
上传按钮.禁用 = 真
添加组件(重拍按钮)

' 照片预览标签(拍照后显示)
变量 照片预览标签 = 创建 标签()
照片预览标签.左边 = 540
照片预览标签.顶边 = 85
照片预览标签.宽度 = 200
照片预览标签.高度 = 360
照片预览标签.背景颜色 = "#f5f5f5"
照片预览标签.边框 = "1px dashed #d9d9d9"
照片预览标签.边框圆角 = "8px"
照片预览标签.文本 = "照片预览区"
照片预览标签.文本颜色 = "#ccc"
照片预览标签.字体大小 = "14px"
照片预览标签.内容水平对齐 = "center"
' 垂直居中使用内边距模拟
添加组件(照片预览标签)

' ========== 业务逻辑 ==========
变量 相机 = 创建 相机()
变量 已拍照 = 假
变量 当前照片URL = ""

' 关联预览
相机.视频播放器 = 预览器

' 初始化摄像头
相机.初始化()

' ========== 拍照 ==========
拍照按钮.置被单击回调((源对象, 事件对象) => {
    如果(已拍照)
        弹出提示("已经拍过照了,请点击重拍")
        返回
    结束 如果
    
    相机.拍照()
    已拍照 = 真
    
    ' 获取照片数据并显示(由于相机没有直接返回照片数据的方法,我们使用保存文件后读取)
    ' 实际项目中可通过 Canvas 获取图片数据,这里简化流程
    相机.保存文件("头像照片")
    
    拍照按钮.禁用 = 真
    重拍按钮.禁用 = 假
    上传按钮.禁用 = 假
    提示标签.文本 = "✅ 拍照完成,可预览或上传"
    提示标签.文本颜色 = "#52c41a"
    
    ' 模拟在预览区显示照片(实际需通过文件读取或 Canvas 获取)
    照片预览标签.文本 = "📸 照片已拍摄\n点击重拍可重新拍摄"
    照片预览标签.文本颜色 = "#333"
    照片预览标签.字体大小 = "16px"
})

' ========== 重拍 ==========
重拍按钮.置被单击回调((源对象, 事件对象) => {
    已拍照 = 假
    
    拍照按钮.禁用 = 假
    重拍按钮.禁用 = 真
    上传按钮.禁用 = 真
    提示标签.文本 = "请重新拍照"
    提示标签.文本颜色 = "#999"
    照片预览标签.文本 = "照片预览区"
    照片预览标签.文本颜色 = "#ccc"
    照片预览标签.字体大小 = "14px"
    
    ' 清除上次保存的照片(模拟)
    弹出提示("已重置,可以重新拍照")
})

' ========== 上传 ==========
上传按钮.置被单击回调((源对象, 事件对象) => {
    如果(!已拍照)
        弹出提示("请先拍照")
        返回
    结束 如果
    
    上传按钮.禁用 = 真
    上传按钮.文本 = "上传中..."
    提示标签.文本 = "⏳ 正在上传..."
    提示标签.文本颜色 = "#faad14"
    
    ' 模拟上传过程
    延时执行(() => {
        上传按钮.禁用 = 假
        上传按钮.文本 = "⬆ 上传"
        提示标签.文本 = "✅ 上传成功!"
        提示标签.文本颜色 = "#52c41a"
        弹出提示("头像上传成功")
        
        ' 关闭摄像头(可选)
        相机.停止所有操作()
        相机.关闭()
        预览器.视频地址 = ""  ' 清空预览
    }, 2000)
})

' ========== 页面关闭时释放资源 ==========
事件 页面被关闭()
    相机.关闭()
结束 事件

函数详解

初始化()

  • 功能: 初始化摄像头,请求用户授权并开始预览画面。必须在关联 视频播放器 后调用。
  • 返回值: 无(操作结果通过预览组件的状态体现)。
  • 示例: 相机1.初始化()

拍照()

  • 功能: 从摄像头当前帧捕获一张照片。拍照后,照片数据可以通过 保存文件() 持久化,或通过关联的 画布 组件获取。
  • 返回值: 无。
  • 示例: 相机1.拍照()

保存文件(文件名前缀)

  • 功能: 将最近一次拍摄的照片保存为文件(触发浏览器下载)。文件名会自动追加时间戳以避免重名。
  • 参数: 文件名前缀(文本型),用于生成下载文件名的前缀。
  • 返回值: 无。
  • 示例: 相机1.保存文件("我的照片") → 下载文件如 我的照片_20240815123045.jpg

开始录像()

  • 功能: 开始录制视频。录制过程中摄像头持续工作,画面仍在预览组件中显示。
  • 返回值: 无。
  • 示例: 相机1.开始录像()

停止录像()

  • 功能: 停止当前的录像操作,并返回录制的视频数据(Blob 对象)。
  • 返回值: Blob 对象,若无有效录像则返回
  • 示例:
    变量 视频Blob = 相机1.停止录像()
    如果(视频Blob != 空)
        调试输出("录像大小:" + 取数组成员数(视频Blob) + " 字节")
    结束 如果
    

停止所有操作()

  • 功能: 停止所有正在进行的操作(包括拍照、录像、预览等),但保留摄像头连接。通常用于暂停或重置状态。
  • 返回值: 无。
  • 示例: 相机1.停止所有操作()

关闭()

  • 功能: 关闭摄像头并释放所有相关资源(包括视频流、内存等)。建议在不需要使用相机时调用,以释放设备资源。
  • 返回值: 无。
  • 示例: 相机1.关闭()

⚠️ 注意事项

  1. 必须先关联预览组件:在调用 初始化() 之前,必须将 视频播放器 属性设置为一个有效的视频播放器组件实例,否则无法看到摄像头画面。
  2. 用户授权初始化() 会触发浏览器权限请求,用户允许后方可使用。若用户拒绝,摄像头无法开启,后续操作均无效。
  3. HTTPS 要求:摄像头 API 仅在 HTTPS 或 localhost 下可用,非安全环境会报错。
  4. 拍照与录像互斥:拍照和录像不能同时进行。拍照时如果正在录像,需要先停止录像;反之亦然。
  5. 保存文件的行为保存文件() 会触发浏览器的下载动作,文件名由 文件名前缀 + 时间戳 + .jpg(拍照)或 .webm(录像)组成。
  6. 停止录像返回值停止录像() 返回的是 Blob 对象,可用于上传或本地播放。返回值类型为 Blob,可通过 取数据类型() 检查。
  7. 资源释放:调用 关闭() 后,摄像头被释放,如需再次使用需重新调用 初始化()
  8. 拍照后照片预览:相机组件不直接返回照片数据,但可通过关联 画布 组件捕获照片数据,或在 保存文件() 后通过文件读取方式获取。
  9. 视频录制格式:录制的视频格式通常为 WebM(浏览器默认),可通过 MIME 类型判断。
  10. 设备切换:如需切换前后摄像头,目前相机组件未提供直接方法,可考虑在初始化前通过浏览器原生 API 获取设备列表并选择。

相关文档

  • 文档媒体类组件_视频播放器 —— 用于预览摄像头画面
  • 文档媒体类组件_录音机 —— 音频录制相关操作
  • 文档图像类组件_画板 —— 配合拍照的 Canvas 操作
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、延时执行等
  • 文档综合演示:头像拍照上传 —— 实际应用示例

组件:录音机

录音机组件用于调用设备麦克风进行音频录制和播放,支持初始化、开始/停止录制、播放已录制的音频、获取音频数据(Blob 对象或 URL)以及释放资源等操作。它适用于语音消息、语音笔记、音频录制等需要采集声音的场景。注意: 该组件为不可视组件,不继承自 视图 类,因此不包含视图相关的属性和事件,仅提供一系列方法用于控制录音流程。

典型使用场景:

  • 语音消息(即时通讯、聊天应用)
  • 语音笔记(备忘录、录音记录)
  • 语音输入(语音转文字的前置步骤)
  • 音频录制工具(播客、采访录音)

快速索引

你想知道什么直接看这里
如何初始化录音机初始化(回调函数)
如何开始录音开始录制()
如何停止录音停止录制()
如何播放录制的音频播放音频()
如何获取录音数据获取音频() / 获取音频URL()
如何检查是否正在录音正在录制()
如何释放资源销毁()

⚠️ 使用前提

  1. 用户授权:录音需要用户明确授权,浏览器会在首次调用 初始化 时弹出权限请求弹窗。若用户拒绝授权,初始化回调会返回失败。
  2. HTTPS 环境:录音功能要求在安全上下文(HTTPS)或 localhost 下使用,否则可能无法正常工作。
  3. 设备支持:请确保设备具有麦克风硬件且驱动正常。

生命周期流程

录音机的使用通常遵循以下流程:

创建实例 → 初始化(请求权限)→ 开始录制 → 停止录制 → 播放/获取音频 → 销毁(释放资源)

基础示例

最简单的录音流程:初始化、开始录制、等待几秒后停止并播放。

变量 录音机1 = 创建 录音机()

' 1. 初始化(请求麦克风权限)
录音机1.初始化((初始化结果, 错误信息) => {
    如果(初始化结果)
        调试输出("初始化成功,开始录音...")
        ' 2. 开始录制
        变量 开始结果 = 录音机1.开始录制()
        如果(开始结果)
            调试输出("录音已开始")
            ' 3. 模拟录制3秒后停止
            延时执行(() => {
                录音机1.停止录制()
                调试输出("录音已停止")
                ' 4. 播放录音
                录音机1.播放音频()
            }, 3000)
        否则
            调试输出("开始录制失败")
        结束 如果
    否则
        调试输出("初始化失败:" + 错误信息)
    结束 如果
})

综合示例:语音消息录制器

本示例构建一个完整的语音消息录制界面,包含开始/停止录制、播放录音、显示录制时长以及获取音频数据等功能。

' ========== 创建UI控件 ==========
' 状态标签
变量 状态标签 = 创建 标签()
状态标签.左边 = 30
状态标签.顶边 = 30
状态标签.文本 = "⏹ 准备就绪"
状态标签.字体大小 = "16px"
状态标签.文本颜色 = "#666"
添加组件(状态标签)

' 计时标签
变量 计时标签 = 创建 标签()
计时标签.左边 = 30
计时标签.顶边 = 70
计时标签.文本 = "00:00"
计时标签.字体大小 = "24px"
计时标签.字体粗细 = "bold"
计时标签.文本颜色 = "#1890ff"
添加组件(计时标签)

' 开始录音按钮
变量 开始按钮 = 创建 按钮()
开始按钮.左边 = 30
开始按钮.顶边 = 120
开始按钮.宽度 = 100
开始按钮.高度 = 40
开始按钮.文本 = "🎤 开始录音"
开始按钮.背景颜色 = "#1890ff"
开始按钮.文本颜色 = "#ffffff"
开始按钮.边框圆角 = "6px"
开始按钮.字体大小 = "14px"
添加组件(开始按钮)

' 停止录音按钮
变量 停止按钮 = 创建 按钮()
停止按钮.左边 = 150
停止按钮.顶边 = 120
停止按钮.宽度 = 100
停止按钮.高度 = 40
停止按钮.文本 = "⏹ 停止录音"
停止按钮.背景颜色 = "#ff4d4f"
停止按钮.文本颜色 = "#ffffff"
停止按钮.边框圆角 = "6px"
停止按钮.字体大小 = "14px"
停止按钮.禁用 = 真  ' 初始禁用
添加组件(停止按钮)

' 播放录音按钮
变量 播放按钮 = 创建 按钮()
播放按钮.左边 = 270
播放按钮.顶边 = 120
播放按钮.宽度 = 100
播放按钮.高度 = 40
播放按钮.文本 = "▶ 播放"
播放按钮.背景颜色 = "#52c41a"
播放按钮.文本颜色 = "#ffffff"
播放按钮.边框圆角 = "6px"
播放按钮.字体大小 = "14px"
播放按钮.禁用 = 真  ' 初始禁用
添加组件(播放按钮)

' 获取音频按钮(演示获取Blob)
变量 获取按钮 = 创建 按钮()
获取按钮.左边 = 390
获取按钮.顶边 = 120
获取按钮.宽度 = 100
获取按钮.高度 = 40
获取按钮.文本 = "📥 获取数据"
获取按钮.背景颜色 = "#faad14"
获取按钮.文本颜色 = "#ffffff"
获取按钮.边框圆角 = "6px"
获取按钮.字体大小 = "14px"
获取按钮.禁用 = 真
添加组件(获取按钮)

' ========== 业务逻辑 ==========
变量 录音机 = 创建 录音机()
变量 计时秒数 = 0
变量 计时器ID = 空

' 更新计时器显示
函数 更新计时显示()
    变量 分钟 = 向下取整(计时秒数 / 60)
    变量 秒 = 计时秒数 - 分钟 * 60
    变量 分钟文本 = 分钟 < 10 ? "0" + 分钟 : "" + 分钟
    变量 秒文本 = 秒 < 10 ? "0" + 秒 : "" + 秒
    计时标签.文本 = 分钟文本 + ":" + 秒文本
结束 函数

' 开始录音
开始按钮.置被单击回调((源对象, 事件对象) => {
    ' 初始化(如果尚未初始化)
    录音机.初始化((初始化结果, 错误信息) => {
        如果(初始化结果)
            变量 开始结果 = 录音机.开始录制()
            如果(开始结果)
                状态标签.文本 = "🔴 录音中..."
                状态标签.文本颜色 = "#ff4d4f"
                开始按钮.禁用 = 真
                停止按钮.禁用 = 假
                播放按钮.禁用 = 真
                获取按钮.禁用 = 真
                计时秒数 = 0
                更新计时显示()
                ' 启动计时器
                如果(计时器ID != 空)
                    销毁时钟(计时器ID)
                结束 如果
                计时器ID = 创建时钟(() => {
                    计时秒数 = 计时秒数 + 1
                    更新计时显示()
                }, 1000)
            否则
                状态标签.文本 = "❌ 开始录制失败"
            结束 如果
        否则
            状态标签.文本 = "❌ 初始化失败:" + 错误信息
        结束 如果
    })
})

' 停止录音
停止按钮.置被单击回调((源对象, 事件对象) => {
    ' 停止计时
    如果(计时器ID != 空)
        销毁时钟(计时器ID)
        计时器ID = 空
    结束 如果
    录音机.停止录制()
    状态标签.文本 = "⏹ 录音已停止(" + 计时标签.文本 + ")"
    状态标签.文本颜色 = "#666"
    开始按钮.禁用 = 假
    停止按钮.禁用 = 真
    播放按钮.禁用 = 假
    获取按钮.禁用 = 假
})

' 播放录音
播放按钮.置被单击回调((源对象, 事件对象) => {
    变量 播放结果 = 录音机.播放音频()
    如果(播放结果)
        状态标签.文本 = "🔊 播放中..."
        状态标签.文本颜色 = "#52c41a"
        播放按钮.禁用 = 真
        ' 模拟播放结束(实际可通过播放完毕事件,但录音机未提供,故延时恢复)
        延时执行(() => {
            状态标签.文本 = "⏹ 播放完成"
            状态标签.文本颜色 = "#666"
            播放按钮.禁用 = 假
        }, 3000)  ' 假设录音不超过3秒,实际可根据时长动态调整
    否则
        状态标签.文本 = "❌ 播放失败"
   结束 如果
})

' 获取音频数据
获取按钮.置被单击回调((源对象, 事件对象) => {
    变量 音频Blob = 录音机.获取音频()
    如果(音频Blob != 空)
        变量 大小KB = 四舍五入(取数组成员数(音频Blob) / 1024, 0)
        弹出提示("音频数据大小:" + 大小KB + " KB")
        ' 也可获取URL播放
        变量 url = 录音机.获取音频URL()
        调试输出("音频URL:" + url)
    否则
        弹出提示("未录制到音频数据")
    结束 如果
})

' 销毁(可选,在页面关闭时调用)
事件 页面被关闭()
    录音机.销毁()
结束 事件

函数详解

初始化(回调函数)

  • 功能: 初始化录音机,请求麦克风权限。必须在调用 开始录制() 前执行。
  • 参数: 回调函数,格式为 (初始化结果, 错误信息) => { ... }
    • 初始化结果:逻辑型, 表示成功, 表示失败。
    • 错误信息:文本型,当失败时包含错误描述。
  • 返回值: 无。
  • 示例:
    录音机1.初始化((成功, 错误) => {
        如果(成功)
            调试输出("初始化成功")
        否则
            调试输出("初始化失败:" + 错误)
        结束 如果
    })
    

开始录制()

  • 功能: 开始录制音频。必须在 初始化 成功后调用。
  • 返回值: 逻辑型, 表示开始成功, 表示失败(可能由于未初始化或设备繁忙)。
  • 示例: 变量 结果 = 录音机1.开始录制()

停止录制()

  • 功能: 停止当前正在进行的录制。停止后,录制的音频数据可被获取或播放。
  • 返回值: 逻辑型, 表示停止成功, 表示失败(如未在录制状态)。
  • 示例: 变量 结果 = 录音机1.停止录制()

播放音频()

  • 功能: 播放已录制的音频。如果未录制或录制未停止,可能导致播放失败。
  • 返回值: 逻辑型, 表示播放成功, 表示失败。
  • 示例: 变量 结果 = 录音机1.播放音频()

获取音频()

  • 功能: 获取已录制的音频数据,以 Blob 对象形式返回。可用于上传、保存等操作。
  • 返回值: Blob 对象,若无录制音频则返回
  • 示例: 变量 音频Blob = 录音机1.获取音频()

获取音频URL()

  • 功能: 获取已录制音频的临时 URL(可通过浏览器播放或下载)。该 URL 只在当前会话有效。
  • 返回值: 文本型,URL 字符串,若无录制音频则返回
  • 示例: 变量 url = 录音机1.获取音频URL()

正在录制()

  • 功能: 检查当前是否正在录制中。
  • 返回值: 逻辑型, 表示正在录制, 表示未录制。
  • 示例: 如果(录音机1.正在录制()) 调试输出("正在录音")

销毁()

  • 功能: 释放录音机占用的资源(如麦克风、音频上下文等)。建议在组件不再使用时调用,避免资源泄露。
  • 返回值: 无。
  • 示例: 录音机1.销毁()

⚠️ 注意事项

  1. 必须先初始化:任何录制操作前必须调用 初始化 并等待成功回调,否则后续操作会失败。
  2. 用户授权:浏览器会在首次初始化时弹出权限请求,用户允许后方可录制。若用户拒绝,回调返回失败。
  3. HTTPS 要求:录音功能仅在安全上下文(HTTPS)或 localhost 下可用,非安全环境会报错。
  4. 录制状态管理:建议在 UI 中同步录制状态(如禁用/启用按钮),防止用户重复点击导致冲突。
  5. 音频数据大小:录制的音频数据存储在内存中,长时间录制可能导致内存占用过大,建议控制录制时长(如不超过 5 分钟)。
  6. 播放并发:录音机不支持同时播放和录制,需停止录制后才能播放。
  7. 资源释放:调用 销毁() 后,录音机将不可再用,如需重新录音需重新创建实例。
  8. 浏览器兼容性:录音功能依赖 MediaRecorder API,现代浏览器(Chrome、Firefox、Edge)均支持,但部分旧浏览器可能不支持。
  9. 播放音频时的限制:播放音频需要浏览器允许自动播放策略,若首次播放被拦截,可先让用户点击触发播放。
  10. 获取音频URL获取音频URL() 返回的 URL 是 blob: 协议的临时地址,可用于 <audio> 标签播放,但页面刷新后失效。

相关文档

  • 文档媒体类组件_音频播放器 —— 播放音频文件
  • 文档媒体类组件_视频播放器 —— 播放视频文件
  • 文档媒体类组件_相机 —— 摄像头相关操作
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、延时执行等
  • 文档综合演示:语音消息录制器 —— 实际应用示例

组件:视频播放器

视频播放器组件用于播放视频文件,支持多种视频格式(如 MP4、WebM、AVI 等),提供了丰富的控制属性和事件回调,包括播放/暂停、音量调节、播放速度、循环播放、静音等。它适用于视频展示、视频教程、视频会议、监控回放等场景。该组件基于 HTML5 <video> 元素封装,具有良好的跨平台兼容性。

典型使用场景:

  • 在线视频播放(产品演示、宣传视频)
  • 视频教程(课程讲解、操作演示)
  • 视频会议/直播(配合摄像头使用)
  • 监控录像回放(安防系统、行车记录)
  • 视频内容预览(社交应用、视频平台)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置视频源地址视频地址视频播放器1.视频地址 = "static/demo.mp4"
设置视频尺寸视频宽度 / 视频高度视频播放器1.视频宽度 = 640
设置自动播放自动播放视频播放器1.自动播放 = 真
设置循环播放循环播放视频播放器1.循环播放 = 真
设置静音静音视频播放器1.静音 = 真
设置音量(0~1)音量视频播放器1.音量 = 0.8
设置播放速度(0.5~2)播放速度视频播放器1.播放速度 = 1.5
跳转到指定播放位置(秒)播放位置视频播放器1.播放位置 = 30
开始播放开始播放()视频播放器1.开始播放()
暂停播放暂停()视频播放器1.暂停()
停止播放并重置停止播放()视频播放器1.停止播放()
监听播放完毕置视频播放完毕回调(回调)视频播放器1.置视频播放完毕回调((事件) => { ... })
监听播放错误置视频播放出错回调(回调)视频播放器1.置视频播放出错回调((事件) => { ... })
监听播放进度置视频播放进度被改变回调(回调)视频播放器1.置视频播放进度被改变回调((事件) => { ... })

样式美化参考

视频播放器的外观主要通过继承的视图属性进行调整:

  • 整体容器:通过 宽度高度(如 640px360px)设置播放器尺寸;背景颜色边框(如 "1px solid #d9d9d9")、边框圆角(建议 "8px")美化播放器边框。
  • 视频画面:通过 视频宽度视频高度 控制视频内容的显示尺寸(若与容器尺寸不一致,视频会自动适应)。
  • 控制栏:默认由浏览器提供原生控制栏,可通过 CSS 类或 禁用 属性控制是否显示。若要隐藏原生控制栏,可设置 禁用 = 真 并自行构建控制 UI。
  • 暗色背景:建议将播放器背景颜色设置为黑色("#000"),以便视频画面更突出。

CSS 美化示例(在项目 CSS 文件中定义):

.my-video-player {
    border-radius: 8px;
    overflow: hidden;
    box-shadow: 0 4px 12px rgba(0,0,0,0.15);
    background-color: #000;
}
.my-video-player::-webkit-media-controls {
    filter: brightness(0.8);
}

在代码中应用样式类:视频播放器1.添加样式类("my-video-player")


基础示例

创建一个带有基本属性的视频播放器,加载本地视频,并设置事件监听。

变量 视频播放器1 = 创建 视频播放器()
视频播放器1.左边 = 50
视频播放器1.顶边 = 50
视频播放器1.视频宽度 = 640
视频播放器1.视频高度 = 360
视频播放器1.视频地址 = "static/demo.mp4"
视频播放器1.自动播放 = 假
视频播放器1.循环播放 = 假
视频播放器1.静音 = 假
视频播放器1.音量 = 0.8
视频播放器1.播放速度 = 1
视频播放器1.边框 = "1px solid #d9d9d9"
视频播放器1.边框圆角 = "8px"
视频播放器1.背景颜色 = "#000"

' 设置事件回调
视频播放器1.置视频播放完毕回调((事件对象) => {
    弹出提示("视频播放完毕")
})

视频播放器1.置视频播放出错回调((事件对象) => {
    弹出提示("视频播放出错,请检查文件路径")
})

' 开始播放
视频播放器1.开始播放()

添加组件(视频播放器1)

综合示例:自定义视频播放器控制栏

本示例构建一个带有自定义控制栏的视频播放器,实现播放/暂停、进度条拖动、音量控制、播放速度切换、全屏等功能,并展示各种事件回调的使用。

' ========== 创建视频播放器 ==========
变量 视频播放器1 = 创建 视频播放器()
视频播放器1.左边 = 30
视频播放器1.顶边 = 30
视频播放器1.视频宽度 = 720
视频播放器1.视频高度 = 400
视频播放器1.视频地址 = "https://www.w3schools.com/html/mov_bbb.mp4"
视频播放器1.自动播放 = 假
视频播放器1.循环播放 = 假
视频播放器1.静音 = 假
视频播放器1.音量 = 0.8
视频播放器1.播放速度 = 1
视频播放器1.边框 = "1px solid #d9d9d9"
视频播放器1.边框圆角 = "8px"
视频播放器1.背景颜色 = "#000"
添加组件(视频播放器1)

' ========== 创建自定义控制栏 ==========
变量 控制栏 = 创建 弹性布局()
控制栏.方向 = "row"
控制栏.侧轴对齐 = "center"
控制栏.左边 = 30
控制栏.顶边 = 445
控制栏.宽度 = 720
控制栏.高度 = 40
控制栏.背景颜色 = "rgba(0,0,0,0.7)"
控制栏.边框圆角 = "0px 0px 8px 8px"
控制栏.内边距 = "0 12px"
控制栏.间距 = 8
添加组件(控制栏)

' 播放/暂停按钮
变量 播放按钮 = 创建 按钮()
播放按钮.文本 = "▶"
播放按钮.宽度 = 36
播放按钮.高度 = 30
播放按钮.背景颜色 = "transparent"
播放按钮.文本颜色 = "#ffffff"
播放按钮.字体大小 = "16px"
播放按钮.边框 = "none"
播放按钮.光标样式 = "pointer"
控制栏.添加组件(播放按钮)

' 当前时间标签
变量 当前时间标签 = 创建 标签()
当前时间标签.文本 = "00:00"
当前时间标签.字体大小 = "12px"
当前时间标签.文本颜色 = "#ffffff"
控制栏.添加组件(当前时间标签)

' 进度条(使用滑块条模拟)
变量 进度条 = 创建 滑块条()
进度条.宽度 = 400
进度条.高度 = 4
进度条.最小值 = 0
进度条.最大值 = 100
进度条.步长 = 1
进度条.进度值 = 0
进度条.背景颜色 = "#555"
进度条.颜色 = "#1890ff"
控制栏.添加组件(进度条)

' 总时间标签
变量 总时间标签 = 创建 标签()
总时间标签.文本 = "00:00"
总时间标签.字体大小 = "12px"
总时间标签.文本颜色 = "#ffffff"
控制栏.添加组件(总时间标签)

' 音量控制
变量 音量按钮 = 创建 按钮()
音量按钮.文本 = "🔊"
音量按钮.宽度 = 30
音量按钮.高度 = 30
音量按钮.背景颜色 = "transparent"
音量按钮.文本颜色 = "#ffffff"
音量按钮.字体大小 = "14px"
音量按钮.边框 = "none"
音量按钮.光标样式 = "pointer"
控制栏.添加组件(音量按钮)

变量 音量滑块 = 创建 滑块条()
音量滑块.宽度 = 60
音量滑块.高度 = 4
音量滑块.最小值 = 0
音量滑块.最大值 = 100
音量滑块.步长 = 1
音量滑块.进度值 = 80
音量滑块.背景颜色 = "#555"
音量滑块.颜色 = "#1890ff"
控制栏.添加组件(音量滑块)

' 速度切换按钮
变量 速度按钮 = 创建 按钮()
速度按钮.文本 = "1.0x"
速度按钮.宽度 = 40
速度按钮.高度 = 30
速度按钮.背景颜色 = "transparent"
速度按钮.文本颜色 = "#ffffff"
速度按钮.字体大小 = "12px"
速度按钮.边框 = "none"
速度按钮.光标样式 = "pointer"
控制栏.添加组件(速度按钮)

' 全屏按钮
变量 全屏按钮 = 创建 按钮()
全屏按钮.文本 = "⛶"
全屏按钮.宽度 = 30
全屏按钮.高度 = 30
全屏按钮.背景颜色 = "transparent"
全屏按钮.文本颜色 = "#ffffff"
全屏按钮.字体大小 = "16px"
全屏按钮.边框 = "none"
全屏按钮.光标样式 = "pointer"
控制栏.添加组件(全屏按钮)

' ========== 辅助函数:时间格式化 ==========
函数 格式化时间(秒数)
    变量 分钟 = 向下取整(秒数 / 60)
    变量 秒 = 向下取整(秒数 - 分钟 * 60)
    变量 分钟文本 = 分钟 < 10 ? "0" + 分钟 : "" + 分钟
    变量 秒文本 = 秒 < 10 ? "0" + 秒 : "" + 秒
    返回 分钟文本 + ":" + 秒文本
结束 函数

' ========== 事件绑定 ==========
' 1. 视频加载完成后获取总时长
视频播放器1.置视频被加载回调((事件对象) => {
    总时间标签.文本 = 格式化时间(视频播放器1.取属性值("duration"))
    调试输出("视频加载完成,总时长:" + 总时间标签.文本)
})

' 2. 播放进度更新
视频播放器1.置视频播放进度被改变回调((事件对象) => {
    变量 当前时间 = 视频播放器1.播放位置
    变量 总时长 = 到数值(视频播放器1.取属性值("duration"))
    当前时间标签.文本 = 格式化时间(当前时间)
    如果(总时长 > 0)
        进度条.进度值 = (当前时间 / 总时长) * 100
    结束 如果
})

' 3. 播放完毕
视频播放器1.置视频播放完毕回调((事件对象) => {
    播放按钮.文本 = "▶"
    弹出提示("视频播放完毕")
})

' 4. 播放错误
视频播放器1.置视频播放出错回调((事件对象) => {
    弹出提示("视频播放出错,请检查视频文件")
})

' ========== 控制栏事件 ==========
' 播放/暂停
播放按钮.置被单击回调((源对象, 事件对象) => {
    如果(播放按钮.文本 == "▶")
        视频播放器1.开始播放()
        播放按钮.文本 = "⏸"
    否则
        视频播放器1.暂停()
        播放按钮.文本 = "▶"
    结束 如果
})

' 进度条拖动(用户手动跳转)
进度条.置滑块位置被改变回调((源对象, 当前值) => {
    变量 总时长 = 到数值(视频播放器1.取属性值("duration"))
    如果(总时长 > 0)
        视频播放器1.播放位置 = (当前值 / 100) * 总时长
    结束 如果
})

' 音量控制
音量滑块.置滑块位置被改变回调((源对象, 当前值) => {
    视频播放器1.音量 = 当前值 / 100
    如果(当前值 == 0)
        音量按钮.文本 = "🔇"
    否则 如果(当前值 < 50)
        音量按钮.文本 = "🔉"
    否则
        音量按钮.文本 = "🔊"
    结束 如果
})

' 音量按钮静音切换
音量按钮.置被单击回调((源对象, 事件对象) => {
    变量 当前音量 = 视频播放器1.音量
    如果(当前音量 > 0)
        视频播放器1.静音 = 真
        音量滑块.进度值 = 0
        音量按钮.文本 = "🔇"
    否则
        视频播放器1.静音 = 假
        视频播放器1.音量 = 0.8
        音量滑块.进度值 = 80
        音量按钮.文本 = "🔊"
    结束 如果
})

' 速度切换(循环切换)
变量 速度列表 = [0.5, 0.75, 1.0, 1.25, 1.5, 2.0]
变量 速度索引 = 2  ' 默认1.0x
速度按钮.置被单击回调((源对象, 事件对象) => {
    速度索引 = (速度索引 + 1) % 取数组成员数(速度列表)
    变量 新速度 = 速度列表[速度索引]
    视频播放器1.播放速度 = 新速度
    速度按钮.文本 = 新速度 + "x"
})

' 全屏切换
全屏按钮.置被单击回调((源对象, 事件对象) => {
    变量 原生视频 = 视频播放器1.取原生对象()
    如果(原生视频.requestFullscreen)
        原生视频.requestFullscreen()
        全屏按钮.文本 = "⛶ 退出"
    否则
        如果(document.exitFullscreen)
            document.exitFullscreen()
            全屏按钮.文本 = "⛶"
        结束 如果
    结束 如果
})

属性详解

视频地址

  • 类型: 文本型
  • 说明: 设置或获取视频文件的 URL 地址。支持相对路径、绝对路径和网络 URL。设置后会自动加载视频元数据(但不一定会开始播放)。

自动播放

  • 类型: 逻辑型
  • 说明: 设置或获取是否在加载完成后自动开始播放。默认为 注意: 部分浏览器(尤其是移动端)可能会限制自动播放策略,需要用户交互后才能播放。

循环播放

  • 类型: 逻辑型
  • 说明: 设置或获取是否在视频播放完毕后自动重新开始播放。默认为

静音

  • 类型: 逻辑型
  • 说明: 设置或获取是否将视频静音。默认为 。在自动播放受限时,设置静音可以绕过部分浏览器的自动播放限制。

视频宽度

  • 类型: 数值型
  • 说明: 设置或获取视频画面的显示宽度(像素)。注意:这是视频画面的显示尺寸,不是容器的尺寸。

视频高度

  • 类型: 数值型
  • 说明: 设置或获取视频画面的显示高度(像素)。

播放位置

  • 类型: 数值型
  • 说明: 设置或获取当前视频的播放位置(秒)。可用于跳转或获取当前进度。设置此属性会跳转到指定时间点。

音量

  • 类型: 数值型
  • 说明: 设置或获取当前音量,取值范围 0(静音)到 1(最大音量),默认 1

播放速度

  • 类型: 数值型
  • 说明: 设置或获取播放速度倍率,常用取值范围 0.52.0,默认 1.0。支持的值范围由浏览器决定。

函数详解

开始播放()

  • 功能: 开始或恢复视频播放。如果视频已处于播放状态,则无效果。
  • 返回值: 无。
  • 示例: 视频播放器1.开始播放()

暂停()

  • 功能: 暂停视频播放。如果视频已暂停,则无效果。
  • 返回值: 无。
  • 示例: 视频播放器1.暂停()

停止播放()

  • 功能: 停止视频播放,并将播放位置重置到开头。
  • 返回值: 无。
  • 示例: 视频播放器1.停止播放()

置视频被加载回调(回调函数)

  • 功能: 设置视频元数据加载完成时的回调函数。
  • 参数: 回调函数,格式为 (事件对象) => { ... }
  • 返回值: 无。

置视频播放完毕回调(回调函数)

  • 功能: 设置视频播放完毕时的回调函数。
  • 参数: 回调函数,格式为 (事件对象) => { ... }
  • 返回值: 无。

置视频播放出错回调(回调函数)

  • 功能: 设置视频播放出错时的回调函数。
  • 参数: 回调函数,格式为 (事件对象) => { ... }
  • 返回值: 无。

置视频被暂停回调(回调函数)

  • 功能: 设置视频暂停时的回调函数。
  • 参数: 回调函数,格式为 (事件对象) => { ... }
  • 返回值: 无。

置视频开始被播放回调(回调函数)

  • 功能: 设置视频开始播放时的回调函数。
  • 参数: 回调函数,格式为 (事件对象) => { ... }
  • 返回值: 无。

置视频播放进度被改变回调(回调函数)

  • 功能: 设置视频播放进度改变时的回调函数(在播放过程中持续触发)。
  • 参数: 回调函数,格式为 (事件对象) => { ... }
  • 返回值: 无。

置视频音量被改变回调(回调函数)

  • 功能: 设置音量改变时的回调函数。
  • 参数: 回调函数,格式为 (事件对象) => { ... }
  • 返回值: 无。

置视频播放速度被改变回调(回调函数)

  • 功能: 设置播放速度改变时的回调函数。
  • 参数: 回调函数,格式为 (事件对象) => { ... }
  • 返回值: 无。

事件说明

以下事件与对应的回调函数等效,适用于设计文件(.spldg)中定义的组件:

事件对应回调函数触发时机
视频被加载(事件对象)置视频被加载回调视频元数据加载完成
视频播放完毕(事件对象)置视频播放完毕回调视频播放到结尾
视频播放出错(事件对象)置视频播放出错回调播放过程中发生错误
视频被暂停(事件对象)置视频被暂停回调视频被暂停
视频开始被播放(事件对象)置视频开始被播放回调视频开始播放
视频播放进度被改变(事件对象)置视频播放进度被改变回调播放进度变化
视频音量被改变(事件对象)置视频音量被改变回调音量变化
视频播放速度被改变(事件对象)置视频播放速度被改变回调播放速度变化

⚠️ 注意事项

  1. 视频格式兼容性:不同浏览器支持的视频格式不同,建议使用 MP4(H.264/AAC)格式以获得最佳兼容性。
  2. 自动播放策略:大多数现代浏览器(尤其是移动端)要求用户在点击播放前不能自动播放有声音的视频。若需自动播放,建议设置 静音 = 真
  3. 跨域资源:如果视频地址是跨域的,服务器需要配置 CORS 头,否则可能无法正常播放。
  4. 播放位置精度播放位置 属性可设置任意数值,但实际跳转精度取决于视频编码和浏览器实现。
  5. 事件回调参数:所有视频事件回调都返回一个 事件对象 参数,其中包含事件的详细信息(如时间戳、错误代码等),可通过 取属性值 获取具体字段。
  6. 原生控制栏:默认视频播放器会显示浏览器原生控制栏(播放/暂停、进度条、音量等),如需隐藏可设置 禁用 = 真,但会同时禁用交互。
  7. 视频尺寸与容器尺寸视频宽度视频高度 控制视频画面的显示尺寸,而容器的 宽度/高度 控制播放器区域大小。两者可以不同,视频会自动适应容器(默认保持比例)。
  8. 资源释放:在页面关闭或组件销毁时,视频播放器会自动释放资源,无需手动处理。
  9. 静音与音量:设置 静音 = 真 会将音量强制设为 0,且 音量 属性会被覆盖。取消静音时,音量恢复之前的值。
  10. 取属性值("duration"):视频总时长可通过 取属性值("duration") 获取,但需要在 视频被加载 事件触发后才能获取到有效值。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档媒体类组件_音频播放器 —— 音频播放组件
  • 文档媒体类组件_相机 —— 配合摄像头使用
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、条件判断等
  • 文档综合演示:自定义视频播放器 —— 实际应用示例

组件:音频播放器

音频播放器组件用于播放音频文件,支持多种音频格式(如 MP3、WAV、AAC、OGG 等),提供了丰富的控制属性和事件回调,包括播放/暂停、音量调节、播放速度、循环播放、静音等。它适用于背景音乐、音效播放、播客、音频教学等场景。该组件基于 HTML5 <audio> 元素封装,与视频播放器功能类似但专用于音频播放。

典型使用场景:

  • 背景音乐(游戏、网站、应用)
  • 音效播放(点击反馈、通知提示)
  • 播客/有声读物(音频节目、故事讲述)
  • 语言学习(音频课程、听力练习)
  • 音乐播放器(在线音乐、本地音乐)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置音频源地址音频地址音频播放器1.音频地址 = "static/bgm.mp3"
设置自动播放自动播放音频播放器1.自动播放 = 真
设置循环播放循环播放音频播放器1.循环播放 = 真
设置静音静音音频播放器1.静音 = 真
设置音量(0~1)音量音频播放器1.音量 = 0.8
设置播放速度(0.5~2)播放速度音频播放器1.播放速度 = 1.5
跳转到指定播放位置(秒)播放位置音频播放器1.播放位置 = 30
开始播放开始播放()音频播放器1.开始播放()
暂停播放暂停()音频播放器1.暂停()
停止播放并重置停止播放()音频播放器1.停止播放()
监听播放完毕置音频播放完毕回调(回调)音频播放器1.置音频播放完毕回调((事件) => { ... })
监听播放错误置音频播放出错回调(回调)音频播放器1.置音频播放出错回调((事件) => { ... })
监听播放进度置音频播放进度被改变回调(回调)音频播放器1.置音频播放进度被改变回调((事件) => { ... })

样式美化参考

音频播放器的外观主要通过继承的视图属性进行调整:

  • 整体容器:通过 宽度高度 设置播放器尺寸;背景颜色边框(如 "1px solid #d9d9d9")、边框圆角(建议 "8px")美化播放器边框。
  • 控制栏:默认由浏览器提供原生控制栏,可通过 CSS 类或 禁用 属性控制是否显示。与视频播放器不同,音频播放器通常显示为较小的控制条。
  • 暗色背景:建议将播放器背景颜色设置为深色(如 "#2d2d2d"),以突出控制按钮。
  • 宽度自适应:音频播放器通常不需要很高的高度,建议高度设置为 48px ~ 56px

CSS 美化示例(在项目 CSS 文件中定义):

.my-audio-player {
    border-radius: 8px;
    background-color: #2d2d2d;
    padding: 4px 8px;
}
.my-audio-player::-webkit-media-controls {
    filter: brightness(0.9);
}

在代码中应用样式类:音频播放器1.添加样式类("my-audio-player")


基础示例

创建一个带有基本属性的音频播放器,加载本地音频文件,并设置事件监听。

变量 音频播放器1 = 创建 音频播放器()
音频播放器1.左边 = 50
音频播放器1.顶边 = 50
音频播放器1.宽度 = 400
音频播放器1.高度 = 48
音频播放器1.音频地址 = "static/demo.mp3"
音频播放器1.自动播放 = 假
音频播放器1.循环播放 = 假
音频播放器1.静音 = 假
音频播放器1.音量 = 0.8
音频播放器1.边框 = "1px solid #d9d9d9"
音频播放器1.边框圆角 = "8px"
音频播放器1.背景颜色 = "#2d2d2d"

' 设置事件回调
音频播放器1.置音频播放完毕回调((事件对象) => {
    弹出提示("音频播放完毕")
})

音频播放器1.置音频播放出错回调((事件对象) => {
    弹出提示("音频播放出错,请检查文件路径")
})

' 开始播放
音频播放器1.开始播放()

添加组件(音频播放器1)

综合示例:自定义音频播放器(音乐播放器)

本示例构建一个自定义音乐播放器,包含播放/暂停、进度条、音量控制、播放速度切换、循环模式切换等功能,并展示各种事件回调的使用。

' ========== 创建音频播放器 ==========
变量 音频播放器1 = 创建 音频播放器()
音频播放器1.左边 = 30
音频播放器1.顶边 = 30
音频播放器1.宽度 = 480
音频播放器1.高度 = 48
音频播放器1.音频地址 = "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3"
音频播放器1.自动播放 = 假
音频播放器1.循环播放 = 假
音频播放器1.静音 = 假
音频播放器1.音量 = 0.8
音频播放器1.播放速度 = 1
音频播放器1.边框 = "1px solid #d9d9d9"
音频播放器1.边框圆角 = "8px"
音频播放器1.背景颜色 = "#2d2d2d"
添加组件(音频播放器1)

' ========== 创建自定义控制栏 ==========
变量 控制栏 = 创建 弹性布局()
控制栏.方向 = "row"
控制栏.侧轴对齐 = "center"
控制栏.左边 = 30
控制栏.顶边 = 90
控制栏.宽度 = 480
控制栏.高度 = 36
控制栏.背景颜色 = "rgba(0,0,0,0.7)"
控制栏.边框圆角 = "0px 0px 8px 8px"
控制栏.内边距 = "0 12px"
控制栏.间距 = 6
添加组件(控制栏)

' 播放/暂停按钮
变量 播放按钮 = 创建 按钮()
播放按钮.文本 = "▶"
播放按钮.宽度 = 32
播放按钮.高度 = 28
播放按钮.背景颜色 = "transparent"
播放按钮.文本颜色 = "#ffffff"
播放按钮.字体大小 = "14px"
播放按钮.边框 = "none"
播放按钮.光标样式 = "pointer"
控制栏.添加组件(播放按钮)

' 当前时间标签
变量 当前时间标签 = 创建 标签()
当前时间标签.文本 = "00:00"
当前时间标签.字体大小 = "12px"
当前时间标签.文本颜色 = "#ffffff"
当前时间标签.宽度 = 40
控制栏.添加组件(当前时间标签)

' 进度条(使用滑块条模拟)
变量 进度条 = 创建 滑块条()
进度条.宽度 = 220
进度条.高度 = 4
进度条.最小值 = 0
进度条.最大值 = 100
进度条.步长 = 1
进度条.进度值 = 0
进度条.背景颜色 = "#555"
进度条.颜色 = "#1890ff"
控制栏.添加组件(进度条)

' 总时间标签
变量 总时间标签 = 创建 标签()
总时间标签.文本 = "00:00"
总时间标签.字体大小 = "12px"
总时间标签.文本颜色 = "#ffffff"
总时间标签.宽度 = 40
控制栏.添加组件(总时间标签)

' 音量控制
变量 音量按钮 = 创建 按钮()
音量按钮.文本 = "🔊"
音量按钮.宽度 = 26
音量按钮.高度 = 28
音量按钮.背景颜色 = "transparent"
音量按钮.文本颜色 = "#ffffff"
音量按钮.字体大小 = "12px"
音量按钮.边框 = "none"
音量按钮.光标样式 = "pointer"
控制栏.添加组件(音量按钮)

变量 音量滑块 = 创建 滑块条()
音量滑块.宽度 = 50
音量滑块.高度 = 4
音量滑块.最小值 = 0
音量滑块.最大值 = 100
音量滑块.步长 = 1
音量滑块.进度值 = 80
音量滑块.背景颜色 = "#555"
音量滑块.颜色 = "#1890ff"
控制栏.添加组件(音量滑块)

' 速度切换按钮
变量 速度按钮 = 创建 按钮()
速度按钮.文本 = "1.0x"
速度按钮.宽度 = 36
速度按钮.高度 = 28
速度按钮.背景颜色 = "transparent"
速度按钮.文本颜色 = "#ffffff"
速度按钮.字体大小 = "11px"
速度按钮.边框 = "none"
速度按钮.光标样式 = "pointer"
控制栏.添加组件(速度按钮)

' 循环模式按钮
变量 循环按钮 = 创建 按钮()
循环按钮.文本 = "🔁"
循环按钮.宽度 = 28
循环按钮.高度 = 28
循环按钮.背景颜色 = "transparent"
循环按钮.文本颜色 = "#888"
循环按钮.字体大小 = "14px"
循环按钮.边框 = "none"
循环按钮.光标样式 = "pointer"
控制栏.添加组件(循环按钮)

' ========== 歌曲标题标签 ==========
变量 标题标签 = 创建 标签()
标题标签.左边 = 30
标题标签.顶边 = 65
标题标签.文本 = "🎵 当前播放:SoundHelix 示例歌曲"
标题标签.字体大小 = "14px"
标题标签.文本颜色 = "#333"
添加组件(标题标签)

' ========== 辅助函数:时间格式化 ==========
函数 格式化时间(秒数)
    变量 分钟 = 向下取整(秒数 / 60)
    变量 秒 = 向下取整(秒数 - 分钟 * 60)
    变量 分钟文本 = 分钟 < 10 ? "0" + 分钟 : "" + 分钟
    变量 秒文本 = 秒 < 10 ? "0" + 秒 : "" + 秒
    返回 分钟文本 + ":" + 秒文本
结束 函数

' ========== 事件绑定 ==========
' 1. 音频加载完成后获取总时长
音频播放器1.置音频被加载回调((事件对象) => {
    总时间标签.文本 = 格式化时间(音频播放器1.取属性值("duration"))
    调试输出("音频加载完成,总时长:" + 总时间标签.文本)
})

' 2. 播放进度更新
音频播放器1.置音频播放进度被改变回调((事件对象) => {
    变量 当前时间 = 音频播放器1.播放位置
    变量 总时长 = 到数值(音频播放器1.取属性值("duration"))
    当前时间标签.文本 = 格式化时间(当前时间)
    如果(总时长 > 0)
        进度条.进度值 = (当前时间 / 总时长) * 100
    结束 如果
})

' 3. 播放完毕
音频播放器1.置音频播放完毕回调((事件对象) => {
    播放按钮.文本 = "▶"
    ' 如果循环模式开启,自动重新播放
    如果(循环按钮.文本 == "🔁" 且 循环按钮.文本颜色 == "#1890ff")
        音频播放器1.开始播放()
        播放按钮.文本 = "⏸"
    否则
        弹出提示("音频播放完毕")
    结束 如果
})

' 4. 播放错误
音频播放器1.置音频播放出错回调((事件对象) => {
    弹出提示("音频播放出错,请检查音频文件")
})

' ========== 控制栏事件 ==========
' 播放/暂停
播放按钮.置被单击回调((源对象, 事件对象) => {
    如果(播放按钮.文本 == "▶")
        音频播放器1.开始播放()
        播放按钮.文本 = "⏸"
    否则
        音频播放器1.暂停()
        播放按钮.文本 = "▶"
    结束 如果
})

' 进度条拖动(用户手动跳转)
进度条.置滑块位置被改变回调((源对象, 当前值) => {
    变量 总时长 = 到数值(音频播放器1.取属性值("duration"))
    如果(总时长 > 0)
        音频播放器1.播放位置 = (当前值 / 100) * 总时长
    结束 如果
})

' 音量控制
音量滑块.置滑块位置被改变回调((源对象, 当前值) => {
    音频播放器1.音量 = 当前值 / 100
    如果(当前值 == 0)
        音量按钮.文本 = "🔇"
    否则 如果(当前值 < 50)
        音量按钮.文本 = "🔉"
    否则
        音量按钮.文本 = "🔊"
    结束 如果
})

' 音量按钮静音切换
音量按钮.置被单击回调((源对象, 事件对象) => {
    变量 当前音量 = 音频播放器1.音量
    如果(当前音量 > 0)
        音频播放器1.静音 = 真
        音量滑块.进度值 = 0
        音量按钮.文本 = "🔇"
    否则
        音频播放器1.静音 = 假
        音频播放器1.音量 = 0.8
        音量滑块.进度值 = 80
        音量按钮.文本 = "🔊"
    结束 如果
})

' 速度切换(循环切换)
变量 速度列表 = [0.5, 0.75, 1.0, 1.25, 1.5, 2.0]
变量 速度索引 = 2  ' 默认1.0x
速度按钮.置被单击回调((源对象, 事件对象) => {
    速度索引 = (速度索引 + 1) % 取数组成员数(速度列表)
    变量 新速度 = 速度列表[速度索引]
    音频播放器1.播放速度 = 新速度
    速度按钮.文本 = 新速度 + "x"
})

' 循环模式切换
循环按钮.置被单击回调((源对象, 事件对象) => {
    如果(循环按钮.文本颜色 == "#888")
        循环按钮.文本颜色 = "#1890ff"
        音频播放器1.循环播放 = 真
        弹出提示("循环模式已开启")
    否则
        循环按钮.文本颜色 = "#888"
        音频播放器1.循环播放 = 假
        弹出提示("循环模式已关闭")
    结束 如果
})

属性详解

音频地址

  • 类型: 文本型
  • 说明: 设置或获取音频文件的 URL 地址。支持相对路径、绝对路径和网络 URL。设置后会自动加载音频元数据(但不一定会开始播放)。

自动播放

  • 类型: 逻辑型
  • 说明: 设置或获取是否在加载完成后自动开始播放。默认为 注意: 部分浏览器(尤其是移动端)可能会限制自动播放策略,需要用户交互后才能播放。

循环播放

  • 类型: 逻辑型
  • 说明: 设置或获取是否在音频播放完毕后自动重新开始播放。默认为

静音

  • 类型: 逻辑型
  • 说明: 设置或获取是否将音频静音。默认为 。在自动播放受限时,设置静音可以绕过部分浏览器的自动播放限制。

播放位置

  • 类型: 数值型
  • 说明: 设置或获取当前音频的播放位置(秒)。可用于跳转或获取当前进度。设置此属性会跳转到指定时间点。

音量

  • 类型: 数值型
  • 说明: 设置或获取当前音量,取值范围 0(静音)到 1(最大音量),默认 1

播放速度

  • 类型: 数值型
  • 说明: 设置或获取播放速度倍率,常用取值范围 0.52.0,默认 1.0。支持的值范围由浏览器决定。

函数详解

开始播放()

  • 功能: 开始或恢复音频播放。如果音频已处于播放状态,则无效果。
  • 返回值: 无。
  • 示例: 音频播放器1.开始播放()

暂停()

  • 功能: 暂停音频播放。如果音频已暂停,则无效果。
  • 返回值: 无。
  • 示例: 音频播放器1.暂停()

停止播放()

  • 功能: 停止音频播放,并将播放位置重置到开头。
  • 返回值: 无。
  • 示例: 音频播放器1.停止播放()

置音频被加载回调(回调函数)

  • 功能: 设置音频元数据加载完成时的回调函数。
  • 参数: 回调函数,格式为 (事件对象) => { ... }
  • 返回值: 无。

置音频播放完毕回调(回调函数)

  • 功能: 设置音频播放完毕时的回调函数。
  • 参数: 回调函数,格式为 (事件对象) => { ... }
  • 返回值: 无。

置音频播放出错回调(回调函数)

  • 功能: 设置音频播放出错时的回调函数。
  • 参数: 回调函数,格式为 (事件对象) => { ... }
  • 返回值: 无。

置音频被暂停回调(回调函数)

  • 功能: 设置音频暂停时的回调函数。
  • 参数: 回调函数,格式为 (事件对象) => { ... }
  • 返回值: 无。

置音频开始被播放回调(回调函数)

  • 功能: 设置音频开始播放时的回调函数。
  • 参数: 回调函数,格式为 (事件对象) => { ... }
  • 返回值: 无。

置音频播放进度被改变回调(回调函数)

  • 功能: 设置音频播放进度改变时的回调函数(在播放过程中持续触发)。
  • 参数: 回调函数,格式为 (事件对象) => { ... }
  • 返回值: 无。

置音频音量被改变回调(回调函数)

  • 功能: 设置音量改变时的回调函数。
  • 参数: 回调函数,格式为 (事件对象) => { ... }
  • 返回值: 无。

置音频播放速度被改变回调(回调函数)

  • 功能: 设置播放速度改变时的回调函数。
  • 参数: 回调函数,格式为 (事件对象) => { ... }
  • 返回值: 无。

事件说明

以下事件与对应的回调函数等效,适用于设计文件(.spldg)中定义的组件:

事件对应回调函数触发时机
音频被加载(事件对象)置音频被加载回调音频元数据加载完成
音频播放完毕(事件对象)置音频播放完毕回调音频播放到结尾
音频播放出错(事件对象)置音频播放出错回调播放过程中发生错误
音频被暂停(事件对象)置音频被暂停回调音频被暂停
音频开始被播放(事件对象)置音频开始被播放回调音频开始播放
音频播放进度被改变(事件对象)置音频播放进度被改变回调播放进度变化
音频音量被改变(事件对象)置音频音量被改变回调音量变化
音频播放速度被改变(事件对象)置音频播放速度被改变回调播放速度变化

⚠️ 注意事项

  1. 音频格式兼容性:不同浏览器支持的音频格式不同,建议使用 MP3 格式以获得最佳兼容性。
  2. 自动播放策略:大多数现代浏览器(尤其是移动端)要求用户在点击播放前不能自动播放有声音的音频。若需自动播放,建议设置 静音 = 真
  3. 跨域资源:如果音频地址是跨域的,服务器需要配置 CORS 头,否则可能无法正常播放。
  4. 播放位置精度播放位置 属性可设置任意数值,但实际跳转精度取决于音频编码和浏览器实现。
  5. 事件回调参数:所有音频事件回调都返回一个 事件对象 参数,其中包含事件的详细信息(如时间戳、错误代码等),可通过 取属性值 获取具体字段。
  6. 原生控制栏:默认音频播放器会显示浏览器原生控制栏,如需隐藏可设置 禁用 = 真,但会同时禁用交互。
  7. 音频与视频的区别:音频播放器没有画面,适合背景播放;视频播放器有画面,适合展示视频内容。两者属性和方法基本相同,但音频播放器的高度通常较小。
  8. 资源释放:在页面关闭或组件销毁时,音频播放器会自动释放资源,无需手动处理。
  9. 静音与音量:设置 静音 = 真 会将音量强制设为 0,且 音量 属性会被覆盖。取消静音时,音量恢复之前的值。
  10. 取属性值("duration"):音频总时长可通过 取属性值("duration") 获取,但需要在 音频被加载 事件触发后才能获取到有效值。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档媒体类组件_视频播放器 —— 视频播放组件
  • 文档媒体类组件_录音机 —— 音频录制组件
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、条件判断等
  • 文档综合演示:自定义音乐播放器 —— 实际应用示例

组件:时间轴

时间轴组件用于按时间顺序展示信息流,以垂直方向呈现事件、操作记录或历史节点,支持左排和交替两种布局模式。适用于展示项目里程碑、版本发布日志、用户操作记录、事件追踪等需要清晰时间线的场景。

典型使用场景:

  • 项目开发日志(版本迭代、功能更新记录)
  • 用户操作历史(登录记录、订单状态变更)
  • 事件追踪(工单处理流程、审批进度)
  • 企业动态(公司大事记、荣誉资质)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置布局模式模式时间轴1.模式 = "alternate"
添加单个时间项添加项目(项目对象)时间轴1.添加项目({time:"2024-01-01", title:"开始", content:"启动项目", color:"#1890ff"})
批量设置项目置项目数组(项目数组)时间轴1.置项目数组([{time:"...", title:"...", ...}, ...])
清空所有项目清空()时间轴1.清空()

样式美化参考

时间轴的视觉效果主要由每个项目的配置对象控制,但整体容器也支持样式调整:

  • 整体背景/边框:通过继承的 背景颜色边框边框圆角 等属性美化整个时间轴容器。
  • 内边距:通过 内边距 调整项目与容器边缘的距离,使布局更舒适。
  • 布局模式
    • "left"(默认):所有项目显示在时间轴左侧,适合简洁的列表式展示。
    • "alternate":项目交替显示在时间轴左右两侧,适合更丰富、宽松的布局。

项目对象属性说明:

  • time(文本型,必填):时间或日期,显示在节点上方。
  • title(文本型,必填):事件标题,加粗显示。
  • content(文本型,可选):详细描述,显示在标题下方。
  • color(文本型,可选):节点圆点的颜色,支持颜色名称或十六进制,默认使用主题色。

基础示例

最简单的使用方式,添加三个时间点,默认左排布局。

变量 时间轴1 = 创建 时间轴()
时间轴1.左边 = 100
时间轴1.顶边 = 100
时间轴1.宽度 = 400

' 添加项目
时间轴1.添加项目({ time: "2024-01-01", title: "项目启动", content: "团队组建完成,正式开工", color: "#1890ff" })
时间轴1.添加项目({ time: "2024-02-15", title: "原型评审", content: "第一版原型通过客户验收", color: "#52c41a" })
时间轴1.添加项目({ time: "2024-03-30", title: "正式发布", content: "v1.0 上线,用户反响热烈", color: "#faad14" })

添加组件(时间轴1)

综合示例:用户操作日志

本示例模拟展示用户的操作记录,采用交替模式,并支持点击事件回调,方便查看详细信息或执行后续操作。

' ========== 创建时间轴 ==========
变量 操作日志 = 创建 时间轴()
操作日志.左边 = 20
操作日志.顶边 = 20
操作日志.宽度 = 600
操作日志.模式 = "alternate"  ' 交替布局
操作日志.背景颜色 = "#fafafa"
操作日志.边框 = "1px solid #e8e8e8"
操作日志.边框圆角 = 8
操作日志.内边距 = "16px"
添加组件(操作日志)

' ========== 准备数据(实际可从接口获取) ==========
变量 日志数据 = [
    { time: "2024-08-01 09:12", title: "用户登录", content: "IP: 192.168.1.100", color: "#1890ff" },
    { time: "2024-08-01 10:35", title: "查看订单", content: "订单号 #ORD-20240801-001", color: "#52c41a" },
    { time: "2024-08-01 11:20", title: "修改密码", content: "密码强度提升至强", color: "#faad14" },
    { time: "2024-08-01 14:05", title: "退出登录", content: "会话超时自动退出", color: "#ff4d4f" }
]

' 批量添加
操作日志.置项目数组(日志数据)

' ========== 添加点击事件 ==========
' 虽然时间轴本身没有自带"项目被单击"回调,但我们可以利用视图的"被单击"事件整体响应,
' 或者为每个项目单独绑定(需自定义渲染,但当前组件不支持),这里演示整体单击获取当前选中项。
' 由于轻语言时间轴组件未提供内置的"项目被单击"事件,以下为整体单击示例,实际可结合自定义渲染或原生DOM实现。
' 此处展示如何通过整体单击获取坐标判断点击位置,但较为复杂,不推荐。故省略高级交互示例,仅演示基本用法。

' 添加一个按钮,显示选中信息(演示)
变量 查看详情按钮 = 创建 按钮()
查看详情按钮.左边 = 20
查看详情按钮.顶边 = 300
查看详情按钮.宽度 = 120
查看详情按钮.高度 = 36
查看详情按钮.文本 = "查看选中日志"
查看详情按钮.背景颜色 = "#1890ff"
查看详情按钮.文本颜色 = "#ffffff"
添加组件(查看详情按钮)

查看详情按钮.置被单击回调((源对象, 事件对象) => {
    ' 模拟获取当前选中的日志索引(这里固定为0演示)
    弹出提示("您点击了第一条日志:用户登录")
})

注:当前时间轴组件未直接提供节点点击事件,若需要每个节点独立交互,可考虑使用自定义组件或结合原生 DOM 事件实现。也可通过框架的 添加事件 方法为内部元素绑定。


属性详解

模式

  • 类型: 文本型
  • 说明: 设置或获取时间轴的布局模式,可选值:
    • "left"(默认):所有项目节点和时间内容均排列在时间轴的左侧。
    • "alternate":项目交替排列在时间轴左右两侧(奇数在左,偶数在右),视觉效果更丰富。

函数详解

添加项目(项目对象)

  • 功能: 向时间轴末尾添加一个时间项。
  • 参数: 项目对象,是一个对象,包含以下属性(均为文本型):
    • time:必填,时间或日期字符串。
    • title:必填,事件标题。
    • content:可选,详细描述内容。
    • color:可选,节点圆点颜色(如 "#1890ff""red")。
  • 返回值: 数值型,新添加项目的索引位置(从0开始)。
  • 示例:
    变量 索引 = 时间轴1.添加项目({ time: "2024-08-02", title: "新事件", content: "描述", color: "#faad14" })
    

置项目数组(项目数组)

  • 功能: 批量设置时间轴项目,会覆盖当前所有项目。
  • 参数: 项目数组,由多个项目对象组成的数组(结构同 添加项目)。
  • 返回值: 无。
  • 示例:
    时间轴1.置项目数组([
        { time: "2024-01-01", title: "元旦", content: "新年开始" },
        { time: "2024-02-14", title: "情人节", content: "甜蜜节日" }
    ])
    

清空()

  • 功能: 清空时间轴中的所有项目,恢复为空状态。
  • 返回值: 无。
  • 示例: 时间轴1.清空()

事件说明

当前时间轴组件未提供专门的项目点击或切换事件。若需要交互,可考虑以下几种方式:

  1. 通过 视图 基类的 置被单击回调 为整个时间轴容器绑定点击事件,但无法区分具体点击的是哪个项目。
  2. 结合原生 DOM 操作或使用 添加事件 方法为内部节点绑定事件(需对渲染结构有一定了解)。
  3. 若框架未来版本支持项目单击回调,会在文档中补充。

⚠️ 注意事项

  1. 项目对象必须包含 timetitle:缺少必填字段可能导致渲染异常。
  2. color 为可选:若不指定,节点将使用默认主题色(通常为蓝色)。
  3. 模式切换:在设置 模式 后,已有项目布局会立即生效,无需重新添加。
  4. 宽度自适应:时间轴宽度默认为容器宽度,建议设置合适的宽度以确保内容完整显示。
  5. 内容较多:当 content 较长时,时间轴高度会自动扩展,建议整体容器设置合适高度或允许滚动。
  6. 无内置点击事件:如需项目交互,需借助原生 DOM 或自定义扩展,目前版本暂未提供专用回调。
  7. 数据动态更新:使用 置项目数组 会完全替换已有数据,若需保留部分,可先 取项目数组(但此方法未提供),因此建议统一管理数据源。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档滑块进度类_步骤条 —— 同类进度/流程组件参考
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、对象字面量语法
  • 文档综合演示:用户操作日志 —— 结合时间轴的实际应用示例

组件:步骤条

步骤条组件用于引导用户按流程完成多步骤任务,提供清晰的进度指示和导航能力。支持水平和垂直两种布局方向,可自定义步骤标题、描述,支持点击切换步骤,并提供了丰富的回调事件,便于在步骤切换时执行业务逻辑。

典型使用场景:

  • 用户注册/登录流程(填写信息 → 验证身份 → 注册完成)
  • 多步表单(基本信息 → 详细信息 → 确认提交)
  • 订单流程(购物车 → 确认订单 → 支付 → 完成)
  • 向导式操作(配置 → 预览 → 执行)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置步骤条方向方向步骤条1.方向 = "vertical"
设置当前步骤(索引从0开始)当前步骤步骤条1.当前步骤 = 2
启用/禁用点击切换可点击步骤条1.可点击 = 真
添加单个步骤添加步骤(标题, 描述)步骤条1.添加步骤("登录", "请输入账号密码")
批量设置步骤置步骤数组(步骤数组)步骤条1.置步骤数组([{title:"步骤1", description:"描述1"}, ...])
跳到下一步下一步()步骤条1.下一步()
跳回上一步上一步()步骤条1.上一步()
设置切换回调置步骤被切换回调(回调函数)步骤条1.置步骤被切换回调((源对象, 索引) => { ... })

样式美化参考

以下为常用样式组合示例,可根据实际需求调整:

布局方向:

  • 水平步骤条(默认):方向 = "horizontal",适合空间宽裕的场景,步骤从左到右排列。
  • 垂直步骤条:方向 = "vertical",适合侧边栏或空间有限的场景,步骤从上到下排列。

自定义样式(通过继承自视图的属性):

  • 设置整体背景:背景颜色 = "#fafafa"边框圆角 = 8
  • 设置步骤文本颜色:文本颜色 = "#1890ff"(当前激活步骤默认高亮)
  • 调整内边距:内边距 = "16px"
  • 设置字体大小:字体大小 = 14

步骤条内部样式(如步骤图标、连线颜色)由组件内部自动管理,继承属性主要作用于整体容器。如需深度自定义,可结合 CSS 样式类或 内联样式 进行微调。


基础示例

最简单的步骤条,展示三个步骤,默认选中第二个。

变量 步骤条1 = 创建 步骤条()
步骤条1.左边 = 100
步骤条1.顶边 = 100
步骤条1.宽度 = 500

' 添加步骤
步骤条1.添加步骤("登录", "使用账号登录")
步骤条1.添加步骤("验证", "短信验证码验证")
步骤条1.添加步骤("完成", "完成身份认证")

' 设置当前步骤(索引从0开始,此处设为第2步)
步骤条1.当前步骤 = 1

' 添加到父容器
添加组件(步骤条1)

综合示例:多步注册表单

本示例模拟一个用户注册流程,包含三个步骤(填写信息 → 验证邮箱 → 注册完成),并通过按钮控制步骤切换,同时展示回调事件的使用。

' ========== 创建步骤条 ==========
变量 步骤条1 = 创建 步骤条()
步骤条1.左边 = 20
步骤条1.顶边 = 20
步骤条1.宽度 = 600
步骤条1.方向 = "horizontal"
步骤条1.添加步骤("填写信息", "")
步骤条1.添加步骤("验证邮箱", "")
步骤条1.添加步骤("完成", "")
步骤条1.当前步骤 = 0
添加组件(步骤条1)

' ========== 创建步骤内容容器 ==========
变量 内容容器 = 创建 绝对布局()
内容容器.左边 = 20
内容容器.顶边 = 100
内容容器.宽度 = 600
内容容器.高度 = 200
内容容器.背景颜色 = "#f9f9f9"
内容容器.边框圆角 = 6
内容容器.内边距 = 20
添加组件(内容容器)

' ========== 创建步骤对应的面板(仅演示,实际可动态切换) ==========
' 面板1:填写信息
变量 面板1 = 创建 标签()
面板1.文本 = "第一步:请填写您的用户名和密码"
面板1.字体大小 = 16

变量 面板2 = 创建 标签()
面板2.文本 = "第二步:请点击发送验证码到您的邮箱"
面板2.字体大小 = 16

变量 面板3 = 创建 标签()
面板3.文本 = "第三步:注册成功!欢迎加入"
面板3.字体大小 = 16
面板3.文本颜色 = "#52c41a"

' 默认显示第一个面板
内容容器.添加组件(面板1)

' ========== 创建底部控制按钮 ==========
变量 上一步按钮 = 创建 按钮()
上一步按钮.左边 = 20
上一步按钮.顶边 = 320
上一步按钮.宽度 = 80
上一步按钮.高度 = 36
上一步按钮.文本 = "上一步"
上一步按钮.禁用 = 真  ' 初始禁用
添加组件(上一步按钮)

变量 下一步按钮 = 创建 按钮()
下一步按钮.左边 = 120
下一步按钮.顶边 = 320
下一步按钮.宽度 = 80
下一步按钮.高度 = 36
下一步按钮.文本 = "下一步"
下一步按钮.背景颜色 = "#1890ff"
下一步按钮.文本颜色 = "#ffffff"
添加组件(下一步按钮)

' ========== 步骤切换逻辑 ==========
' 更新面板显示的函数
函数 更新面板(步骤索引)
    ' 清空容器
    内容容器.清空()
    
    判断(步骤索引)
        分支 0
            内容容器.添加组件(面板1)
        分支 1
            内容容器.添加组件(面板2)
        分支 2
            内容容器.添加组件(面板3)
    结束 判断
    
    ' 更新按钮状态
    如果(步骤索引 == 0)
        上一步按钮.禁用 = 真
    否则
        上一步按钮.禁用 = 假
    结束 如果
    
    如果(步骤索引 == 2)
        下一步按钮.文本 = "完成"
    否则
        下一步按钮.文本 = "下一步"
    结束 如果
结束 函数

' 上一步按钮点击
上一步按钮.置被单击回调((源对象, 事件对象) => {
    变量 当前 = 步骤条1.当前步骤
    如果(当前 > 0)
        步骤条1.当前步骤 = 当前 - 1
        更新面板(步骤条1.当前步骤)
    结束 如果
})

' 下一步按钮点击
下一步按钮.置被单击回调((源对象, 事件对象) => {
    变量 当前 = 步骤条1.当前步骤
    如果(当前 < 2)
        步骤条1.当前步骤 = 当前 + 1
        更新面板(步骤条1.当前步骤)
    否则
        ' 完成所有步骤
        弹出提示("注册流程已完成!")
    结束 如果
})

' ========== 步骤切换回调(当用户点击步骤标题时触发) ==========
' 前提:需将 可点击 属性设为 真
步骤条1.可点击 = 真
步骤条1.置步骤被切换回调((源对象, 新索引) => {
    ' 当用户直接点击步骤标题时,同步更新面板
    更新面板(新索引)
})

' 初始化显示
更新面板(0)

属性详解

方向

  • 类型: 文本型
  • 说明: 设置或获取步骤条的排列方向,可选值 "horizontal"(水平,默认)或 "vertical"(垂直)。

当前步骤

  • 类型: 数值型
  • 说明: 设置或获取当前激活的步骤索引,索引从 0 开始。例如步骤总数为3,则有效值为 0、1、2。

可点击

  • 类型: 逻辑型
  • 说明: 设置或获取是否允许用户直接点击步骤标题来切换步骤。默认为 (禁止点击切换),设置为 后用户可通过点击标题跳转到对应步骤,并触发 置步骤被切换回调 事件。

函数详解

添加步骤(标题, 描述)

  • 功能: 向步骤条末尾添加一个新的步骤项。
  • 参数:
    • 标题:文本型,必填,步骤的标题。
    • 描述:文本型,可选,步骤的补充描述(可省略)。
  • 返回值: 数值型,新添加步骤的索引位置(从0开始)。
  • 示例:
    变量 索引 = 步骤条1.添加步骤("支付", "请选择支付方式")
    

置步骤数组(步骤数组)

  • 功能: 批量设置步骤,会替换当前所有步骤。
  • 参数: 步骤数组,对象数组,每个元素须包含 title(标题)和可选的 description(描述)。
  • 示例:
    步骤条1.置步骤数组([
        { title: "第一步", description: "描述1" },
        { title: "第二步", description: "描述2" }
    ])
    

下一步()

  • 功能: 跳转到当前步骤的下一个步骤。如果已是最后一步,则无效果。
  • 返回值: 无。
  • 示例: 步骤条1.下一步()

上一步()

  • 功能: 跳转到当前步骤的上一个步骤。如果已是第一步,则无效果。
  • 返回值: 无。
  • 示例: 步骤条1.上一步()

置步骤被切换回调(回调函数)

  • 功能: 设置当步骤被切换(无论是通过代码设置 当前步骤、调用 下一步/上一步,还是用户点击可点击的步骤标题)时触发的回调函数。
  • 参数: 回调函数,拉姆达表达式,格式为 (源对象, 当前步骤索引) => { ... }
    • 源对象:触发事件的步骤条组件本身。
    • 当前步骤索引:切换后的新步骤索引。
  • 示例:
    步骤条1.置步骤被切换回调((源对象, 索引) => {
        调试输出("切换到第 " + (索引 + 1) + " 步")
    })
    

事件:步骤被切换(源对象,当前步骤索引)

  • 功能: 当步骤被切换时触发,与 置步骤被切换回调 等效。此事件可用于 .spldg 设计文件中定义的组件,采用 VB6 风格书写。
  • 参数:
    • 源对象:触发事件的步骤条组件。
    • 当前步骤索引:切换后的步骤索引。
  • 示例(仅限设计文件中的组件):
    事件 步骤条1.步骤被切换(源对象, 当前步骤索引)
        调试输出("当前步骤:" + 当前步骤索引)
    结束 事件
    

⚠️ 注意事项

  1. 索引从0开始当前步骤 属性以及回调中的索引均从 0 开始计数,与数组索引一致。
  2. 方向默认水平:若不设置 方向 属性,默认为水平排列。垂直方向适合侧边栏或移动端窄屏。
  3. 点击切换需启用:若希望用户点击步骤标题进行切换,必须将 可点击 属性设为 ,否则点击无效。
  4. 回调触发时机置步骤被切换回调 会在步骤发生变化时触发,包括调用 下一步/上一步、直接赋值 当前步骤 以及用户点击(若启用)。注意避免在回调中再次修改 当前步骤 导致死循环。
  5. 步骤数量动态变化:使用 添加步骤置步骤数组 可以动态增删步骤,但需注意更新后 当前步骤 的有效性(若超过新总数,需手动修正)。
  6. 样式继承:组件自身的主题样式由框架控制,如需自定义颜色、字体等,可参考 视图 类提供的属性进行整体调整,但内部步骤图标和连线的样式暂时不支持细粒度定制。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档文本类组件_按钮 —— 与步骤条配合使用的按钮组件
  • 文档滑块进度类_进度条 —— 其他进度类组件参考
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、变量作用域等语法规则
  • 文档综合演示:多步表单注册 —— 综合实战示例

组件:滑块条

滑块条组件允许用户通过拖拽滑块在指定数值范围内选择一个值,支持自定义步长、范围,并提供实时的数值回调。适用于音量调节、亮度控制、价格筛选、评分设置等需要连续或离散数值输入的场景。

典型使用场景:

  • 音量/亮度/速度调节(媒体播放器、系统设置)
  • 价格区间筛选(电商商品筛选)
  • 数值精细调节(图像处理参数、图表控制)
  • 评分或满意度调查(滑动评分)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置取值范围最小值 / 最大值滑块条1.最小值 = 0滑块条1.最大值 = 200
设置步长(每次变化量)步长滑块条1.步长 = 5
设置当前值进度值滑块条1.进度值 = 75
禁用/启用滑块禁用滑块条1.禁用 = 真
设置值改变回调置滑块位置被改变回调(回调函数)滑块条1.置滑块位置被改变回调((源对象, 当前值) => { ... })

样式美化参考

滑块条组件的外观主要通过继承的视图属性进行整体调整:

  • 整体尺寸:通过 宽度高度 控制滑块轨道长度和粗细。通常宽度较大,高度较小(如 宽度 = 300高度 = 6)。
  • 轨道背景:通过 背景颜色 设置轨道的底色(未填充部分),通过 背景 可设置更复杂的渐变或图像。
  • 滑块颜色:滑块按钮的颜色由组件内部控制,一般跟随主题色,暂不支持直接自定义(可通过 CSS 类间接调整)。
  • 禁用状态:当 禁用 = 真 时,滑块会变灰且不可拖动,同时可通过 透明度光标样式 增强视觉反馈。

基础示例

一个基本的音量调节滑块,范围 0~100,步长 1,默认 50。

变量 滑块条1 = 创建 滑块条()
滑块条1.左边 = 50
滑块条1.顶边 = 100
滑块条1.宽度 = 300
滑块条1.高度 = 8
滑块条1.最小值 = 0
滑块条1.最大值 = 100
滑块条1.步长 = 1
滑块条1.进度值 = 50

滑块条1.置滑块位置被改变回调((源对象, 当前值) => {
    ' 更新显示标签
    标签_音量.文本 = "音量:" + 当前值 + "%"
})

添加组件(滑块条1)

综合示例:价格筛选与实时显示

本示例在电商场景中,通过两个滑块分别设置最低价和最高价,并实时显示筛选区间。

' ========== 创建最低价滑块 ==========
变量 标签_最低 = 创建 标签()
标签_最低.左边 = 20
标签_最低.顶边 = 20
标签_最低.文本 = "最低价:0 元"
标签_最低.字体大小 = 14
添加组件(标签_最低)

变量 滑块_最低 = 创建 滑块条()
滑块_最低.左边 = 20
滑块_最低.顶边 = 50
滑块_最低.宽度 = 280
滑块_最低.最小值 = 0
滑块_最低.最大值 = 1000
滑块_最低.步长 = 10
滑块_最低.进度值 = 0
添加组件(滑块_最低)

' ========== 创建最高价滑块 ==========
变量 标签_最高 = 创建 标签()
标签_最高.左边 = 20
标签_最高.顶边 = 100
标签_最高.文本 = "最高价:1000 元"
标签_最高.字体大小 = 14
添加组件(标签_最高)

变量 滑块_最高 = 创建 滑块条()
滑块_最高.左边 = 20
滑块_最高.顶边 = 130
滑块_最高.宽度 = 280
滑块_最高.最小值 = 0
滑块_最高.最大值 = 1000
滑块_最高.步长 = 10
滑块_最高.进度值 = 1000
添加组件(滑块_最高)

' ========== 显示当前区间 ==========
变量 标签_区间 = 创建 标签()
标签_区间.左边 = 20
标签_区间.顶边 = 180
标签_区间.宽度 = 300
标签_区间.文本 = "当前筛选价格区间:0 - 1000 元"
标签_区间.字体大小 = 16
标签_区间.文本颜色 = "#1890ff"
添加组件(标签_区间)

' ========== 回调绑定 ==========
' 最低价变动
滑块_最低.置滑块位置被改变回调((源对象, 当前值) => {
    标签_最低.文本 = "最低价:" + 当前值 + " 元"
    ' 确保最低价不超过最高价
    变量 最高值 = 滑块_最高.进度值
    如果(当前值 > 最高值)
        滑块_最低.进度值 = 最高值
        当前值 = 最高值
    结束 如果
    更新区间显示(当前值, 滑块_最高.进度值)
})

' 最高价变动
滑块_最高.置滑块位置被改变回调((源对象, 当前值) => {
    标签_最高.文本 = "最高价:" + 当前值 + " 元"
    ' 确保最高价不低于最低价
    变量 最低值 = 滑块_最低.进度值
    如果(当前值 < 最低值)
        滑块_最高.进度值 = 最低值
        当前值 = 最低值
    结束 如果
    更新区间显示(滑块_最低.进度值, 当前值)
})

' ========== 辅助函数更新区间标签 ==========
函数 更新区间显示(最低, 最高)
    标签_区间.文本 = "当前筛选价格区间:" + 最低 + " - " + 最高 + " 元"
结束 函数

属性详解

最小值

  • 类型: 数值型
  • 说明: 设置或获取滑块允许的最小值,默认 0。当滑块拖动或通过代码设置 进度值 时,不能低于此值。

最大值

  • 类型: 数值型
  • 说明: 设置或获取滑块允许的最大值,默认 100。当滑块拖动或通过代码设置 进度值 时,不能高于此值。

步长

  • 类型: 数值型
  • 说明: 设置或获取每次拖动时的步进增量,默认 1。例如步长为 10 时,滑块值只会是 0、10、20、...,无法停留在中间值。

进度值

  • 类型: 数值型
  • 说明: 设置或获取当前滑块的位置(当前值),必须在 最小值最大值 范围内。默认 0。设置后会自动调整滑块视觉位置。

禁用

  • 类型: 逻辑型
  • 说明: 设置或获取滑块是否被禁用。当为 时,滑块不可拖动,且样式变灰(由浏览器默认行为控制)。

函数详解

置进度值(值)

  • 功能: 以编程方式设置滑块当前值,效果等同于直接修改 进度值 属性。
  • 参数: (数值型),必须介于 最小值最大值 之间。
  • 返回值: 无。
  • 示例: 滑块条1.置进度值(75)

置滑块位置被改变回调(回调函数)

  • 功能: 设置当滑块值发生变化时的回调函数。变化来源包括用户拖拽和通过代码修改(置进度值 或直接赋值 进度值 都会触发)。
  • 参数: 回调函数,拉姆达表达式,格式为 (源对象, 当前值) => { ... }
    • 源对象:触发事件的滑块组件本身。
    • 当前值:变化后的数值(类型为数值型)。
  • 示例:
    滑块条1.置滑块位置被改变回调((源对象, 当前值) => {
        调试输出("当前值:" + 当前值)
    })
    

事件:滑块位置被改变(源对象,当前值)

  • 功能:置滑块位置被改变回调 等效,适用于设计文件(.spldg)中定义的组件,采用 VB6 风格绑定。
  • 参数: 源对象(滑块组件),当前值(当前数值)。
  • 示例(仅限设计文件组件):
    事件 滑块条1.滑块位置被改变(源对象, 当前值)
        标签_显示.文本 = "当前值:" + 当前值
    结束 事件
    

⚠️ 注意事项

  1. 取值范围校验:若通过代码设置 进度值 超出 最小值~最大值 范围,会自动被裁剪到边界值,不会报错。
  2. 步长影响:当 步长 不为 1 时,用户拖拽和代码设置值都会自动对齐到最近的步长倍数。例如步长 = 5,设置 进度值 = 7 会实际变为 5 或 10(取决于舍入方式,通常向下取整)。
  3. 精度问题进度值 为数值型,浮点数也可作为步长(如 0.1),但需注意 JavaScript 浮点数精度。
  4. 实时回调:在拖拽过程中,回调会持续触发(每次鼠标移动都会更新),请确保回调中的逻辑尽量轻量,避免性能问题。
  5. 禁用状态禁用 属性可控制滑块是否可交互,但视觉变化由浏览器原生样式决定,可能在不同浏览器中略有差异。
  6. 尺寸适配:滑块条的高度一般建议设置较小(如 4~8px),以便呈现细长的轨道;宽度则根据布局需求设置。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档滑块进度类_进度条 —— 同类别组件参考
  • 文档滑块进度类_步骤条 —— 流程引导组件
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、数值类型等
  • 文档综合演示:价格筛选器 —— 滑块条的实际应用场景

组件:进度条

进度条组件用于直观展示任务、操作或流程的完成进度,以水平条形图的形式呈现当前进度百分比。支持自定义进度颜色、背景色、宽度和高度,适用于文件上传/下载、数据加载、任务处理、表单提交等需要反馈进度的场景。

典型使用场景:

  • 文件上传/下载进度(用户上传附件、下载资源)
  • 数据加载/处理进度(导入大量数据、批量计算)
  • 表单或流程完成度(注册流程、多步表单)
  • 游戏或应用内任务进度(经验值、任务完成率)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置进度值(0~100)进度值进度条1.进度值 = 75
设置进度颜色颜色进度条1.颜色 = "#52c41a"
设置轨道背景色背景颜色进度条1.背景颜色 = "#f5f5f5"
调整进度条尺寸宽度 / 高度进度条1.宽度 = 400进度条1.高度 = 20

样式美化参考

进度条的外观主要通过以下属性调整:

  • 整体容器:通过 宽度高度 控制进度条的粗细和长度,背景颜色 设置轨道底色(未填充部分),边框圆角 可使两端圆润。
  • 进度填充:通过 颜色 属性设置填充部分的颜色,支持颜色名称、十六进制值(如 #1890ff)或 RGB。
  • 内联样式:如需更精细的控制(如渐变、阴影),可通过 内联样式追加内联样式 方法添加自定义 CSS。
  • 显示文本:进度条本身不显示百分比文本,可结合 标签 组件在旁边显示。

基础示例

一个简单的进度条,展示 60% 的完成度,蓝色填充,灰色背景。

变量 进度条1 = 创建 进度条()
进度条1.左边 = 50
进度条1.顶边 = 100
进度条1.宽度 = 300
进度条1.高度 = 16
进度条1.颜色 = "#1890ff"
进度条1.进度值 = 60
进度条1.背景颜色 = "#e8e8e8"
进度条1.边框圆角 = 8  ' 圆角效果
添加组件(进度条1)

综合示例:模拟文件上传进度

本示例模拟文件上传过程,通过点击按钮触发进度从 0 逐步增加至 100%,并在过程中更新显示标签。

' ========== 创建界面元素 ==========
' 进度条
变量 进度条_上传 = 创建 进度条()
进度条_上传.左边 = 30
进度条_上传.顶边 = 30
进度条_上传.宽度 = 340
进度条_上传.高度 = 20
进度条_上传.颜色 = "#1890ff"
进度条_上传.背景颜色 = "#e8e8e8"
进度条_上传.边框圆角 = 10
进度条_上传.进度值 = 0
添加组件(进度条_上传)

' 进度百分比标签
变量 标签_百分比 = 创建 标签()
标签_百分比.左边 = 380
标签_百分比.顶边 = 28
标签_百分比.宽度 = 60
标签_百分比.文本 = "0%"
标签_百分比.字体大小 = 14
标签_百分比.字体粗细 = "bold"
标签_百分比.文本颜色 = "#1890ff"
添加组件(标签_百分比)

' 状态标签
变量 标签_状态 = 创建 标签()
标签_状态.左边 = 30
标签_状态.顶边 = 65
标签_状态.宽度 = 300
标签_状态.文本 = "等待开始..."
标签_状态.文本颜色 = "#999"
标签_状态.字体大小 = 12
添加组件(标签_状态)

' 开始上传按钮
变量 按钮_上传 = 创建 按钮()
按钮_上传.左边 = 30
按钮_上传.顶边 = 100
按钮_上传.宽度 = 120
按钮_上传.高度 = 36
按钮_上传.文本 = "开始上传"
按钮_上传.背景颜色 = "#1890ff"
按钮_上传.文本颜色 = "#ffffff"
按钮_上传.边框圆角 = 6
添加组件(按钮_上传)

' 重置按钮
变量 按钮_重置 = 创建 按钮()
按钮_重置.左边 = 170
按钮_重置.顶边 = 100
按钮_重置.宽度 = 100
按钮_重置.高度 = 36
按钮_重置.文本 = "重置"
按钮_重置.背景颜色 = "#d9d9d9"
按钮_重置.文本颜色 = "#333"
按钮_重置.边框圆角 = 6
添加组件(按钮_重置)

' ========== 业务逻辑 ==========
' 模拟上传进度更新
函数 模拟上传()
    ' 禁用按钮,防止重复点击
    按钮_上传.禁用 = 真
    标签_状态.文本 = "正在上传..."
    标签_状态.文本颜色 = "#1890ff"
    
    变量 当前进度 = 0
    变量 时钟ID = 创建时钟(() => {
        当前进度 = 当前进度 + 取随机整数(5, 15)  ' 随机增量
        如果(当前进度 > 100)
            当前进度 = 100
        结束 如果
        
        进度条_上传.进度值 = 当前进度
        标签_百分比.文本 = 当前进度 + "%"
        
        如果(当前进度 >= 100)
            销毁时钟(时钟ID)
            标签_状态.文本 = "上传完成!"
            标签_状态.文本颜色 = "#52c41a"
            按钮_上传.禁用 = 假
            弹出提示("文件上传成功")
        结束 如果
    }, 300)  ' 每300ms更新一次
结束 函数

' 开始上传按钮点击
按钮_上传.置被单击回调((源对象, 事件对象) => {
    模拟上传()
})

' 重置按钮点击
按钮_重置.置被单击回调((源对象, 事件对象) => {
    进度条_上传.进度值 = 0
    标签_百分比.文本 = "0%"
    标签_状态.文本 = "等待开始..."
    标签_状态.文本颜色 = "#999"
    按钮_上传.禁用 = 假
})

属性详解

进度值

  • 类型: 数值型
  • 说明: 设置或获取当前进度值,取值范围为 0100(包含)。超出范围的值会被自动裁剪到边界。设置后进度条会立即刷新显示。

颜色

  • 类型: 文本型
  • 说明: 设置或获取进度填充部分的颜色。支持 CSS 颜色值,如颜色名称("red")、十六进制("#ff0000")、RGB("rgb(255,0,0)")等。默认值为蓝色系(由框架主题决定)。

⚠️ 注意事项

  1. 进度值范围进度值 必须为 0~100 之间的数值,超出范围会被裁剪。例如设置 进度值 = 120 实际会显示为 100。
  2. 进度颜色可自定义颜色 属性支持任意 CSS 颜色值,可根据进度状态动态切换(如 <30% 为红色,30~70% 为黄色,>70% 为绿色)。
  3. 无内置文本:进度条本身不显示百分比文字,如需显示,请配合 标签 组件使用。
  4. 动态更新:通过定时器或网络请求回调中不断修改 进度值,可实现平滑动画效果。
  5. 高度影响外观:进度条的高度不宜过大(通常 8~24px),否则视觉效果较差。宽度则根据布局自由设置。
  6. 与滑块条的区别:进度条是只读的,用于展示进度;滑块条是可交互的,用于让用户选择值。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档滑块进度类_滑块条 —— 同类可交互组件参考
  • 文档滑块进度类_步骤条 —— 流程导航组件
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、数值类型等
  • 文档综合演示:文件上传进度 —— 实际应用场景

组件:SSE

SSE(Server-Sent Events)客户端组件是一个不可视组件,用于接收服务器通过 HTTP 协议推送的实时事件流。与 WebSocket 不同,SSE 是单向通信(仅服务器推送到客户端),基于标准 HTTP 协议,支持自动重连和事件 ID 追踪。适用于实时通知、数据更新、状态监控、消息推送等场景。

典型使用场景:

  • 实时通知(系统公告、消息提醒)
  • 数据更新(股票行情、体育比分、天气变化)
  • 状态监控(服务器状态、任务进度)
  • 新闻/资讯实时推送
  • 日志流或操作日志实时输出

快速索引

你想知道什么直接看这里
如何连接 SSE 服务器连接(地址)
如何关闭连接关闭()
如何获取连接状态取连接状态()
如何重新连接重新连接(地址)
如何接收服务器消息置收到消息回调(回调函数)
如何监听连接打开置连接被打开回调(回调函数)
如何监听错误置发生错误回调(回调函数)
连接状态码含义见下方“连接状态详解”

基础示例

最简单的 SSE 使用流程:连接服务器 → 接收消息 → 处理消息 → 关闭连接。

变量 sse = 创建 SSE()

' 1. 设置事件回调(需在连接前设置)
sse.置连接被打开回调((事件源) => {
    调试输出("SSE 连接已打开")
})

sse.置收到消息回调((事件源) => {
    调试输出("收到消息:" + 事件源.data)
})

sse.置发生错误回调((事件源) => {
    调试输出("SSE 错误:" + 事件源.message)
})

' 2. 发起连接
sse.连接("https://api.example.com/events")

' 3. 后续操作(例如在延时后关闭)
延时执行(() => {
    sse.关闭()
   调试输出("SSE 连接已关闭")
}, 30000)

综合示例:实时通知系统

本示例模拟一个实时通知系统,连接服务器后持续接收通知消息,并根据不同事件类型执行相应操作。

' ========== 创建 SSE 客户端 ==========
变量 sse = 创建 SSE()

' ========== 设置事件回调 ==========
' 连接打开
sse.置连接被打开回调((事件源) => {
    调试输出("✅ SSE 连接已打开")
    弹出提示("已连接到通知服务器")
})

' 收到消息
sse.置收到消息回调((事件源) => {
    变量 数据 = 事件源.data
    变量 事件类型 = 事件源.type  ' 事件类型(如 message, ping, update 等)
    调试输出("📨 收到事件:" + 事件类型 + ",数据:" + 数据)

    ' 根据事件类型处理不同逻辑
    判断(事件类型)
        分支 "notification"
            ' 处理普通通知
            显示通知(数据)
        分支 "alert"
            ' 处理紧急告警
            显示告警(数据)
        分支 "ping"
            ' 心跳消息,无需处理
        分支 默认
            调试输出("未知事件类型:" + 事件类型)
    结束 判断
})

' 发生错误
sse.置发生错误回调((事件源) => {
    调试输出("❌ SSE 发生错误:" + 事件源.message)
    弹出提示("连接出错,请检查网络或服务器状态")
})

' ========== 连接服务器 ==========
sse.连接("https://api.example.com/notifications")

' ========== 辅助函数:显示通知 ==========
函数 显示通知(消息)
    ' 实际开发中可在此更新 UI,例如添加一条通知到列表
    调试输出("🔔 通知:" + 消息)
结束 函数

函数 显示告警(消息)
    ' 实际开发中可在此显示红色告警
    调试输出("🚨 告警:" + 消息)
结束 函数

' ========== 在页面关闭时断开连接 ==========
事件 页面被关闭()
    sse.关闭()
结束 事件

函数详解

连接(地址)

  • 功能: 建立与 SSE 服务器的连接,开始接收服务器推送的事件流。
  • 参数: 地址(文本型),SSE 服务的 URL 地址(支持 HTTP/HTTPS)。
  • 返回值: 无。连接结果需通过 置连接被打开回调置发生错误回调 来监听。
  • 示例: sse.连接("https://api.example.com/events")

关闭()

  • 功能: 主动关闭 SSE 连接,停止接收事件流,释放资源。
  • 返回值: 无。
  • 示例: sse.关闭()

取连接状态()

  • 功能: 获取当前连接状态码。
  • 返回值: 数值型,可能的取值及含义:
    • 0:正在连接(Connecting
    • 1:已连接(Open
    • 2:已关闭(Closed
  • 示例: 如果(sse.取连接状态() == 1) 调试输出("SSE 已连接")

重新连接(地址)

  • 功能: 关闭当前连接(如果存在)并重新连接到 SSE 服务器。可指定新的地址(可选,若不传则使用上次的地址)。
  • 参数: 地址(文本型,可选),新的 SSE 服务 URL;若省略则复用上次连接地址。
  • 返回值: 无。
  • 示例: sse.重新连接()sse.重新连接("https://new-api.example.com/events")

回调设置函数

所有回调函数必须在调用 连接() 之前设置,否则可能错过连接打开等早期事件。

置连接被打开回调(回调函数)

  • 功能: 设置 SSE 连接成功打开时的回调函数。
  • 参数: 回调函数,格式为 (事件源) => { ... },其中 事件源 是原生 EventSource 事件对象。
  • 示例:
    sse.置连接被打开回调((事件源) => {
        调试输出("连接已打开,协议:" + 事件源.target.url)
    })
    

置收到消息回调(回调函数)

  • 功能: 设置接收到服务器消息时的回调函数。
  • 参数: 回调函数,格式为 (事件源) => { ... }事件源 包含以下常用属性:
    • eventSource.data:消息内容(文本字符串)
    • eventSource.type:事件类型(默认 "message",可通过服务器设置自定义类型)
    • eventSource.lastEventId:最后一条消息的 ID(用于断线重连)
  • 示例:
    sse.置收到消息回调((事件源) => {
        变量 类型 = 事件源.type
        变量 数据 = 事件源.data
        调试输出("[" + 类型 + "] " + 数据)
    })
    

置发生错误回调(回调函数)

  • 功能: 设置发生错误时的回调函数(例如连接失败、网络中断、服务器返回错误状态码等)。
  • 参数: 回调函数,格式为 (事件源) => { ... }事件源.message 包含错误描述。
  • 示例:
    sse.置发生错误回调((事件源) => {
        调试输出("SSE 错误:" + 事件源.message)
    })
    

事件说明

SSE 组件的事件与上述回调函数一一对应,适用于在 .spldg 设计文件中使用 VB6 风格事件绑定。

事件对应回调触发时机
连接被打开(事件源)置连接被打开回调SSE 连接成功建立
收到消息(事件源)置收到消息回调接收到服务器消息
发生错误(事件源)置发生错误回调发生错误(如连接失败)

与 WebSocket 的区别

维度SSEWebSocket
通信方向单向(服务器 → 客户端)双向(全双工)
协议HTTP(标准,兼容性好)WS/WSS(独立协议)
自动重连内置支持(EventSource 自动重连)需手动实现
消息格式纯文本(UTF-8)文本或二进制
支持的事件类型可自定义(通过 event: 字段)需自行约定协议
使用场景通知推送、状态监控、数据更新聊天、游戏、实时协作
浏览器支持所有现代浏览器(除 IE)所有现代浏览器(除 IE)

⚠️ 注意事项

  1. 回调设置顺序:所有回调函数应在调用 连接() 之前设置,否则可能错过连接打开等早期事件。
  2. 自动重连:SSE 协议原生支持断线重连,当连接意外断开时,浏览器会自动尝试重新连接。可通过 置发生错误回调 监控重连过程。
  3. 消息格式:服务器发送的消息格式为 data: 消息内容\n\n,可自定义 event: 字段来区分事件类型。
  4. 连接状态检查:发送操作前建议通过 取连接状态() 检查是否为 1(已连接)。
  5. 安全性:生产环境建议使用 https:// 协议,确保数据传输安全。
  6. 资源释放:在页面关闭或组件销毁时,应主动调用 关闭() 释放连接资源,避免内存泄漏。
  7. 浏览器限制:同一域名下的 SSE 连接数通常有限制(一般为 6 个),超出后可能需要复用连接或使用 HTTP/2。
  8. 跨域问题:若 SSE 服务与页面不同源,服务器需配置 CORS 头(Access-Control-Allow-Origin)。
  9. URL 长度限制:SSE 连接 URL 过长可能导致某些浏览器拦截(建议不超过 2048 字符)。
  10. 消息大小限制:虽然 SSE 没有明确限制消息大小,但过大的消息可能影响性能,建议分片发送。

相关文档

  • 文档不可视类型组件_WS客户端 —— WebSocket 双向通信
  • 文档前端(JavaScript)函数_网络操作类 —— HTTP 请求相关函数
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、异常处理等
  • 文档综合演示:实时通知系统 —— 实际应用示例

组件:WS客户端

WS客户端组件是一个不可视组件,用于在轻语言应用中建立 WebSocket 连接,实现与服务器的全双工实时通信。它不依赖于任何 UI 元素,仅提供一系列方法用于连接、发送、接收和关闭 WebSocket 连接。适用于实时消息推送、在线聊天、数据监控、协同编辑等需要长连接通信的场景。

典型使用场景:

  • 实时聊天应用(即时通讯、客服系统)
  • 数据推送(股票行情、体育比分、系统通知)
  • 在线协作(多人文档编辑、白板同步)
  • 游戏服务器通信(实时对战、状态同步)
  • 物联网设备控制(远程指令下发、状态上报)

快速索引

你想知道什么直接看这里
如何连接 WebSocket 服务器连接(服务端地址)
如何发送消息发送数据(数据)
如何关闭连接关闭()
如何获取连接状态取连接状态()
如何监听连接成功置连接成功回调(回调函数)
如何接收消息置收到消息回调(回调函数)
如何监听连接关闭置连接被关闭回调(回调函数)
如何监听错误置发生错误回调(回调函数)
连接状态码含义见下方“连接状态详解”

基础示例

最简单的 WebSocket 使用流程:连接服务器 → 发送消息 → 接收消息 → 关闭连接。

变量 ws = 创建 WS客户端()

' 1. 设置事件回调(需在连接前设置)
ws.置连接成功回调((事件源) => {
    调试输出("WebSocket 连接成功")
    ' 连接成功后发送一条消息
    ws.发送数据("Hello Server!")
})

ws.置收到消息回调((事件源) => {
    ' 事件源中包含了收到的消息数据
    变量 消息 = 事件源.data
    调试输出("收到服务器消息:" + 消息)
})

ws.置连接被关闭回调((事件源) => {
    调试输出("WebSocket 连接已关闭")
})

ws.置发生错误回调((事件源) => {
    调试输出("WebSocket 错误:" + 事件源.message)
})

' 2. 发起连接
变量 结果 = ws.连接("ws://localhost:8080/ws")
如果(结果 == 假)
    调试输出("浏览器不支持 WebSocket 或连接失败")
结束 如果

' 3. 后续操作(例如在延时后关闭)
延时执行(() => {
    ws.关闭()
}, 10000)

综合示例:实时聊天客户端

本示例模拟一个简单的聊天室客户端,包含连接、发送消息、接收消息、显示在线状态等功能。

' ========== 创建 WebSocket 客户端 ==========
变量 ws = 创建 WS客户端()

' ========== 设置事件回调 ==========
' 连接成功
ws.置连接成功回调((事件源) => {
    调试输出("✅ 连接成功")
    弹出提示("已连接到聊天服务器")
    ' 发送登录消息(假设服务器需要认证)
    变量 登录数据 = JSON编码({ type: "login", username: "张三" })
    ws.发送数据(登录数据)
})

' 收到消息
ws.置收到消息回调((事件源) => {
    变量 数据 = 事件源.data
    调试输出("📨 收到消息:" + 数据)
    ' 尝试解析为 JSON
    尝试
        变量 消息对象 = JSON解析(数据)
        如果(消息对象.类型 == "message")
            显示聊天消息(消息对象.用户名, 消息对象.内容)
        否则 如果(消息对象.类型 == "online")
            更新在线列表(消息对象.用户列表)
        结束 如果
    捕获 异常
        ' 非 JSON 消息直接显示
        显示聊天消息("系统", 数据)
    结束 尝试
})

' 连接关闭
ws.置连接被关闭回调((事件源) => {
    调试输出("🔌 连接已关闭")
    弹出提示("与服务器的连接已断开")
    ' 可在此尝试自动重连
})

' 发生错误
ws.置发生错误回调((事件源) => {
    调试输出("❌ 发生错误:" + 事件源.message)
    弹出提示("WebSocket 错误,请检查网络")
})

' ========== 连接服务器 ==========
变量 服务器地址 = "ws://chat.example.com:8080/ws"
如果(ws.连接(服务器地址) == 假)
    弹出提示("浏览器不支持 WebSocket 或地址无效")
结束 如果

' ========== 发送消息函数 ==========
函数 发送聊天消息(内容)
    如果(ws.取连接状态() != 1)  ' 1 表示已连接
        弹出提示("未连接到服务器")
        返回
    结束 如果
    变量 消息对象 = { type: "message", content: 内容 }
    ws.发送数据(JSON编码(消息对象))
结束 函数

' ========== 模拟发送一条消息 ==========
延时执行(() => {
    发送聊天消息("大家好,我是新来的!")
}, 2000)

' ========== 显示消息函数(示例) ==========
函数 显示聊天消息(用户名, 内容)
    ' 实际开发中可在此更新 UI,例如添加标签到聊天列表
    调试输出(用户名 + ":" + 内容)
结束 函数

函数 更新在线列表(用户列表)
    调试输出("当前在线用户:" + 数组到文本(用户列表, ", "))
结束 函数

' ========== 在页面关闭时断开连接 ==========
事件 页面被关闭()
    ws.关闭()
结束 事件

函数详解

连接(服务端地址)

  • 功能: 尝试建立与指定 WebSocket 服务器的连接。
  • 参数: 服务端地址(文本型),支持两种格式:
    • ws:// 开头(非加密连接),例如 "ws://127.0.0.1:8080/path"
    • wss:// 开头(加密连接,类似 HTTPS),例如 "wss://example.com:443/wss"
  • 返回值: 逻辑型, 表示浏览器支持 WebSocket 且连接请求已发起(但不代表连接成功); 表示浏览器不支持 WebSocket 或地址格式错误。
  • 注意: 连接结果需通过 置连接成功回调置发生错误回调 来监听。
  • 示例: ws.连接("ws://localhost:8080/ws")

发送数据(数据)

  • 功能: 通过已建立的 WebSocket 连接向服务器发送文本数据。
  • 参数: 数据(文本型),要发送的字符串内容(可以是纯文本或 JSON 字符串)。
  • 返回值: 无。
  • 注意: 仅在连接状态为 1(已连接)时发送才有效,否则会静默失败或报错(取决于浏览器实现)。
  • 示例: ws.发送数据("Hello")

关闭()

  • 功能: 主动关闭 WebSocket 连接,释放资源。关闭后会触发 置连接被关闭回调
  • 返回值: 无。
  • 示例: ws.关闭()

取连接状态()

  • 功能: 获取当前连接状态码。
  • 返回值: 数值型,可能的取值及含义:
    • 0:正在连接(Connecting
    • 1:已连接(Open
    • 2:正在关闭(Closing
    • 3:已关闭(Closed
  • 示例: 如果(ws.取连接状态() == 1) 调试输出("连接正常")

回调设置函数

所有回调函数必须在调用 连接() 之前设置,否则可能错过连接成功等早期事件。

置连接成功回调(回调函数)

  • 功能: 设置连接成功时的回调函数。
  • 参数: 回调函数,格式为 (事件源) => { ... },其中 事件源 是原生 WebSocket 事件对象,包含连接相关信息。
  • 示例:
    ws.置连接成功回调((事件源) => {
        调试输出("连接成功,协议:" + 事件源.target.protocol)
    })
    

置收到消息回调(回调函数)

  • 功能: 设置接收到服务器消息时的回调函数。
  • 参数: 回调函数,格式为 (事件源) => { ... }事件源.data 为接收到的消息内容(文本字符串)。
  • 示例:
    ws.置收到消息回调((事件源) => {
        变量 消息 = 事件源.data
        调试输出("收到:" + 消息)
    })
    

置连接被关闭回调(回调函数)

  • 功能: 设置连接被关闭时的回调函数(包括主动关闭、服务器关闭、网络异常等)。
  • 参数: 回调函数,格式为 (事件源) => { ... }事件源 包含关闭码(code)和关闭原因(reason)。
  • 示例:
    ws.置连接被关闭回调((事件源) => {
        调试输出("关闭码:" + 事件源.code + ",原因:" + 事件源.reason)
    })
    

置发生错误回调(回调函数)

  • 功能: 设置发生错误时的回调函数(例如连接失败、网络中断、数据格式错误等)。
  • 参数: 回调函数,格式为 (事件源) => { ... }事件源.message 包含错误描述。
  • 示例:
    ws.置发生错误回调((事件源) => {
        调试输出("错误:" + 事件源.message)
    })
    

事件说明

WS客户端组件的事件与上述回调函数一一对应,适用于在 .spldg 设计文件中使用 VB6 风格事件绑定(但通常不可视组件较少使用设计文件,建议直接使用回调函数)。

事件对应回调触发时机
连接成功(事件源)置连接成功回调WebSocket 连接成功建立
收到消息(事件源)置收到消息回调接收到服务器消息
连接被关闭(事件源)置连接被关闭回调连接被关闭(任何原因)
发生错误(事件源)置发生错误回调发生错误(如连接失败)

⚠️ 注意事项

  1. 回调设置顺序:所有回调函数应在调用 连接() 之前设置,否则可能错过连接成功等事件。
  2. 连接状态检查:发送消息前建议通过 取连接状态() 检查是否为 1(已连接),避免发送失败。
  3. 消息格式发送数据() 仅支持文本字符串,如需发送二进制数据(如文件、图片),需先进行 Base64 或 ArrayBuffer 编码(目前版本可能不支持,需查阅更新)。
  4. 自动重连:组件本身不提供自动重连机制,可在 置连接被关闭回调置发生错误回调 中手动实现重连逻辑(注意延迟和次数限制)。
  5. 安全性:生产环境建议使用 wss:// 加密连接,防止数据被窃听。
  6. 心跳保活:部分服务器要求客户端定期发送心跳包(如 Ping/Pong),可在 置连接成功回调 中启动定时器,定期发送心跳数据。
  7. 同源策略:WebSocket 不受同源策略限制,但服务器需支持跨域 WebSocket 连接(通过 Origin 头验证)。
  8. 资源释放:在页面关闭或组件销毁时,应主动调用 关闭() 释放连接资源,避免内存泄漏。
  9. 浏览器兼容性:WebSocket 在现代浏览器中广泛支持,但 IE 等旧浏览器不支持,可通过 连接() 返回值判断。
  10. 错误处理:务必设置 置发生错误回调,否则连接失败时可能无提示,导致用户困惑。

相关文档

  • 文档不可视类型组件_SSE —— Server-Sent Events 单向推送
  • 文档不可视类型组件_后台任务 —— Web Worker 多线程
  • 文档轻语言网站:发送网络请求与接口请求 —— HTTP 请求
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、JSON 操作等

组件:XML解析器

XML解析器组件是一个不可视组件,用于解析和处理 XML 格式的文档数据。它可以将 XML 字符串解析为 DOM 文档对象,并提供了查询元素、获取文本、获取属性、遍历子元素和父元素等一系列操作。适用于数据解析、配置文件处理、API 响应解析、RSS 订阅等需要处理 XML 数据的场景。

典型使用场景:

  • 解析 REST API 返回的 XML 数据(如旧版 Web 服务)
  • 读取 XML 配置文件(如项目配置、系统设置)
  • 处理 RSS/Atom 订阅源
  • 解析 SVG 或 XHTML 等 XML 格式文档
  • 数据格式转换(XML → JSON)

快速索引

你想知道什么直接看这里
如何解析 XML 字符串解析(XML字符串)
如何获取单个元素取元素(选择器)
如何获取元素列表取元素列表(选择器)
如何获取元素的文本内容取文本(元素)
如何获取元素的属性值取属性(元素, 属性名)
如何获取所有子元素取子元素(元素)
如何获取父元素取父元素(元素)

基础示例

最简单的使用流程:解析 XML → 取元素 → 读取属性和文本。

变量 解析器 = 创建 XML解析器()

' 1. 准备 XML 数据
变量 xml字符串 = "<book id='1001'><title>轻语言编程</title><author>VcnStudio</author><price>59.9</price></book>"

' 2. 解析 XML,返回 DOM 文档对象
变量 文档 = 解析器.解析(xml字符串)

' 3. 获取根元素
变量 根元素 = 解析器.取元素("book")

' 4. 读取属性
变量 id = 解析器.取属性(根元素, "id")
调试输出("图书ID:" + id)  ' 输出:图书ID:1001

' 5. 读取子元素文本
变量 标题元素 = 解析器.取元素("title")  ' 在根元素下查找
变量 标题 = 解析器.取文本(标题元素)
调试输出("书名:" + 标题)  ' 输出:书名:轻语言编程

' 6. 也可以直接使用 XPath 或选择器(具体取决于实现)

综合示例:解析 RSS 订阅源

本示例模拟解析一个 RSS 2.0 格式的 XML 数据,提取文章列表(标题、链接、描述)。

变量 解析器 = 创建 XML解析器()

' ========== RSS XML 数据(模拟) ==========
变量 rssXML = "
<rss version='2.0'>
    <channel>
        <title>技术博客</title>
        <link>https://blog.example.com</link>
        <description>分享编程技术</description>
        <item>
            <title>轻语言入门指南</title>
            <link>https://blog.example.com/guide</link>
            <description>快速上手轻语言</description>
            <pubDate>2026-08-27</pubDate>
        </item>
        <item>
            <title>WebSocket 实战</title>
            <link>https://blog.example.com/ws</link>
            <description>构建实时应用</description>
            <pubDate>2026-08-26</pubDate>
        </item>
    </channel>
</rss>
"

' ========== 解析文档 ==========
变量 文档
尝试
    文档 = 解析器.解析(rssXML)
捕获 异常
    调试输出("XML 格式错误:" + 异常.message)
    返回
结束 尝试

' ========== 获取 channel ==========
变量 频道 = 解析器.取元素("channel")
如果(频道 == 空)
    调试输出("未找到 channel 节点")
    返回
结束 如果

' 读取频道基本信息
变量 频道标题 = 解析器.取文本(解析器.取元素("title"))
变量 频道描述 = 解析器.取文本(解析器.取元素("description"))
调试输出("频道:" + 频道标题 + " - " + 频道描述)

' ========== 获取所有 item 元素 ==========
变量 所有Item = 解析器.取元素列表("item")
变量 文章数量 = 取数组成员数(所有Item)
调试输出("共 " + 文章数量 + " 篇文章")

' ========== 遍历每个 item ==========
变量循环(i = 0, 文章数量, 1)
    变量 item = 所有Item[i]
    
    ' 获取子元素(注意:取元素是在全局或当前上下文中,可能需要结合父元素)
    ' 假设取元素可传入上下文,此处若只支持全局,则需改用取子元素
    ' 这里演示使用取子元素来获取 item 下的子节点
    变量 子元素列表 = 解析器.取子元素(item)
    
    变量 标题 = ""
    变量 链接 = ""
    变量 描述 = ""
    
    变量循环(j = 0, 取数组成员数(子元素列表), 1)
        变量 子节点 = 子元素列表[j]
        变量 节点名 = 子节点.nodeName  ' 原生属性,可改为取节点名称方法
        如果(节点名 == "title")
            标题 = 解析器.取文本(子节点)
        否则 如果(节点名 == "link")
            链接 = 解析器.取文本(子节点)
        否则 如果(节点名 == "description")
            描述 = 解析器.取文本(子节点)
        结束 如果
    结束循环
    
    调试输出("文章 " + (i+1) + ":" + 标题 + "(" + 链接 + ")")
    调试输出("  摘要:" + 描述)
结束循环

💡 提示:实际使用中,取元素取元素列表 是否支持 XPath 或 CSS 选择器,请参考具体 API 文档。如果只支持标签名,则需结合 取子元素 进行遍历。


函数详解

解析(XML字符串)

  • 功能: 解析 XML 格式的字符串,返回一个 DOM 文档对象,供后续操作使用。若 XML 格式错误,会抛出异常(建议用 尝试...捕获 包裹)。
  • 参数: XML字符串(文本型),符合 XML 规范的字符串。
  • 返回值: DOM 文档对象(可进一步调用其他函数)。
  • 示例:
    变量 文档 = 解析器.解析("<root><child>内容</child></root>")
    

取元素(选择器)

  • 功能: 根据选择器(如标签名或 XPath)获取匹配的第一个元素节点。
  • 参数: 选择器(文本型),具体语法取决于实现(常见为标签名或 XPath)。
  • 返回值: 元素节点对象,若未找到则返回
  • 示例: 变量 元素 = 解析器.取元素("book")

取元素列表(选择器)

  • 功能: 根据选择器获取所有匹配的元素节点,返回一个数组。
  • 参数: 选择器(文本型)。
  • 返回值: 数组,每个元素为一个节点对象,若未找到则返回空数组 []
  • 示例: 变量 列表 = 解析器.取元素列表("item")

取文本(元素)

  • 功能: 获取指定元素节点的文本内容(不包含子元素标签,仅文本值)。
  • 参数: 元素(节点对象),由 取元素取子元素 等返回。
  • 返回值: 文本型,元素的文本内容。
  • 示例: 变量 内容 = 解析器.取文本(元素)

取属性(元素, 属性名)

  • 功能: 获取指定元素的指定属性值。
  • 参数:
    • 元素(节点对象)
    • 属性名(文本型),属性名称。
  • 返回值: 文本型,属性值;若属性不存在则返回空字符串 ""
  • 示例: 变量 id = 解析器.取属性(元素, "id")

取子元素(元素)

  • 功能: 获取指定元素的所有直接子元素节点(不包含文本节点和注释等)。
  • 参数: 元素(节点对象)。
  • 返回值: 数组,子元素节点列表。
  • 示例: 变量 子节点 = 解析器.取子元素(根元素)

取父元素(元素)

  • 功能: 获取指定元素的父元素节点。
  • 参数: 元素(节点对象)。
  • 返回值: 节点对象,父元素;若为根节点则返回
  • 示例: 变量 父 = 解析器.取父元素(子元素)

⚠️ 注意事项

  1. 异常处理解析() 在遇到格式错误的 XML 时会抛出异常,建议使用 尝试...捕获 包裹,避免应用崩溃。
  2. 选择器支持范围取元素取元素列表 的选择器语法取决于底层实现(可能是 XPath 或 CSS 选择器)。建议参考实际 SDK 说明,本文档仅作示意。
  3. 节点类型取子元素 仅返回元素节点(Element),不包含文本节点或注释,便于遍历。
  4. 文本内容提取取文本 会返回元素内所有子文本节点合并后的结果,例如 <p>Hello <b>World</b></p> 会返回 "Hello World"
  5. 命名空间:如果 XML 使用了命名空间(xmlns),选择器可能需要指定命名空间前缀,具体支持情况请查证。
  6. 空值处理:所有返回节点或数组的函数,若未找到都会返回空([]),应做判空处理。
  7. 性能考虑:对于超大 XML 文件,解析可能消耗较多内存,建议在后台任务中处理(可配合 后台任务 组件)。
  8. 与 JSON 对比:XML 解析比 JSON 更复杂,若非必要,推荐优先使用 JSON 数据格式。

相关文档

  • 文档不可视类型组件_后台任务 —— 在后台线程中执行耗时解析
  • 文档前端(JavaScript)函数_数据操作类 —— 解析XML文本 等前端函数
  • 文档轻语言网站:轻语言语法速查 —— 异常处理(尝试...捕获)语法
  • 文档服务端(PHP)函数 —— 后端 PHP 的 XML 处理函数

组件:后台任务

后台任务组件是一个不可视组件,基于 Web Worker 技术,用于在后台线程中执行耗时的 JavaScript 代码,而不会阻塞主线程(UI 渲染)。它支持加载外部脚本、发送和接收消息、终止任务等操作。适用于复杂计算、大数据处理、图像处理、文件解析等需要长时间运行的场景。

典型使用场景:

  • 大量数据计算(排序、过滤、统计分析)
  • 图像/视频处理(滤镜、压缩、格式转换)
  • 大文件解析(CSV、JSON、XML 大文件)
  • 加密/解密操作(密码哈希、数据加解密)
  • 后台定时轮询或数据同步

快速索引

你想知道什么直接看这里
如何加载 Worker 脚本加载文件(Worker脚本路径)
如何向 Worker 发送消息发送消息(数据)
如何接收 Worker 消息置收到消息回调(回调函数)
如何终止 Worker停止()
如何重新加载 Worker重新加载(Worker脚本路径)
如何检查 Worker 是否在运行取状态()
如何监听 Worker 错误置发生错误回调(回调函数)
组件与主线程的关系见下方“与主线程的区别”

基础示例

最简单的后台任务使用流程:加载 Worker → 发送数据 → 接收结果 → 终止 Worker。

变量 worker = 创建 后台任务()

' 1. 设置事件回调(需在加载前设置)
worker.置收到消息回调((事件源) => {
    调试输出("✅ Worker 返回结果:" + 事件源.data)
})

worker.置发生错误回调((事件源) => {
    调试输出("❌ Worker 错误:" + 事件源.message)
})

' 2. 加载 Worker 脚本文件(该文件需独立编写,运行在 Worker 线程中)
变量 是否支持 = worker.加载文件("static/worker.js")
如果(是否支持 == 假)
    弹出提示("当前浏览器不支持 Web Worker")
    返回
结束 如果

' 3. 向 Worker 发送数据
worker.发送消息({ action: "calculate", data: [1, 2, 3, 4, 5] })

' 4. 等待结果(在回调中接收)

' 5. 使用完毕后终止 Worker(释放资源)
延时执行(() => {
    worker.停止()
    调试输出("Worker 已终止")
}, 10000)

综合示例:大数据排序与统计

本示例模拟一个大数据处理场景:主线程生成一个包含 10 万条记录的数组,发送给 Worker 进行排序和统计,Worker 处理完成后返回结果,主线程更新 UI。

' ========== 创建 Worker 客户端 ==========
变量 worker = 创建 后台任务()

' ========== 设置事件回调 ==========
' 接收消息
worker.置收到消息回调((事件源) => {
    变量 数据 = 事件源.data
    ' 假设 Worker 返回 JSON 格式的结果
    变量 结果 = JSON解析(数据)
    调试输出("📊 处理完成!")
    调试输出("  排序后前 10 条:" + JSON编码(结果.前10条))
    调试输出("  平均值:" + 结果.平均值)
    调试输出("  最大值:" + 结果.最大值)
    调试输出("  最小值:" + 结果.最小值)
    弹出提示("数据处理完成!共 " + 结果.总数 + " 条记录")
})

' 监听错误
worker.置发生错误回调((事件源) => {
    调试输出("❌ Worker 错误:" + 事件源.message)
    弹出提示("计算过程中发生错误,请检查 Worker 脚本")
})

' ========== 加载 Worker 脚本 ==========
变量 加载成功 = worker.加载文件("static/data_worker.js")
如果(加载成功 == 假)
    弹出提示("浏览器不支持 Web Worker,无法执行后台任务")
    返回
结束 如果

' ========== 生成模拟数据(10万条) ==========
变量 数据列表 = []
变量循环(i = 1, 100001, 1)
    添加成员(数据列表, 取随机整数(1, 10000))
结束循环
调试输出("📦 已生成 " + 取数组成员数(数据列表) + " 条数据")

' ========== 发送数据给 Worker 处理 ==========
变量 消息 = {
    action: "sort_and_stats",
    data: 数据列表
}
worker.发送消息(JSON编码(消息))

' ========== 在页面关闭时清理资源 ==========
事件 页面被关闭()
    worker.停止()
结束 事件

配套 Worker 脚本示例(static/data_worker.js):

// 监听主线程消息
self.onmessage = function(event) {
    var data = event.data;
    
    if (data.action === "sort_and_stats") {
        var list = data.data;
        var total = list.length;
        
        // 执行排序(耗时操作)
        var sorted = list.slice().sort(function(a, b) { return a - b; });
        
        // 计算统计值
        var sum = 0;
        for (var i = 0; i < total; i++) {
            sum += list[i];
        }
        var avg = sum / total;
        var max = sorted[total - 1];
        var min = sorted[0];
        var top10 = sorted.slice(0, 10);
        
        // 返回结果给主线程
        self.postMessage(JSON.stringify({
            total: total,
            前10条: top10,
            平均值: avg,
            最大值: max,
            最小值: min
        }));
    }
};

// 错误处理
self.onerror = function(error) {
    console.error("Worker 内部错误:", error);
    self.postMessage(JSON.stringify({ error: error.message }));
};

函数详解

加载文件(Worker脚本路径)

  • 功能: 加载指定的 Worker 脚本文件,创建 Worker 线程。若浏览器不支持 Web Worker,返回
  • 参数: Worker脚本路径(文本型),相对于项目的脚本文件路径(通常放在 static/ 目录下)。
  • 返回值: 逻辑型, 表示浏览器支持且加载成功; 表示不支持。
  • 示例: worker.加载文件("static/task.js")

发送消息(数据)

  • 功能: 向 Worker 线程发送消息。数据会被拷贝到 Worker 线程中(而非共享引用)。
  • 参数: 数据,可以是文本、数字、数组、对象等,但必须可序列化为 JSON(不能包含函数)。
  • 返回值: 无。
  • 示例: worker.发送消息({ cmd: "start", id: 123 })

停止()

  • 功能: 立即终止 Worker 线程,释放资源。终止后 Worker 无法再发送或接收消息,如需重新使用需再次调用 加载文件
  • 返回值: 无。
  • 示例: worker.停止()

重新加载(Worker脚本路径)

  • 功能: 终止当前 Worker(如果存在)并使用指定的脚本路径重新创建 Worker。
  • 参数: Worker脚本路径(文本型,可选),若省略则使用上次加载的路径。
  • 返回值: 无。
  • 示例: worker.重新加载()worker.重新加载("static/new_worker.js")

取状态()

  • 功能: 获取当前 Worker 是否正在运行。
  • 返回值: 逻辑型, 表示 Worker 正在运行; 表示未加载或已停止。
  • 示例: 如果(worker.取状态()) 调试输出("Worker 运行中")

回调设置函数

所有回调函数必须在调用 加载文件 之前设置,否则可能错过早期消息。

置收到消息回调(回调函数)

  • 功能: 设置接收 Worker 消息时的回调函数。
  • 参数: 回调函数,格式为 (事件源) => { ... }事件源.data 为 Worker 发送的数据。
  • 示例:
    worker.置收到消息回调((事件源) => {
        调试输出("Worker 返回:" + 事件源.data)
    })
    

置发生错误回调(回调函数)

  • 功能: 设置 Worker 发生错误时的回调函数(如脚本语法错误、运行时异常等)。
  • 参数: 回调函数,格式为 (事件源) => { ... }事件源.message 包含错误信息。
  • 示例:
    worker.置发生错误回调((事件源) => {
        调试输出("Worker 内部错误:" + 事件源.message)
    })
    

事件说明

后台任务组件的事件与上述回调函数一一对应。

事件对应回调触发时机
收到消息(事件源)置收到消息回调Worker 发送消息给主线程
发生错误(事件源)置发生错误回调Worker 内部发生错误

与主线程的区别

维度主线程(UI 线程)Worker 线程(后台任务)
DOM 操作✅ 可以❌ 不可以
UI 渲染✅ 可以❌ 不可以
window 对象✅ 可访问❌ 不可访问
document 对象✅ 可访问❌ 不可访问
alert / 弹出提示✅ 可以❌ 不可以(需通过消息通知主线程)
资源共享❌ 不能共享内存(数据通过拷贝传递)
执行阻塞会阻塞 UI不会阻塞 UI
适用场景交互逻辑、UI 更新计算、解析、耗时操作

⚠️ 注意事项

  1. 脚本独立性:Worker 脚本是独立运行的,不能直接访问主线程的变量、函数或 DOM。所有数据交换需通过 发送消息置收到消息回调 实现。
  2. 数据拷贝:主线程与 Worker 之间的数据传递是值拷贝(而非引用传递),大数据量时会有性能开销。
  3. 浏览器支持:Web Worker 在现代浏览器中广泛支持,但 IE 等旧浏览器不支持。可通过 加载文件 的返回值判断。
  4. 跨域限制:Worker 脚本需与页面同源(除非使用 blob: URL),否则会被浏览器阻止。
  5. 资源释放:Worker 运行时会占用系统资源,使用完毕后应及时调用 停止() 释放。
  6. 错误处理:务必设置 置发生错误回调,否则 Worker 内部错误可能静默失败,难以调试。
  7. 加载顺序加载文件 是异步的,但消息发送可在加载后立即进行,Worker 会排队处理。
  8. 线程数量:浏览器对 Worker 数量有限制,不建议创建过多 Worker。
  9. 共享 Worker:若需多个页面共享同一个 Worker,可使用 共享后台任务(SharedWorker),本组件暂不支持。
  10. 调试技巧:Worker 脚本中的 console.log 会输出到浏览器控制台,可用于调试。

相关文档

  • 文档不可视类型组件_WS客户端 —— WebSocket 实时通信
  • 文档不可视类型组件_SSE —— 服务器推送事件
  • 文档前端(JavaScript)函数_数据操作类 —— 前端数据处理函数
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、JSON 操作等
  • 文档综合演示:大数据处理 —— 实际应用示例

组件:地理定位器

地理定位器组件是一个不可视组件,用于获取设备的地理位置信息(经纬度、海拔、速度等),并支持持续监听位置变化。它基于浏览器的 Geolocation API 实现,适用于位置服务、地图应用、定位导航、轨迹记录等场景。注意: 使用前需获得用户明确授权,且仅在 HTTPS 环境下可用。

典型使用场景:

  • 地图应用(显示用户当前位置)
  • 位置签到(打卡、签到功能)
  • 导航与轨迹记录(运动轨迹、行车路线)
  • 基于位置的服务(附近的人、周边推荐)
  • 物流追踪(包裹实时位置)

快速索引

你想知道什么直接看这里
如何获取当前位置获取位置(成功回调, 失败回调)
如何持续监听位置变化监听位置被改变(回调函数)
如何停止监听停止监听()
位置对象包含哪些信息见下方“位置信息详解”
如何判断用户是否授权通过错误回调判断(权限被拒绝
如何检查是否支持定位调用 获取位置 并观察是否立即返回错误

基础示例

最简单的使用流程:获取当前位置 → 处理位置信息 → 处理错误。

变量 定位器 = 创建 地理定位器()

' 1. 获取当前位置
定位器.获取位置((位置对象) => {
        ' 成功回调
        调试输出("✅ 获取位置成功")
        调试输出("  纬度:" + 位置对象.coords.latitude)
        调试输出("  经度:" + 位置对象.coords.longitude)
        调试输出("  精度:" + 位置对象.coords.accuracy + " 米")
        弹出提示("当前位置:经度 " + 位置对象.coords.longitude + ",纬度 " + 位置对象.coords.latitude)
    },(错误对象) => {
        ' 失败回调
        调试输出("❌ 获取位置失败:" + 错误对象.message)
        如果(错误对象.code == 1)
            弹出提示("用户拒绝了位置授权")
        否则 如果(错误对象.code == 2)
            弹出提示("位置信息不可用,请检查GPS或网络")
        否则 如果(错误对象.code == 3)
            弹出提示("获取位置超时,请重试")
        否则
            弹出提示("定位失败:" + 错误对象.message)
        结束 如果
    }
)

综合示例:实时轨迹记录

本示例模拟一个轨迹记录应用,持续监听位置变化,并将每次位置更新添加到列表中,可用于运动记录、路线绘制等场景。

变量 定位器 = 创建 地理定位器()
变量 轨迹点列表 = []
变量 是否记录 = 假

' ========== 定义位置更新处理函数 ==========
函数 处理位置更新(位置对象)
    if (!是否记录) return
    
    变量 坐标 = 位置对象.coords
    变量 点 = {
        latitude: 坐标.latitude,
        longitude: 坐标.longitude,
        accuracy: 坐标.accuracy,
        altitude: 坐标.altitude,
        speed: 坐标.speed,
        timestamp: 位置对象.timestamp
    }
    添加成员(轨迹点列表, 点)
    
    变量 点数 = 取数组成员数(轨迹点列表)
    调试输出("📍 记录点 " + 点数 + ":(" + 坐标.latitude + ", " + 坐标.longitude + ")")
    ' 可在此更新 UI,例如在地图上绘制标记
结束 函数

' ========== 开始记录 ==========
函数 开始记录()
    是否记录 = 真
    
    ' 先获取一次当前位置(立即获取)
    定位器.获取位置((位置对象) => {
            处理位置更新(位置对象)
            ' 然后开始持续监听
            定位器.监听位置被改变(处理位置更新)
            弹出提示("开始记录轨迹")
        },(错误对象) => {
            弹出提示("无法获取位置:" + 错误对象.message)
            是否记录 = 假
        }
    )
结束 函数

' ========== 停止记录 ==========
函数 停止记录()
    是否记录 = 假
    定位器.停止监听()
    变量 点数 = 取数组成员数(轨迹点列表)
    弹出提示("已停止记录,共记录 " + 点数 + " 个轨迹点")
    调试输出("📊 轨迹点总数:" + 点数)
结束 函数

' ========== 演示:开始记录,5秒后停止 ==========
开始记录()
延时执行(() => {
    停止记录()
}, 5000)

函数详解

获取位置(成功回调, 失败回调)

  • 功能: 获取设备当前的地理位置信息(单次获取)。该方法会向用户弹窗请求授权(首次使用时)。
  • 参数:
    • 成功回调:函数,格式为 (位置对象) => { ... },位置对象包含经纬度、精度、海拔等信息(详见下方“位置信息详解”)。
    • 失败回调:函数,格式为 (错误对象) => { ... },错误对象包含 codemessage 属性。
  • 返回值: 无。
  • 示例: 见基础示例。

监听位置被改变(回调函数)

  • 功能: 持续监听设备位置变化,每当位置更新时触发回调。适合实时跟踪场景(如导航)。
  • 参数: 回调函数,格式同 成功回调,每次位置变化都会调用。
  • 返回值: 无。
  • 示例: 定位器.监听位置被改变((位置) => { 调试输出(位置.coords.latitude) })

停止监听()

  • 功能: 停止位置变化监听,释放相关资源。不再触发 监听位置被改变 的回调。
  • 返回值: 无。
  • 示例: 定位器.停止监听()

位置信息详解

成功回调 返回的 位置对象 包含以下属性:

属性类型说明
coords.latitude数值纬度(-90 到 90)
coords.longitude数值经度(-180 到 180)
coords.accuracy数值经纬度精度(米)
coords.altitude数值(可能为 海拔(米)
coords.altitudeAccuracy数值(可能为 海拔精度(米)
coords.heading数值(可能为 行进方向(0-360 度,相对正北)
coords.speed数值(可能为 速度(米/秒)
timestamp数值时间戳(毫秒)

💡 部分属性(如 headingspeed)仅在移动设备且启用 GPS 时有效,桌面浏览器通常为


错误对象详解

失败回调 返回的 错误对象 包含以下属性:

属性说明
code错误码:1 用户拒绝授权,2 位置不可用(如 GPS 关闭),3 获取超时
message错误描述文本

事件说明

地理定位器组件的事件与回调函数对应关系如下:

事件对应方法触发时机
位置被改变(事件源)监听位置被改变位置发生变化(持续监听模式下)

注意: 获取位置 的成功/失败是通过回调函数传递的,没有对应的事件。


⚠️ 注意事项

  1. 用户授权:首次调用 获取位置 会弹窗请求权限,用户拒绝后需引导用户手动开启(在浏览器设置中)。
  2. HTTPS 要求:地理定位功能仅在安全上下文(HTTPS)或 localhost 下可用。
  3. 超时设置:目前组件未提供超时配置,默认超时时间由浏览器决定(通常较长),若需调整可考虑封装自定义逻辑。
  4. 功耗与电量:持续监听位置变化会消耗较多电量,建议在不需要时调用 停止监听()
  5. 精度与响应速度accuracy 越小精度越高,但获取时间可能更长。浏览器会根据设备自动平衡。
  6. 位置缓存:有时浏览器会返回缓存的位置数据,可通过 timestamp 判断是否过旧。
  7. 错误处理:务必设置失败回调,尤其是处理用户拒绝授权的情况,提供友好的降级方案。
  8. 后台运行:浏览器页面切换到后台时,位置监听可能被暂停或节流,建议结合页面可见性 API 管理监听状态。
  9. 模拟器测试:在浏览器开发者工具中,可模拟位置数据(Chrome DevTools 的 Sensors 面板)。
  10. 坐标系:返回的经纬度为 WGS84 坐标系,可直接用于主流地图服务(如高德、百度需要转换坐标系)。

相关文档

  • 文档不可视类型组件_后台任务 —— 后台线程处理
  • 文档图像类组件_画板 —— 绘制位置轨迹
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、条件判断等
  • 文档综合演示:轨迹记录应用 —— 实际应用示例

组件:对话框

对话框组件是一个用于在页面中弹出自定义内容窗口的不可视组件,支持设置标题、内容(视图/HTML/URL)、宽度、高度、最大高度,并可控制点击遮罩层是否关闭。它常用于信息确认、表单编辑、内容展示等需要临时浮层交互的场景。

典型使用场景:

  • 信息确认(删除确认、操作确认)
  • 表单编辑(在弹窗中编辑数据)
  • 内容展示(详情查看、图片放大)
  • 通知提示(重要通知、系统消息)
  • 自定义弹窗(替代浏览器原生 alert/confirm)

快速索引

你想知道什么直接看这里
如何设置对话框标题标题 属性
如何设置对话框尺寸宽度 / 高度 / 最大高度 属性
如何设置对话框内容(视图组件)置视图(视图对象)
如何设置对话框内容(HTML)置HTML(HTML内容)
如何加载外部页面加载URL(URL地址)
如何显示对话框显示()
如何关闭对话框关闭()
如何监听关闭事件置被关闭回调(回调函数)
如何控制点击遮罩是否关闭点击遮罩层关闭 属性

基础示例

最简单的对话框使用流程:创建对话框 → 设置内容 → 显示 → 关闭。

变量 对话框1 = 创建 对话框()

' 1. 设置基本属性
对话框1.标题 = "提示"
对话框1.宽度 = 400
对话框1.高度 = 200
对话框1.最大高度 = 500
对话框1.点击遮罩层关闭 = 真

' 2. 设置内容(HTML 方式)
对话框1.置HTML("<p style='padding:20px;'>这是一个简单的对话框内容</p>")

' 3. 设置关闭回调
对话框1.置被关闭回调((源对象) => {
    调试输出("对话框已关闭")
})

' 4. 显示对话框
对话框1.显示()

' 5. 延时自动关闭
延时执行(() => {
    对话框1.关闭()
}, 5000)

综合示例:表单编辑对话框

本示例展示一个完整的表单编辑对话框,包含输入字段、保存/取消按钮,并演示数据回填和保存逻辑。

' ========== 创建对话框 ==========
变量 编辑对话框 = 创建 对话框()
编辑对话框.标题 = "编辑用户信息"
编辑对话框.宽度 = 480
编辑对话框.高度 = 360
编辑对话框.最大高度 = 500
编辑对话框.点击遮罩层关闭 = 假  ' 禁止点击遮罩关闭,防止误操作

' ========== 创建对话框内容(使用视图组件) ==========
' 创建一个弹性布局作为内容容器
变量 内容容器 = 创建 弹性布局()
内容容器.方向 = "column"
内容容器.内边距 = "20px"
内容容器.宽度 = 匹配父

' 姓名输入
变量 姓名标签 = 创建 标签()
姓名标签.文本 = "姓名"
姓名标签.字体大小 = "14px"
姓名标签.文本颜色 = "#666"
姓名标签.内边距 = "0 0 4px 0"
内容容器.添加组件(姓名标签)

变量 姓名输入 = 创建 单行输入框()
姓名输入.宽度 = 匹配父
姓名输入.高度 = 36
姓名输入.提示文本 = "请输入姓名"
姓名输入.边框 = "1px solid #d9d9d9"
姓名输入.边框圆角 = "4px"
姓名输入.内边距 = "8px 12px"
内容容器.添加组件(姓名输入)

' 邮箱输入
变量 邮箱标签 = 创建 标签()
邮箱标签.文本 = "邮箱"
邮箱标签.字体大小 = "14px"
邮箱标签.文本颜色 = "#666"
邮箱标签.内边距 = "12px 0 4px"
内容容器.添加组件(邮箱标签)

变量 邮箱输入 = 创建 单行输入框()
邮箱输入.宽度 = 匹配父
邮箱输入.高度 = 36
邮箱输入.提示文本 = "请输入邮箱"
邮箱输入.边框 = "1px solid #d9d9d9"
邮箱输入.边框圆角 = "4px"
邮箱输入.内边距 = "8px 12px"
内容容器.添加组件(邮箱输入)

' 按钮组(使用弹性布局水平排列)
变量 按钮组 = 创建 弹性布局()
按钮组.方向 = "row"
按钮组.主轴对齐 = "flex-end"
按钮组.间距 = 12
按钮组.内边距 = "16px 0 0 0"
内容容器.添加组件(按钮组)

变量 取消按钮 = 创建 按钮()
取消按钮.文本 = "取消"
取消按钮.宽度 = 80
取消按钮.高度 = 36
取消按钮.背景颜色 = "#d9d9d9"
取消按钮.文本颜色 = "#333"
取消按钮.边框圆角 = "4px"
按钮组.添加组件(取消按钮)

变量 保存按钮 = 创建 按钮()
保存按钮.文本 = "保存"
保存按钮.宽度 = 80
保存按钮.高度 = 36
保存按钮.背景颜色 = "#1890ff"
保存按钮.文本颜色 = "#ffffff"
保存按钮.边框圆角 = "4px"
按钮组.添加组件(保存按钮)

' ========== 设置对话框内容 ==========
编辑对话框.置视图(内容容器)

' ========== 数据回填(模拟编辑场景) ==========
函数 打开编辑对话框(用户名, 邮箱)
    姓名输入.内容 = 用户名
    邮箱输入.内容 = 邮箱
    编辑对话框.显示()
结束 函数

' ========== 按钮事件绑定 ==========
取消按钮.置被单击回调((源对象) => {
    编辑对话框.关闭()
})

保存按钮.置被单击回调((源对象) => {
    变量 姓名 = 删首尾空(姓名输入.内容)
    变量 邮箱 = 删首尾空(邮箱输入.内容)
    
    如果(姓名 == "")
        弹出提示("请输入姓名")
        姓名输入.获取焦点()
        返回
    结束 如果
    如果(邮箱 == "")
        弹出提示("请输入邮箱")
        邮箱输入.获取焦点()
        返回
    结束 如果
    
    弹出提示("保存成功!\n姓名:" + 姓名 + "\n邮箱:" + 邮箱)
    编辑对话框.关闭()
})

' ========== 对话框关闭回调 ==========
编辑对话框.置被关闭回调((源对象) => {
    调试输出("编辑对话框已关闭")
})

' ========== 打开对话框(模拟点击编辑按钮) ==========
' 实际使用中,可由某个按钮触发
延时执行(() => {
    打开编辑对话框("张三", "zhangsan@example.com")
}, 500)

属性详解

标题

  • 类型: 文本型
  • 说明: 设置或获取对话框的标题文本,显示在对话框顶部。若为空,标题栏可能仍保留(取决于组件实现)。

宽度

  • 类型: 文本型数值型
  • 说明: 设置或获取对话框内容区域的宽度。支持数值(默认像素)或带单位的字符串(如 "80%")。

高度

  • 类型: 文本型数值型
  • 说明: 设置或获取对话框内容区域的高度。支持数值或带单位的字符串。

最大高度

  • 类型: 文本型数值型
  • 说明: 设置或获取对话框内容区域的最大高度。当内容超出时,会出现滚动条。

点击遮罩层关闭

  • 类型: 逻辑型
  • 说明: 设置或获取点击对话框背景遮罩层时是否关闭对话框。默认为 (不关闭)。若设为 ,用户点击遮罩即可关闭,适合轻量提示场景。

函数详解

置视图(视图对象 | HTML | DOM节点)

  • 功能: 设置对话框的内容区域,支持传入视图组件、HTML 字符串或原生 DOM 节点。
  • 参数:
    • 视图对象:继承自 视图 的组件实例(如 标签弹性布局 等)
    • HTML:文本型 HTML 字符串
    • DOM节点:原生 DOM 元素
  • 返回值: 无。
  • 示例: 对话框1.置视图(面板1)

置HTML(HTML内容)

  • 功能: 设置对话框内容为 HTML 字符串,与 置视图 的 HTML 模式等效。
  • 参数: HTML内容(文本型)
  • 返回值: 无。
  • 示例: 对话框1.置HTML("<p>Hello</p>")

加载URL(URL地址)

  • 功能: 在对话框内容区域中加载并显示指定 URL 的页面(通过 <iframe> 实现)。
  • 参数: URL地址(文本型)
  • 返回值: 无。
  • 示例: 对话框1.加载URL("https://example.com")

显示()

  • 功能: 显示对话框(触发弹出动画)。若对话框已显示,重复调用无效果。
  • 返回值: 无。
  • 示例: 对话框1.显示()

关闭()

  • 功能: 关闭对话框(触发关闭动画),并从 DOM 中移除。会触发 置被关闭回调
  • 返回值: 无。
  • 示例: 对话框1.关闭()

置被关闭回调(回调函数)

  • 功能: 设置对话框关闭时的回调函数,无论通过点击关闭按钮、点击遮罩(若启用)还是调用 关闭(),都会触发。
  • 参数: 回调函数,格式为 (源对象) => { ... }源对象 为对话框组件本身。
  • 返回值: 无。
  • 示例: 对话框1.置被关闭回调((源) => { 调试输出("关闭") })

⚠️ 注意事项

  1. 内容设置方式互斥置视图置HTML加载URL 会相互覆盖,最后调用的生效。建议只使用其中一种。
  2. 显示时机:建议先设置好内容和属性,最后调用 显示()。对话框在未调用 显示() 前不会出现在页面上。
  3. 多次使用:对话框可重复使用(调用 显示()关闭() 多次),内容会保留上次设置的数据(除非手动清空)。
  4. 遮罩层行为点击遮罩层关闭 默认为 ,建议在轻提示场景设为 ,在表单编辑场景设为 以防止误关。
  5. 滚动条:当内容超出 最大高度 时,内容区域会出现滚动条,不会影响对话框整体尺寸。
  6. 关闭回调置被关闭回调 在对话框完全关闭后触发,可用于刷新主页面数据或执行清理操作。
  7. 嵌套对话框:不建议在对话框中再打开新的对话框,可能导致遮罩层层级混乱。
  8. 跨域加载加载URL 加载外部页面可能受跨域策略限制,部分操作可能无法执行。
  9. 资源释放:对话框关闭后会自动从 DOM 移除,无需手动销毁。但若内容中包含定时器或事件监听,建议在关闭回调中主动清理。
  10. 弹出提示 的区别弹出提示 是轻量级 toast 通知,而对话框是更重型的模态窗口,适合承载复杂交互内容。

相关文档

  • 文档其它通用类组件_抽屉 —— 侧边滑出面板
  • 文档其它通用类组件_通知提醒框 —— 轻量级通知
  • 文档文本类组件_按钮 —— 对话框内常用交互组件
  • 文档文本类组件_单行输入框 —— 对话框内表单输入
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、条件判断等
  • 文档综合演示:表单编辑对话框 —— 实际应用示例

组件:分隔线

分隔线组件用于在页面中创建视觉分割线,将不同内容区域或功能模块进行区隔。它支持水平/垂直两种方向、实线/虚线样式,并可在线条中间或两端显示文本。常用于表单分组、内容区分、视觉层次划分等场景。该组件基于 HTML <hr><div> 元素封装,轻量且易于使用。

典型使用场景:

  • 表单字段分组(个人信息与联系方式之间的分隔)
  • 内容区域划分(文章段落间的视觉分隔)
  • 登录/注册表单中的“或”分隔线
  • 侧边栏菜单分组
  • 卡片或面板内的装饰性分隔

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置分割线方向类型分隔线1.类型 = "vertical"
设置线条样式(实线/虚线)虚线分隔线1.虚线 = 真
设置线条颜色颜色分隔线1.颜色 = "#1890ff"
设置显示文本文本分隔线1.文本 = "或"
设置文本位置文本位置分隔线1.文本位置 = "left"
设置文本颜色文本颜色分隔线1.文本颜色 = "#999"
调整分隔线尺寸宽度 / 高度分隔线1.宽度 = 400

样式美化参考

分隔线的样式可通过以下属性进行精细控制:

  • 方向与尺寸
    • 水平分隔线(默认):通过 宽度 控制线条长度,高度 控制线条粗细(建议 "1px""2px")。
    • 垂直分隔线:通过 高度 控制线条长度,宽度 控制线条粗细(建议 "1px""2px")。
  • 线条样式虚线 属性设为 时,线条变为虚线样式,默认为实线。
  • 颜色控制颜色 设置线条颜色,文本颜色 设置文本颜色(若 文本 非空)。
  • 文本显示:当 文本 属性设置非空字符串时,线条中间(或根据 文本位置)会显示该文本,线条被文本截断。
  • 文本位置文本位置 支持 "left""center""right",分别对应文本左对齐、居中、右对齐。
  • 继承属性:通过 背景颜色边框外边距内边距 等可进一步美化容器。

基础示例

创建一个简单的水平分隔线,居中显示“或”字。

变量 分隔线1 = 创建 分隔线()
分隔线1.左边 = 50
分隔线1.顶边 = 50
分隔线1.宽度 = 400
分隔线1.高度 = 2
分隔线1.颜色 = "#d9d9d9"
分隔线1.文本 = "或"
分隔线1.文本位置 = "center"
分隔线1.文本颜色 = "#999"
分隔线1.字体大小 = "14px"
添加组件(分隔线1)

综合示例:表单分组与装饰分隔线

本示例在一个用户注册表单中,使用分隔线将“个人信息”和“账号信息”两个区域分开,并在表单底部添加一条带“已有账号?”文本的分隔线。

' ========== 创建表单容器 ==========
变量 表单容器 = 创建 绝对布局()
表单容器.左边 = 50
表单容器.顶边 = 30
表单容器.宽度 = 360
表单容器.背景颜色 = "#ffffff"
表单容器.边框 = "1px solid #e8e8e8"
表单容器.边框圆角 = "12px"
表单容器.内边距 = "24px"
添加组件(表单容器)

' 标题
变量 标题 = 创建 标签()
标题.文本 = "📝 用户注册"
标题.字体大小 = "20px"
标题.字体粗细 = "bold"
标题.文本颜色 = "#333"
标题.内边距 = "0 0 16px 0"
表单容器.添加组件(标题)

' -------- 第一组:个人信息 --------
变量 个人信息标签 = 创建 标签()
个人信息标签.文本 = "个人信息"
个人信息标签.字体大小 = "14px"
个人信息标签.字体粗细 = "bold"
个人信息标签.文本颜色 = "#666"
个人信息标签.内边距 = "8px 0"
表单容器.添加组件(个人信息标签)

' 姓名输入框
变量 姓名输入 = 创建 单行输入框()
姓名输入.提示文本 = "请输入姓名"
姓名输入.宽度 = 312
表单容器.添加组件(姓名输入)

' 邮箱输入框
变量 邮箱输入 = 创建 单行输入框()
邮箱输入.提示文本 = "请输入邮箱"
邮箱输入.类型 = "email"
邮箱输入.宽度 = 312
表单容器.添加组件(邮箱输入)

' -------- 第一条分隔线 --------
变量 分隔线1 = 创建 分隔线()
分隔线1.宽度 = 312
分隔线1.颜色 = "#e8e8e8"
分隔线1.高度 = 1
分隔线1.内边距 = "12px 0"
表单容器.添加组件(分隔线1)

' -------- 第二组:账号信息 --------
变量 账号信息标签 = 创建 标签()
账号信息标签.文本 = "账号信息"
账号信息标签.字体大小 = "14px"
账号信息标签.字体粗细 = "bold"
账号信息标签.文本颜色 = "#666"
账号信息标签.内边距 = "8px 0"
表单容器.添加组件(账号信息标签)

' 用户名输入
变量 用户名输入 = 创建 单行输入框()
用户名输入.提示文本 = "请设置用户名"
用户名输入.宽度 = 312
表单容器.添加组件(用户名输入)

' 密码输入
变量 密码输入 = 创建 单行输入框()
密码输入.提示文本 = "请设置密码"
密码输入.类型 = "password"
密码输入.宽度 = 312
表单容器.添加组件(密码输入)

' -------- 第二条分隔线(带文本) --------
变量 分隔线2 = 创建 分隔线()
分隔线2.宽度 = 312
分隔线2.颜色 = "#d9d9d9"
分隔线2.高度 = 1
分隔线2.文本 = "已有账号?"
分隔线2.文本位置 = "center"
分隔线2.文本颜色 = "#999"
分隔线2.字体大小 = "12px"
分隔线2.内边距 = "16px 0"
表单容器.添加组件(分隔线2)

' 注册按钮
变量 注册按钮 = 创建 按钮()
注册按钮.文本 = "立即注册"
注册按钮.宽度 = 312
注册按钮.高度 = 44
注册按钮.背景颜色 = "#1890ff"
注册按钮.文本颜色 = "#ffffff"
注册按钮.边框圆角 = "6px"
注册按钮.字体大小 = "16px"
表单容器.添加组件(注册按钮)

' 登录链接
变量 登录链接 = 创建 超链接()
登录链接.文本 = "去登录"
登录链接.地址 = "#"
登录链接.文本颜色 = "#1890ff"
登录链接.字体大小 = "14px"
登录链接.内容水平对齐 = "center"
登录链接.内边距 = "8px 0"
表单容器.添加组件(登录链接)

' ========== 调整组件位置(使用绝对布局) ==========
' 由于绝对布局需要手动设置位置,这里简化:实际项目中可使用弹性布局自动排列。
' 本示例仅演示分隔线的使用,组件的精确定位略。

属性详解

文本

  • 类型: 文本型
  • 说明: 设置或获取分割线中显示的文本内容。若设置为空字符串 "",则显示为纯线条(无文本)。默认值为空。

虚线

  • 类型: 逻辑型
  • 说明: 设置或获取线条是否为虚线样式。当为 时,线条显示为虚线;为 时显示为实线。默认

文本位置

  • 类型: 文本型
  • 说明: 设置或获取文本在分割线上的位置。可选值:
    • "left":文本左对齐(在左侧显示)
    • "center":文本居中对齐(默认)
    • "right":文本右对齐(在右侧显示) 仅在 文本 非空时有效。

类型

  • 类型: 文本型
  • 说明: 设置或获取分割线的方向。可选值:
    • "horizontal"(默认):水平分割线
    • "vertical":垂直分割线 注意:垂直分割线通常需设置 高度 来指定长度,且 宽度 控制线条粗细。

颜色

  • 类型: 文本型
  • 说明: 设置或获取线条的颜色,支持 CSS 颜色值(如 "#d9d9d9""red" 等)。默认值为 "#d9d9d9"

文本颜色

  • 类型: 文本型
  • 说明: 设置或获取文本的颜色,支持 CSS 颜色值。默认值为 "#999"

⚠️ 注意事项

  1. 文本与线条的关系:当 文本 非空时,线条会从两端分别延伸至文本两侧,文本居中或根据 文本位置 定位。线条颜色由 颜色 控制,文本颜色由 文本颜色 单独控制。
  2. 垂直分隔线:垂直分隔线通常需要设置 类型 = "vertical",并指定 高度(线条长度)和 宽度(线条粗细),且 高度 值应大于零。垂直分隔线不支持文本显示(即使设置了 文本 也会被忽略)。
  3. 尺寸单位宽度高度 支持数值(默认像素)或带单位的字符串(如 "80%""200px")。水平分隔线的 高度 控制粗细,垂直分隔线的 宽度 控制粗细。
  4. 虚线样式:虚线样式可能在不同浏览器中显示略有差异,可通过 内联样式 或 CSS 类自定义 border-style 实现更多变体(如点线、双线等)。
  5. 文本位置与布局文本位置 仅影响文本在分割线上的水平位置,不影响容器自身的对齐。如需整个分隔线居中,可通过容器的 内容水平对齐显示模式 控制。
  6. 与其他组件的间距:建议通过 外边距内边距 控制分隔线与相邻组件的间距,使其视觉上舒适合适。
  7. 背景颜色:分隔线本身背景透明,如需背景色可将 背景颜色 设置为非透明值。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档文本类组件_标签 —— 配合显示文本标签
  • 文档文本类组件_超链接 —— 配合登录链接使用
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、条件判断等
  • 文档综合演示:表单分组设计 —— 实际应用示例

组件:卡片框

卡片框组件是一个通用的容器型组件,用于将相关内容聚合在一个具有边框、标题、内容和底部区域的视觉单元中。它支持自定义标题(带图标)、右侧操作区、内容区(可包含 HTML 或组件)和底部区域,并支持鼠标悬停浮起效果。适用于信息展示、功能入口、产品卡片、用户资料卡等场景。

典型使用场景:

  • 产品/服务展示卡片(商品信息、服务介绍)
  • 用户信息卡片(头像、姓名、简介、操作按钮)
  • 数据统计卡片(数字、指标、趋势)
  • 功能入口卡片(图标、标题、跳转链接)
  • 文章/新闻摘要卡片(标题、摘要、阅读更多)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置卡片标题标题卡片框1.标题 = "产品信息"
设置标题图标标题图标卡片框1.标题图标 = "📦"
设置标题右侧操作区右侧内容卡片框1.右侧内容 = "<a href='#'>更多</a>"
设置卡片内容(HTML)内容卡片框1.内容 = "<p>这是内容</p>"
设置卡片底部区底部内容卡片框1.底部内容 = "<button>操作</button>"
设置内容区内边距内边距卡片框1.内边距 = "16px"
启用/禁用悬停浮起效果悬停浮起卡片框1.悬停浮起 = 真
显示/隐藏边框边框显示卡片框1.边框显示 = 假
设置内容为自定义元素置内容元素(元素)卡片框1.置内容元素(组件.取原生对象())

样式美化参考

卡片框的外观可通过以下属性进行精细控制:

  • 整体容器:通过 宽度背景颜色(建议 "#ffffff")、边框(如 "1px solid #e8e8e8")、边框圆角(建议 "8px")等继承属性美化。
  • 标题区域标题 文本的样式可通过 字体大小字体粗细文本颜色 控制;标题图标可通过 标题图标 设置 emoji 或 SVG。
  • 右侧内容右侧内容 可放置链接、按钮或操作图标,常用于“更多”或“设置”入口。
  • 内容区内容 支持 HTML 字符串,可包含文本、图片、表格等;也可通过 置内容元素 传入自定义视图组件。
  • 底部区域底部内容 常用于放置操作按钮(如“确认”、“取消”)或额外信息。
  • 悬停浮起:当 悬停浮起 = 真 时,鼠标悬停时卡片会浮起(产生阴影和位移效果),增强交互反馈。
  • 内边距内边距 控制内容区域的内边距,建议设置为 "16px""20px"
  • 边框显示边框显示 = 假 可隐藏边框,适用于无框卡片设计。

基础示例

创建一个简单的信息卡片,包含标题、内容和底部按钮。

变量 卡片框1 = 创建 卡片框()
卡片框1.左边 = 50
卡片框1.顶边 = 50
卡片框1.宽度 = 300
卡片框1.标题 = "📢 通知"
卡片框1.内容 = "<p>系统将于今晚 22:00 进行维护升级,预计持续 2 小时。</p>"
卡片框1.底部内容 = "<button style='padding:6px 16px;background:#1890ff;color:#fff;border:none;border-radius:4px;cursor:pointer;'>我知道了</button>"
卡片框1.边框圆角 = "8px"
卡片框1.边框 = "1px solid #e8e8e8"
卡片框1.悬停浮起 = 真
卡片框1.内边距 = "16px"
添加组件(卡片框1)

综合示例:产品展示卡片

本示例构建一个产品展示卡片,包含产品图片、标题、描述、价格标签和“加入购物车”按钮,并演示悬停浮起效果。

' ========== 创建产品卡片 ==========
变量 产品卡片 = 创建 卡片框()
产品卡片.左边 = 50
产品卡片.顶边 = 50
产品卡片.宽度 = 280
产品卡片.边框 = "1px solid #e8e8e8"
产品卡片.边框圆角 = "12px"
产品卡片.背景颜色 = "#ffffff"
产品卡片.悬停浮起 = 真
产品卡片.内边距 = "0px"  ' 内容区内边距由内部元素控制
添加组件(产品卡片)

' ========== 设置卡片内容(使用 HTML) ==========
变量 图片HTML = "<div style='width:100%;height:200px;background:#f0f0f0;border-radius:12px 12px 0 0;display:flex;align-items:center;justify-content:center;font-size:48px;'>🖼️</div>"
变量 标题HTML = "<h3 style='margin:12px 16px 4px;font-size:18px;'>无线降噪耳机</h3>"
变量 描述HTML = "<p style='margin:0 16px 8px;color:#666;font-size:14px;'>主动降噪,40小时续航,轻巧便携</p>"
变量 价格HTML = "<p style='margin:0 16px 12px;font-size:20px;color:#ff4d4f;font-weight:bold;'>¥399.00 <span style='font-size:14px;color:#999;text-decoration:line-through;'>¥499.00</span></p>"
变量 按钮HTML = "<button style='margin:0 16px 16px;width:calc(100% - 32px);padding:10px;background:#1890ff;color:#fff;border:none;border-radius:6px;font-size:16px;cursor:pointer;'>加入购物车</button>"

产品卡片.内容 = 图片HTML + 标题HTML + 描述HTML + 价格HTML + 按钮HTML

' ========== 为按钮添加点击事件(通过DOM操作) ==========
' 由于内容为HTML字符串,无法直接在轻语言中绑定事件,
' 这里演示通过取原生对象后查找按钮并绑定事件
变量 原生卡片 = 产品卡片.取原生对象()
变量 按钮元素 = 查找元素By选择器("#" + 原生卡片.id + " button")
如果(按钮元素 != 空)
    ' 注意:这里使用原生JS事件绑定
    按钮元素.onclick = () => {
        弹出提示("已加入购物车!")
    }
结束 如果

属性详解

标题

  • 类型: 文本型
  • 说明: 设置或获取卡片标题文本。标题会显示在卡片顶部,字体加粗。

内容

  • 类型: 文本型
  • 说明: 设置卡片主体内容,支持 HTML 字符串。可包含文本、图片、表格、按钮等任意 HTML 元素。设置后会自动渲染到内容区。

右侧内容

  • 类型: 文本型
  • 说明: 设置标题右侧的操作区内容,支持 HTML 字符串。常用于放置“更多”链接或操作按钮。该内容会与标题在同一行右对齐。

底部内容

  • 类型: 文本型
  • 说明: 设置卡片底部区域的内容,支持 HTML 字符串。常用于放置操作按钮、补充信息或分隔线。

标题图标

  • 类型: 文本型
  • 说明: 设置标题前的图标,支持 emoji(如 "📦")或 SVG 代码。该图标会显示在标题文本左侧。

悬停浮起

  • 类型: 逻辑型
  • 说明: 设置或获取是否在鼠标悬停时启用浮起效果(阴影加深、轻微上移)。默认为

内边距

  • 类型: 文本型
  • 说明: 设置卡片内容区的内边距,支持 CSS 值(如 "16px""12px 20px")。默认值由框架决定,通常为 "16px"

边框显示

  • 类型: 逻辑型
  • 说明: 设置或获取是否显示卡片边框。当为 时,边框被隐藏(但 边框 属性仍可设置,仅控制显示状态)。默认为

函数详解

置内容元素(元素)

  • 功能: 将卡片的内容区设置为指定的 DOM 元素或视图组件。此方法会覆盖 内容 属性设置的 HTML 字符串。
  • 参数: 元素,可以是原生 DOM 节点或视图组件的实例(会自动取其原生对象)。
  • 返回值: 无。
  • 示例:
    ' 创建自定义内容组件
    变量 内容容器 = 创建 弹性布局()
    内容容器.方向 = "column"
    变量 标签1 = 创建 标签()
    标签1.文本 = "自定义内容"
    内容容器.添加组件(标签1)
    ' 设置为卡片内容
    卡片框1.置内容元素(内容容器)
    

⚠️ 注意事项

  1. 内容类型内容右侧内容底部内容 均为 HTML 字符串,若需要插入复杂组件(如按钮、表单等),建议使用 置内容元素 方法传入视图组件。
  2. 事件绑定:通过 HTML 字符串添加的按钮等元素,其事件需要原生 DOM 方式绑定(如 onclick),无法直接使用轻语言的 置被单击回调。若需要轻语言风格事件,请使用 置内容元素 传入视图组件。
  3. 悬停浮起效果悬停浮起 会为卡片添加 hover 的阴影过渡效果,可能与自定义 CSS 冲突,注意样式优先级。
  4. 内边距冲突:若 内容 中已经包含内边距,内边距 属性可能导致双重内边距,建议根据实际情况调整。
  5. 边框显示边框显示 = 假 会隐藏边框,但 边框 属性仍存在,如需完全移除边框可设置 边框 = "none"
  6. 标题图标:标题图标仅支持文本(如 emoji)或 HTML 字符串(如 SVG),不支持图片 URL。如需图片,可在标题中使用 HTML 标签。
  7. 卡片尺寸:卡片框本身是一个容器,其宽度由 宽度 属性控制,高度默认随内容自动撑开。若需固定高度,可设置 高度 属性,但内容可能溢出。
  8. 与视图的继承关系:卡片框继承自 视图,因此拥有所有视图属性和方法,如 置被单击回调 可为整个卡片绑定点击事件。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档布局类组件_弹性布局 —— 配合卡片内容布局
  • 文档文本类组件_标签 —— 卡片内文字显示
  • 文档文本类组件_按钮 —— 卡片内操作按钮
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、对象操作等
  • 文档综合演示:产品展示卡片 —— 实际应用示例

组件:城市级联框

城市级联框组件用于实现省/市/区三级联动选择,通过级联下拉列表让用户按层级选择地区。它支持自定义级别(省、省市、省市区)、自定义数据源、设置默认值、禁用状态以及值改变回调。适用于地址填写、区域筛选、用户注册等需要地区选择的场景。

典型使用场景:

  • 用户注册/收货地址填写(省市区三级选择)
  • 商品筛选(按地区筛选)
  • 数据统计(按区域维度筛选)
  • 物流信息(发货/收货地区选择)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置联动级别(1/2/3)级别城市级联框1.级别 = 2
禁用/启用组件禁用城市级联框1.禁用 = 真
设置数据源置数据(级联数据)城市级联框1.置数据([{name:"广东省", children:[...]}])
设置默认选中值置值(地区数组)城市级联框1.置值(["广东省","深圳市","南山区"])
获取当前选中值取值()变量 地区 = 城市级联框1.取值()
清空所有选择清空()城市级联框1.清空()
设置值改变回调置输入被改变回调(回调函数)城市级联框1.置输入被改变回调((源对象, 值) => { ... })

样式美化参考

城市级联框的外观可通过继承的视图属性进行调整:

  • 整体容器:通过 宽度高度背景颜色边框(如 "1px solid #d9d9d9")、边框圆角(建议 "6px")等属性美化。
  • 字体样式:通过 字体大小(建议 "14px")、文本颜色 控制下拉选项文字外观。
  • 内边距:使用 内边距(如 "4px 12px")控制下拉框内边距。
  • 禁用状态禁用 = 真 时,级联框变灰且不可交互。
  • 下拉列表样式:下拉列表的样式由组件内部控制,可通过 CSS 类或全局样式覆盖。

数据格式说明

组件的数据格式为嵌套对象数组,结构如下:

[
  {
    name: "省名称",
    children: [
      {
        name: "市名称",
        children: [
          { name: "区名称" },
          { name: "区名称" }
        ]
      }
    ]
  }
]
  • name:必填,显示名称。
  • children:可选,子级数组,结构同父级。

基础示例

创建一个包含省市区三级联动数据,并设置默认选中“广东省/深圳市/南山区”。

变量 城市级联框1 = 创建 城市级联框()
城市级联框1.左边 = 50
城市级联框1.顶边 = 50
城市级联框1.宽度 = 320
城市级联框1.高度 = 36
城市级联框1.字体大小 = "14px"
城市级联框1.边框 = "1px solid #d9d9d9"
城市级联框1.边框圆角 = "6px"
城市级联框1.内边距 = "4px 12px"
城市级联框1.级别 = 3

' 设置数据
城市级联框1.置数据([
    {
        name: "广东省",
        children: [
            {
                name: "深圳市",
                children: [{name: "南山区"}, {name: "福田区"}, {name: "罗湖区"}]
            },
            {
                name: "广州市",
                children: [{name: "天河区"}, {name: "越秀区"}, {name: "海珠区"}]
            }
        ]
    },
    {
        name: "北京市",
        children: [
            {
                name: "北京市",
                children: [{name: "东城区"}, {name: "西城区"}, {name: "朝阳区"}]
            }
        ]
    },
    {
        name: "上海市",
        children: [
            {
                name: "上海市",
                children: [{name: "浦东新区"}, {name: "黄浦区"}, {name: "静安区"}]
            }
        ]
    }
])

' 设置默认选中
城市级联框1.置值(["广东省", "深圳市", "南山区"])

' 设置值改变回调
城市级联框1.置输入被改变回调((源对象, 当前值) => {
    调试输出("已选地区:" + 数组到文本(当前值, " / "))
})

添加组件(城市级联框1)

综合示例:收货地址表单

本示例构建一个完整的收货地址填写表单,包含城市级联框、详细地址输入框、联系人、电话等字段,并演示数据获取与提交。

' ========== 创建表单容器 ==========
变量 表单容器 = 创建 绝对布局()
表单容器.左边 = 30
表单容器.顶边 = 30
表单容器.宽度 = 420
表单容器.背景颜色 = "#ffffff"
表单容器.边框 = "1px solid #e8e8e8"
表单容器.边框圆角 = "12px"
表单容器.内边距 = "24px"
添加组件(表单容器)

' 标题
变量 标题 = 创建 标签()
标题.文本 = "📦 收货地址"
标题.字体大小 = "20px"
标题.字体粗细 = "bold"
标题.文本颜色 = "#333"
标题.内边距 = "0 0 16px 0"
表单容器.添加组件(标题)

' 城市级联框
变量 城市标签 = 创建 标签()
城市标签.文本 = "所在地区"
城市标签.字体大小 = "14px"
城市标签.文本颜色 = "#666"
城市标签.内边距 = "8px 0 4px"
表单容器.添加组件(城市标签)

变量 城市级联框1 = 创建 城市级联框()
城市级联框1.宽度 = 372
城市级联框1.高度 = 36
城市级联框1.字体大小 = "14px"
城市级联框1.边框 = "1px solid #d9d9d9"
城市级联框1.边框圆角 = "6px"
城市级联框1.内边距 = "4px 12px"
城市级联框1.级别 = 3
' 设置数据(复用基础示例的数据)
城市级联框1.置数据([
    {name:"广东省", children:[
        {name:"深圳市", children:[{name:"南山区"},{name:"福田区"}]},
        {name:"广州市", children:[{name:"天河区"},{name:"越秀区"}]}
    ]},
    {name:"北京市", children:[{name:"北京市", children:[{name:"东城区"},{name:"西城区"}]}]},
    {name:"上海市", children:[{name:"上海市", children:[{name:"浦东新区"},{name:"黄浦区"}]}]}
])
表单容器.添加组件(城市级联框1)

' 详细地址
变量 地址标签 = 创建 标签()
地址标签.文本 = "详细地址"
地址标签.字体大小 = "14px"
地址标签.文本颜色 = "#666"
地址标签.内边距 = "12px 0 4px"
表单容器.添加组件(地址标签)

变量 详细地址输入 = 创建 单行输入框()
详细地址输入.宽度 = 372
详细地址输入.高度 = 36
详细地址输入.提示文本 = "请输入街道、门牌号"
详细地址输入.边框 = "1px solid #d9d9d9"
详细地址输入.边框圆角 = "6px"
详细地址输入.内边距 = "4px 12px"
表单容器.添加组件(详细地址输入)

' 联系人
变量 联系人标签 = 创建 标签()
联系人标签.文本 = "联系人"
联系人标签.字体大小 = "14px"
联系人标签.文本颜色 = "#666"
联系人标签.内边距 = "12px 0 4px"
表单容器.添加组件(联系人标签)

变量 联系人输入 = 创建 单行输入框()
联系人输入.宽度 = 372
联系人输入.高度 = 36
联系人输入.提示文本 = "请输入姓名"
联系人输入.边框 = "1px solid #d9d9d9"
联系人输入.边框圆角 = "6px"
联系人输入.内边距 = "4px 12px"
表单容器.添加组件(联系人输入)

' 手机号
变量 电话标签 = 创建 标签()
电话标签.文本 = "手机号"
电话标签.字体大小 = "14px"
电话标签.文本颜色 = "#666"
电话标签.内边距 = "12px 0 4px"
表单容器.添加组件(电话标签)

变量 电话输入 = 创建 单行输入框()
电话输入.宽度 = 372
电话输入.高度 = 36
电话输入.类型 = "tel"
电话输入.提示文本 = "请输入手机号"
电话输入.边框 = "1px solid #d9d9d9"
电话输入.边框圆角 = "6px"
电话输入.内边距 = "4px 12px"
表单容器.添加组件(电话输入)

' 提交按钮
变量 提交按钮 = 创建 按钮()
提交按钮.文本 = "确认地址"
提交按钮.宽度 = 372
提交按钮.高度 = 44
提交按钮.背景颜色 = "#1890ff"
提交按钮.文本颜色 = "#ffffff"
提交按钮.边框圆角 = "6px"
提交按钮.字体大小 = "16px"
提交按钮.内边距 = "16px 0 0"
表单容器.添加组件(提交按钮)

' ========== 事件回调 ==========
' 城市级联框值改变(实时显示)
城市级联框1.置输入被改变回调((源对象, 当前值) => {
    变量 地区文本 = 数组到文本(当前值, " - ")
    调试输出("已选地区:" + 地区文本)
})

' 提交按钮点击
提交按钮.置被单击回调((源对象, 事件对象) => {
    变量 地区 = 城市级联框1.取值()
    变量 详细 = 删首尾空(详细地址输入.内容)
    变量 联系人 = 删首尾空(联系人输入.内容)
    变量 电话 = 删首尾空(电话输入.内容)
    
    ' 校验
    如果(地区 == 空 或 取数组成员数(地区) < 3)
        弹出提示("请选择完整的省市区")
        返回
    结束 如果
    如果(详细 == "")
        弹出提示("请输入详细地址")
        返回
    结束 如果
    如果(联系人 == "")
        弹出提示("请输入联系人")
        返回
    结束 如果
    如果(电话 == "")
        弹出提示("请输入手机号")
        返回
    结束 如果
    
    ' 组装数据
    变量 地址数据 = {
        "province": 地区[0],
        "city": 地区[1],
        "district": 地区[2],
        "detail": 详细,
        "contact": 联系人,
        "phone": 电话
    }
    弹出提示("地址已保存:" + 地区[0] + " " + 地区[1] + " " + 地区[2] + " " + 详细)
    调试输出("提交数据:" + JSON编码(地址数据))
})

属性详解

级别

  • 类型: 数值型
  • 说明: 设置或获取联动级别。1 表示仅省一级,2 表示省市两级,3 表示省市区三级(默认)。级别会影响显示的下拉框数量和数据的层级深度。

禁用

  • 类型: 逻辑型
  • 说明: 设置或获取是否禁用整个组件。禁用后,所有下拉框不可交互,样式变灰。

函数详解

置数据(级联数据)

  • 功能: 设置城市级联数据源。调用后会根据当前 级别 自动渲染对应层级的下拉框。
  • 参数: 级联数据,对象数组,结构为 [{name, children: [...]}]
  • 返回值: 无。
  • 示例:
    城市级联框1.置数据([
        {name: "省A", children: [{name: "市A1", children: [{name: "区A1-1"}]}]}
    ])
    

置值(地区数组)

  • 功能: 设置默认选中的地区。
  • 参数: 地区数组,字符串数组,如 ["广东省", "深圳市", "南山区"],长度应与 级别 一致(1~3)。
  • 返回值: 无。若传递的数组层级与数据不匹配,可能无法正确选中。
  • 示例: 城市级联框1.置值(["北京市", "北京市", "东城区"])

取值()

  • 功能: 获取当前选中的地区数组。
  • 返回值: 字符串数组,如 ["广东省", "深圳市", "南山区"];若未选中任何项,返回空数组 []
  • 示例: 变量 地区 = 城市级联框1.取值()

清空()

  • 功能: 清空所有下拉框的选中状态,重置为未选择。
  • 返回值: 无。
  • 示例: 城市级联框1.清空()

置输入被改变回调(回调函数)

  • 功能: 设置当任何一级下拉框的值发生变化时的回调函数。
  • 参数: 回调函数,格式为 (源对象, 当前值) => { ... }
    • 源对象:城市级联框组件本身。
    • 当前值:当前选中的地区数组(字符串数组)。
  • 返回值: 无。
  • 示例:
    城市级联框1.置输入被改变回调((源对象, 值) => {
        调试输出("当前选择:" + 数组到文本(值, " - "))
    })
    

事件说明

输入被改变(源对象, 当前值)

  • 功能:置输入被改变回调 等效,适用于设计文件(.spldg)中定义的组件。
  • 示例:
    事件 城市级联框1.输入被改变(源对象, 当前值)
        调试输出("已选:" + 当前值)
    结束 事件
    

⚠️ 注意事项

  1. 数据层级与级别匹配级别 属性决定了显示几级下拉框,数据源必须包含相应深度的 children。若数据层级不足,可能导致下拉框为空。
  2. 置值 参数格式地区数组 的长度应与 级别 一致(例如级别=3时需传入3个元素)。元素必须与数据中的 name 完全匹配(包括大小写和符号)。
  3. 数据更新:调用 置数据 会重新渲染下拉框,并清空之前的选中状态。若需保留选中值,应在设置数据后调用 置值
  4. 禁用状态禁用 = 真 时,所有下拉框禁用,无法交互。禁用状态下 置值 仍可设置值,但用户无法修改。
  5. 回调触发时机置输入被改变回调 在用户选择任意一级下拉框时触发,返回当前所有已选级别的数组。若某级未选,该级对应位置为空字符串。
  6. 清空行为清空() 会重置所有下拉框到未选择状态,并触发 输入被改变 回调(值为空数组)。
  7. 样式继承:组件本身是一个容器,内部包含多个下拉框,样式通过继承的属性作用于整体容器,内部下拉框样式由组件统一管理。
  8. 数据格式严格:数据源必须包含 name 字段,children 可选,但必须为数组。若 children 为空数组或不提供,则表示该节点为叶子节点。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档列表类组件_组合框 —— 基础下拉选择组件
  • 文档文本类组件_单行输入框 —— 配合表单输入
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、数组操作等
  • 文档综合演示:收货地址表单 —— 实际应用示例

组件:悬浮按钮

悬浮按钮组件是一个固定在屏幕四角的浮动按钮,用于提供快捷操作入口。它不随页面滚动而移动,始终保持在视口的指定位置。支持自定义图标、大小、形状、背景色、位置偏移等属性,并支持单击事件回调。适用于返回顶部、添加内容、打开菜单、帮助中心等需要快速访问的场景。

典型使用场景:

  • 返回顶部(页面长滚动时快速回到顶部)
  • 新增/发布(快速创建新内容)
  • 客服/帮助(打开在线客服或帮助中心)
  • 购物车入口(查看购物车)
  • 分享/收藏(快捷分享或收藏当前页面)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置按钮图标图标悬浮按钮1.图标 = "+"
设置按钮大小(宽高)大小悬浮按钮1.大小 = 56
设置形状(圆形/方形)形状悬浮按钮1.形状 = "circle"
设置背景颜色背景颜色悬浮按钮1.背景颜色 = "#1890ff"
设置固定位置(四角)位置悬浮按钮1.位置 = "rightBottom"
设置水平偏移偏移X悬浮按钮1.偏移X = 32
设置垂直偏移偏移Y悬浮按钮1.偏移Y = 32
显示按钮显示(父容器)悬浮按钮1.显示()
隐藏按钮隐藏()悬浮按钮1.隐藏()
设置单击回调置被单击回调(回调函数)悬浮按钮1.置被单击回调((源对象) => { ... })

样式美化参考

悬浮按钮的外观可通过以下属性进行精细控制:

  • 形状与大小形状 支持 "circle"(圆形)和 "square"(方形);大小 控制按钮的宽高(像素),建议不小于 40px 以保证可点击性。
  • 背景与图标背景颜色 设置按钮底色,图标 支持文本字符(如 "+")、emoji(如 "📝")或 HTML 字符串(如 <svg>...</svg>)。
  • 位置与偏移位置 支持 "rightBottom"(右下)、"leftBottom"(左下)、"rightTop"(右上)、"leftTop"(左上);偏移X偏移Y 可微调按钮距离屏幕边缘的距离(像素)。
  • 悬停/阴影效果:可通过继承的 置鼠标被进入回调置鼠标被移出回调 动态改变背景色或缩放,增强交互反馈。
  • 层级:悬浮按钮默认固定定位,显示层级(z-index)默认为较高值,确保浮于其他内容之上。

基础示例

创建一个右下角的圆形悬浮按钮,显示“+”图标,点击弹出提示。

变量 悬浮按钮1 = 创建 悬浮按钮()
悬浮按钮1.图标 = "+"
悬浮按钮1.大小 = 48
悬浮按钮1.形状 = "circle"
悬浮按钮1.背景颜色 = "#1890ff"
悬浮按钮1.位置 = "rightBottom"
悬浮按钮1.偏移X = 24
悬浮按钮1.偏移Y = 24
悬浮按钮1.置被单击回调((源对象) => {
    弹出提示("悬浮按钮被点击")
})
悬浮按钮1.显示()

综合示例:快速新建按钮(带悬停效果)

本示例创建一个位于右下角的圆形悬浮按钮,用于快速新建文档。悬停时放大并变色,点击后模拟新建操作。

' ========== 创建悬浮按钮 ==========
变量 新建按钮 = 创建 悬浮按钮()
新建按钮.图标 = "✚"  ' 加号字符
新建按钮.大小 = 56
新建按钮.形状 = "circle"
新建按钮.背景颜色 = "#1890ff"
新建按钮.位置 = "rightBottom"
新建按钮.偏移X = 32
新建按钮.偏移Y = 32
新建按钮.字体大小 = "32px"
新建按钮.文本颜色 = "#ffffff"
新建按钮.显示层级 = 1000
' 阴影效果通过内联样式添加
新建按钮.追加内联样式("box-shadow: 0 4px 12px rgba(24,144,255,0.5); transition: all 0.3s;")
添加组件(新建按钮)

' ========== 悬停效果 ==========
新建按钮.置鼠标被进入回调((源对象) => {
    源对象.背景颜色 = "#096dd9"
    源对象.追加内联样式("transform: scale(1.1); box-shadow: 0 6px 20px rgba(24,144,255,0.6);")
})

新建按钮.置鼠标被移出回调((源对象) => {
    源对象.背景颜色 = "#1890ff"
    源对象.追加内联样式("transform: scale(1); box-shadow: 0 4px 12px rgba(24,144,255,0.5);")
})

' ========== 单击事件:新建文档 ==========
新建按钮.置被单击回调((源对象) => {
    弹出提示("正在创建新文档...")
    ' 模拟新建操作
    延时执行(() => {
        弹出提示("✅ 新文档已创建")
    }, 1000)
})

' 显示按钮(已默认显示,但建议调用)
新建按钮.显示()

属性详解

图标

  • 类型: 文本型
  • 说明: 设置或获取按钮内显示的图标。支持普通文本字符(如 "+""×")、emoji(如 "📌""🔍")或 HTML 字符串(如 <svg>...</svg>)。默认值为空。

背景颜色

  • 类型: 文本型
  • 说明: 设置或获取按钮的背景颜色,支持 CSS 颜色值(如 "#1890ff""red")。默认 "#1890ff"

大小

  • 类型: 数值型
  • 说明: 设置或获取按钮的宽度和高度(像素),即按钮为正方形。默认 40。建议不小于 40px 以保证触控区域足够大。

形状

  • 类型: 文本型
  • 说明: 设置或获取按钮的形状,可选值:
    • "circle":圆形(边框圆角为 50%)
    • "square":方形(可配合 边框圆角 属性实现圆角矩形) 默认 "circle"

位置

  • 类型: 文本型
  • 说明: 设置或获取按钮固定在屏幕的哪个角落。可选值:
    • "rightBottom"(默认):右下角
    • "leftBottom":左下角
    • "rightTop":右上角
    • "leftTop":左上角

偏移X

  • 类型: 数值型
  • 说明: 设置或获取按钮距离屏幕左边缘或右边缘的偏移量(像素),取决于 位置 是左还是右。默认 24

偏移Y

  • 类型: 数值型
  • 说明: 设置或获取按钮距离屏幕顶部或底部的偏移量(像素),取决于 位置 是上还是下。默认 24

函数详解

显示(父容器)

  • 功能: 将悬浮按钮添加到页面并显示。如果未指定父容器,默认添加到 body
  • 参数: 父容器(可选),可以是视图组件或原生 DOM 元素。若省略,则添加到页面根元素。
  • 返回值: 无。
  • 示例: 悬浮按钮1.显示()悬浮按钮1.显示(面板1)

隐藏()

  • 功能: 隐藏悬浮按钮(从 DOM 中移除或设置 可视 = "hidden")。
  • 返回值: 无。
  • 示例: 悬浮按钮1.隐藏()

事件说明

悬浮按钮本身未定义特有事件,但继承自 视图 的所有事件均可使用,特别是 置被单击回调 是最常用的交互方式。


⚠️ 注意事项

  1. 固定定位:悬浮按钮使用 position: fixed,不随页面滚动,始终固定在视口指定位置。
  2. 父容器限制:如果调用 显示(父容器) 时传入的父容器不是 body,且父容器不是固定定位或相对定位且包含滚动,按钮可能不会固定在屏幕四角,而是相对于父容器定位。建议默认使用 body 或确保父容器为全屏。
  3. 图标内容图标 属性支持 HTML 字符串,可用于嵌入 SVG 图标,但要注意引号转义。
  4. 大小与可点击性:按钮大小建议至少 44px,以满足移动端触控规范。
  5. 层级冲突:如果页面中有其他固定定位元素(如弹窗、侧边栏),可能需调整 显示层级 确保悬浮按钮在上层。
  6. 多个悬浮按钮:可以创建多个悬浮按钮,但需注意它们可能重叠,建议分别设置不同位置或偏移。
  7. 隐藏和显示:调用 隐藏() 后,按钮从 DOM 中移除,再次调用 显示() 可重新添加。
  8. 悬停效果:通过 置鼠标被进入/移出回调 可实现悬停动画,但注意按钮消失后事件解绑。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档其它通用类组件_返回顶部按钮 —— 同类固定定位按钮
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、延时执行等
  • 文档综合演示:快速新建按钮 —— 实际应用示例

组件:折叠面板

折叠面板组件由多个可独立或联动展开/折叠的面板组成,每个面板包含标题和内容区域。支持手风琴模式(同一时间仅展开一个面板),适用于内容分组、FAQ、产品详情展示、设置项分组等需要节省空间且允许用户按需查看详细内容的场景。

典型使用场景:

  • 常见问题(FAQ)列表
  • 产品规格参数展示
  • 设置项分组(如系统设置、用户偏好)
  • 文档章节折叠
  • 评论/回复区域折叠

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
开启/关闭手风琴模式手风琴折叠面板1.手风琴 = 真
添加一个面板添加面板(标题, 面板元素, 键)折叠面板1.添加面板("标题", 内容元素, "key1")
展开指定面板展开(键)折叠面板1.展开("key1")
折叠指定面板折叠(键)折叠面板1.折叠("key1")
展开所有面板(非手风琴模式)展开全部()折叠面板1.展开全部()
折叠所有面板折叠全部()折叠面板1.折叠全部()
获取指定面板的内容元素取面板(键)变量 元素 = 折叠面板1.取面板("key1")
清空所有面板清空()折叠面板1.清空()
设置面板切换回调置面板被切换回调(回调函数)折叠面板1.置面板被切换回调((源对象, 键, 是否展开) => { ... })

样式美化参考

折叠面板的外观可通过继承的视图属性进行整体调整,同时每个面板的样式由组件内部管理,但可通过 CSS 类自定义:

  • 整体容器:通过 宽度高度背景颜色边框(如 "1px solid #e8e8e8")、边框圆角(建议 "8px")等属性美化。
  • 面板标题:标题区域默认具有背景色和点击指示(箭头),可通过 CSS 类自定义字体、颜色、内边距等。
  • 面板内容:内容区域可通过 内边距 控制内部间距,背景色等通过 CSS 覆盖。
  • 手风琴模式:在手风琴模式下,展开一个面板会自动折叠其他面板,交互更紧凑。

CSS 美化示例(在项目 CSS 文件中定义):

.my-collapse .collapse-panel {
    border-bottom: 1px solid #f0f0f0;
}
.my-collapse .collapse-header {
    padding: 12px 16px;
    font-size: 15px;
    font-weight: 500;
    background-color: #fafafa;
    cursor: pointer;
    transition: background-color 0.2s;
}
.my-collapse .collapse-header:hover {
    background-color: #f0f0f0;
}
.my-collapse .collapse-content {
    padding: 16px;
    background-color: #ffffff;
}

在代码中应用样式类:折叠面板1.添加样式类("my-collapse")


基础示例

创建一个包含三个面板的折叠面板,默认展开第一个,非手风琴模式。

变量 折叠面板1 = 创建 折叠面板()
折叠面板1.左边 = 50
折叠面板1.顶边 = 50
折叠面板1.宽度 = 500
折叠面板1.边框 = "1px solid #e8e8e8"
折叠面板1.边框圆角 = "8px"
折叠面板1.手风琴 = 假

' 创建面板内容(使用原生 DOM 元素)
变量 内容1 = 创建元素("div")
内容1.innerHTML = "<p>这是第一个面板的内容,默认展开。</p>"

变量 内容2 = 创建元素("div")
内容2.innerHTML = "<p>这是第二个面板的内容。</p>"

变量 内容3 = 创建元素("div")
内容3.innerHTML = "<p>这是第三个面板的内容。</p>"

' 添加面板(标题, 内容元素, 键)
折叠面板1.添加面板("面板 1", 内容1, "p1")
折叠面板1.添加面板("面板 2", 内容2, "p2")
折叠面板1.添加面板("面板 3", 内容3, "p3")

' 默认展开第一个面板
折叠面板1.展开("p1")

添加组件(折叠面板1)

综合示例:产品规格 FAQ

本示例构建一个产品常见问题折叠面板,包含手风琴模式,点击面板时切换展开/折叠并显示当前状态。

' ========== 创建折叠面板(手风琴模式) ==========
变量 FAQ面板 = 创建 折叠面板()
FAQ面板.左边 = 30
FAQ面板.顶边 = 30
FAQ面板.宽度 = 600
FAQ面板.边框 = "1px solid #d9d9d9"
FAQ面板.边框圆角 = "8px"
FAQ面板.背景颜色 = "#ffffff"
FAQ面板.手风琴 = 真  ' 一次只展开一个
添加组件(FAQ面板)

' ========== 准备 FAQ 数据 ==========
变量 数据 = [
    { 标题: "产品支持哪些支付方式?", 内容: "我们支持微信支付、支付宝、银行卡和信用卡支付。" },
    { 标题: "如何退货?", 内容: "您可以在订单页面发起退货申请,我们会在 3 个工作日内处理。" },
    { 标题: "保修期是多久?", 内容: "本产品提供 12 个月的免费保修服务。" },
    { 标题: "是否可以开具发票?", 内容: "可以,下单时填写发票信息,我们会随货邮寄。" }
]

' ========== 添加面板 ==========
变量循环(i = 0, 取数组成员数(数据), 1)
    变量 项 = 数据[i]
    ' 创建内容 DOM 元素
    变量 内容元素 = 创建元素("div")
    内容元素.innerHTML = "<p style='margin:0;color:#555;'>" + 项.内容 + "</p>"
    ' 添加面板(标题、内容、键)
    FAQ面板.添加面板(项.标题, 内容元素, "faq_" + i)
结束循环

' ========== 默认展开第一个 ==========
FAQ面板.展开("faq_0")

' ========== 状态显示标签 ==========
变量 状态标签 = 创建 标签()
状态标签.左边 = 30
状态标签.顶边 = 320
状态标签.文本 = "当前展开:faq_0"
状态标签.字体大小 = "14px"
状态标签.文本颜色 = "#999"
添加组件(状态标签)

' ========== 监听面板切换事件 ==========
FAQ面板.置面板被切换回调((源对象, 键, 是否展开) => {
    如果(是否展开)
        状态标签.文本 = "当前展开:" + 键
        调试输出("面板 " + 键 + " 已展开")
    否则
        状态标签.文本 = "面板 " + 键 + " 已折叠"
        调试输出("面板 " + 键 + " 已折叠")
    结束 如果
})

属性详解

手风琴

  • 类型: 逻辑型
  • 说明: 设置或获取是否启用手风琴模式。当为 时,每次只能展开一个面板,展开新面板时会自动折叠当前展开的面板;当为 时,多个面板可同时展开。默认

函数详解

添加面板(标题, 面板元素, 键)

  • 功能: 向折叠面板中添加一个新的面板。
  • 参数:
    • 标题:文本型,必填,显示在面板标题栏的文本。
    • 面板元素:DOM 节点或视图组件,必填,面板展开时显示的内容区域。可传入原生 DOM 元素(通过 创建元素 获得)或视图组件的原生对象(通过 取原生对象() 获得)。
    • :文本型,必填,面板的唯一标识,用于后续展开、折叠、获取等操作。
  • 返回值: 数值型,新面板在内部数组中的索引(从0开始)。
  • 示例:
    ' 创建内容元素
    变量 内容 = 创建元素("div")
    内容.textContent = "这是内容"
    ' 添加面板
    变量 索引 = 折叠面板1.添加面板("标题", 内容, "myKey")
    

展开(键)

  • 功能: 展开指定键的面板。如果已展开,则无变化。在手风琴模式下,会自动折叠其他面板。
  • 参数: (文本型),面板的唯一标识。
  • 返回值: 无。
  • 示例: 折叠面板1.展开("key1")

折叠(键)

  • 功能: 折叠指定键的面板。如果已折叠,则无变化。
  • 参数: (文本型),面板的唯一标识。
  • 返回值: 无。
  • 示例: 折叠面板1.折叠("key1")

展开全部()

  • 功能: 展开所有面板。在手风琴模式下,此方法无效(因为手风琴模式只允许展开一个)。
  • 返回值: 无。
  • 示例: 折叠面板1.展开全部()

折叠全部()

  • 功能: 折叠所有面板。
  • 返回值: 无。
  • 示例: 折叠面板1.折叠全部()

取面板(键)

  • 功能: 获取指定键的面板内容元素(DOM 节点)。
  • 参数: (文本型)。
  • 返回值: DOM 元素,若键不存在则返回
  • 示例: 变量 元素 = 折叠面板1.取面板("key1")

置面板被切换回调(回调函数)

  • 功能: 设置面板展开或折叠时的回调函数。每当面板状态变化时触发。
  • 参数: 回调函数,格式为 (源对象, 键, 是否展开) => { ... }
    • 源对象:折叠面板组件本身。
    • :状态发生变化的面板键。
    • 是否展开:逻辑型, 表示面板已展开, 表示已折叠。
  • 返回值: 无。
  • 示例:
    折叠面板1.置面板被切换回调((源对象, 键, 是否展开) => {
        调试输出(键 + (是否展开 ? " 展开" : " 折叠"))
    })
    

清空()

  • 功能: 移除所有面板,重置为空状态。
  • 返回值: 无。
  • 示例: 折叠面板1.清空()

事件说明

面板被切换(源对象, 键, 是否展开)

  • 功能:置面板被切换回调 等效,适用于设计文件(.spldg)中定义的组件。
  • 示例:
    事件 折叠面板1.面板被切换(源对象, 键, 是否展开)
        调试输出("面板 " + 键 + (是否展开 ? " 展开" : " 折叠"))
    结束 事件
    

⚠️ 注意事项

  1. 面板内容必须为 DOM 元素添加面板 的第二个参数应为 DOM 节点(通过 创建元素 获得)或视图组件的原生对象。若传入视图组件,需调用 取原生对象() 方法。
  2. 键的唯一性:每个面板的 必须唯一,否则会导致展开/折叠操作混淆。
  3. 手风琴模式限制:当 手风琴 = 真 时,展开全部() 无效,且手动展开一个面板会自动折叠其他面板。
  4. 回调触发时机置面板被切换回调 在面板状态变化后触发,可用于同步 UI 状态或执行后续逻辑。
  5. 清空后重新添加清空() 会移除所有面板,如需重新添加,需再次调用 添加面板
  6. 样式定制:面板的标题和内容区域默认样式较简单,建议通过 CSS 类进行美化以匹配应用风格。
  7. 性能考虑:如果面板数量很多(如几十个),建议使用虚拟滚动或分页加载,但折叠面板通常用于少量内容,性能影响不大。
  8. 与卡片框的区别:折叠面板专注于折叠/展开交互,而卡片框是静态容器,二者可搭配使用。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档其它通用类组件_卡片框 —— 静态内容容器
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、循环语句等
  • 文档综合演示:产品FAQ折叠面板 —— 实际应用示例

组件:抽屉

抽屉组件是一个从屏幕边缘滑出的浮层面板,用于承载临时内容,如侧边菜单、信息详情、表单编辑等。它支持从四个方向(左、右、上、下)滑出,并带有遮罩层,用户可通过点击遮罩或关闭按钮关闭抽屉。常用于需要在不离开当前页面的情况下展示额外内容的场景。

典型使用场景:

  • 侧边菜单(移动端或后台管理系统的导航菜单)
  • 详情信息展示(查看数据详情、用户资料)
  • 表单编辑(在抽屉中编辑记录,不影响主页面)
  • 通知中心或消息列表
  • 设置面板或操作面板

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置抽屉标题标题抽屉1.标题 = "用户信息"
设置抽屉宽度(左右弹出)宽度抽屉1.宽度 = 480
设置抽屉高度(上下弹出)高度抽屉1.高度 = 300
设置弹出方向弹出位置抽屉1.弹出位置 = "left"
显示/隐藏关闭按钮显示关闭按钮抽屉1.显示关闭按钮 = 假
显示/隐藏遮罩显示遮罩抽屉1.显示遮罩 = 假
允许/禁止点击遮罩关闭点击遮罩关闭抽屉1.点击遮罩关闭 = 假
设置内容(HTML)内容抽屉1.内容 = "<p>内容</p>"
设置内容(DOM元素)置内容元素(元素)抽屉1.置内容元素(元素对象)
显示抽屉显示(父容器)抽屉1.显示()
关闭抽屉关闭()抽屉1.关闭()
设置关闭回调置抽屉被关闭回调(回调函数)抽屉1.置抽屉被关闭回调((源对象) => { ... })

样式美化参考

抽屉的外观可通过以下属性进行精细控制:

  • 整体容器:通过 背景颜色(建议 "#ffffff")、边框圆角(仅在顶部/底部弹出时有效)等继承属性美化。
  • 标题区域标题 文本的样式可通过 字体大小字体粗细文本颜色 控制,关闭按钮默认显示在标题右侧。
  • 内容区域:内容区域的背景色、内边距等可通过 置内容元素 传入的 DOM 元素样式控制,或通过 内容 属性设置 HTML 并配合 CSS 类。
  • 遮罩层:遮罩层背景色默认为半透明黑色(rgba(0,0,0,0.45)),可通过 CSS 类自定义。
  • 弹出方向弹出位置 决定抽屉从哪个方向滑入,宽度或高度根据方向自动调整(左右弹出由 宽度 控制,上下弹出由 高度 控制)。

CSS 美化示例(在项目 CSS 文件中定义):

.my-drawer .drawer-header {
    background-color: #f7f9fc;
    border-bottom: 1px solid #e8e8e8;
    padding: 16px 20px;
}
.my-drawer .drawer-body {
    padding: 20px;
}

在代码中应用样式类:抽屉1.添加样式类("my-drawer")


基础示例

创建一个从右侧滑出的抽屉,包含标题和简单内容,显示关闭按钮和遮罩,点击遮罩可关闭。

变量 抽屉1 = 创建 抽屉()
抽屉1.标题 = "设置"
抽屉1.宽度 = 400
抽屉1.弹出位置 = "right"
抽屉1.显示遮罩 = 真
抽屉1.点击遮罩关闭 = 真
抽屉1.显示关闭按钮 = 真

' 设置内容(HTML)
抽屉1.内容 = "<div style='padding:20px;'><p>这里是抽屉内容</p><button onclick='alert(\"操作\")'>操作</button></div>"

' 设置关闭回调
抽屉1.置抽屉被关闭回调((源对象) => {
    弹出提示("抽屉已关闭")
})

' 显示抽屉
抽屉1.显示()

综合示例:用户信息编辑抽屉

本示例模拟一个用户信息编辑功能,点击按钮打开右侧抽屉,在抽屉中展示用户详情并允许编辑,保存后关闭抽屉并刷新主页面数据。

' ========== 创建主页面按钮 ==========
变量 打开按钮 = 创建 按钮()
打开按钮.左边 = 50
打开按钮.顶边 = 50
打开按钮.文本 = "编辑用户信息"
打开按钮.背景颜色 = "#1890ff"
打开按钮.文本颜色 = "#ffffff"
打开按钮.边框圆角 = "6px"
打开按钮.宽度 = 160
打开按钮.高度 = 40
添加组件(打开按钮)

' ========== 创建抽屉 ==========
变量 编辑抽屉 = 创建 抽屉()
编辑抽屉.标题 = "编辑用户"
编辑抽屉.宽度 = 480
编辑抽屉.弹出位置 = "right"
编辑抽屉.显示遮罩 = 真
编辑抽屉.点击遮罩关闭 = 假  ' 禁止点击遮罩关闭,强制用户点击取消/保存
编辑抽屉.显示关闭按钮 = 真
' 抽屉背景色
编辑抽屉.背景颜色 = "#ffffff"

' ========== 创建抽屉内容(DOM元素) ==========
变量 内容容器 = 创建元素("div")
内容容器.style.padding = "24px"

' 姓名输入
变量 姓名标签 = 创建元素("label")
姓名标签.textContent = "姓名"
姓名标签.style.display = "block"
姓名标签.style.marginBottom = "4px"
姓名标签.style.fontWeight = "bold"
内容容器.appendChild(姓名标签)

变量 姓名输入 = 创建元素("input")
姓名输入.type = "text"
姓名输入.value = "张三"
姓名输入.style.width = "100%"
姓名输入.style.padding = "8px 12px"
姓名输入.style.border = "1px solid #d9d9d9"
姓名输入.style.borderRadius = "4px"
姓名输入.style.marginBottom = "16px"
内容容器.appendChild(姓名输入)

' 邮箱输入
变量 邮箱标签 = 创建元素("label")
邮箱标签.textContent = "邮箱"
邮箱标签.style.display = "block"
邮箱标签.style.marginBottom = "4px"
邮箱标签.style.fontWeight = "bold"
内容容器.appendChild(邮箱标签)

变量 邮箱输入 = 创建元素("input")
邮箱输入.type = "email"
邮箱输入.value = "zhangsan@example.com"
邮箱输入.style.width = "100%"
邮箱输入.style.padding = "8px 12px"
邮箱输入.style.border = "1px solid #d9d9d9"
邮箱输入.style.borderRadius = "4px"
邮箱输入.style.marginBottom = "16px"
内容容器.appendChild(邮箱输入)

' 按钮组
变量 按钮组 = 创建元素("div")
按钮组.style.display = "flex"
按钮组.style.justifyContent = "flex-end"
按钮组.style.gap = "12px"

变量 取消按钮 = 创建元素("button")
取消按钮.textContent = "取消"
取消按钮.style.padding = "8px 16px"
取消按钮.style.border = "1px solid #d9d9d9"
取消按钮.style.borderRadius = "4px"
取消按钮.style.backgroundColor = "#ffffff"
取消按钮.style.cursor = "pointer"
按钮组.appendChild(取消按钮)

变量 保存按钮 = 创建元素("button")
保存按钮.textContent = "保存"
保存按钮.style.padding = "8px 16px"
保存按钮.style.border = "none"
保存按钮.style.borderRadius = "4px"
保存按钮.style.backgroundColor = "#1890ff"
保存按钮.style.color = "#ffffff"
保存按钮.style.cursor = "pointer"
按钮组.appendChild(保存按钮)

内容容器.appendChild(按钮组)

' 设置抽屉内容
编辑抽屉.置内容元素(内容容器)

' ========== 打开抽屉 ==========
打开按钮.置被单击回调((源对象) => {
    编辑抽屉.显示()
})

' ========== 取消按钮事件 ==========
取消按钮.onclick = () => {
    编辑抽屉.关闭()
}

' ========== 保存按钮事件 ==========
保存按钮.onclick = () => {
    变量 姓名 = 姓名输入.value
    变量 邮箱 = 邮箱输入.value
    如果(删首尾空(姓名) == "" 或 删首尾空(邮箱) == "")
        弹出提示("请完整填写信息")
        返回
    结束 如果
    ' 模拟保存
    弹出提示("保存成功!姓名:" + 姓名 + ",邮箱:" + 邮箱)
    编辑抽屉.关闭()
    ' 更新主页面显示(例如更新按钮文本)
    打开按钮.文本 = "已更新:" + 姓名
}

' ========== 抽屉关闭回调(可在此刷新数据) ==========
编辑抽屉.置抽屉被关闭回调((源对象) => {
    调试输出("抽屉已关闭")
})

属性详解

标题

  • 类型: 文本型
  • 说明: 设置或获取抽屉标题栏显示的文本。标题会显示在抽屉顶部左侧,右侧为关闭按钮(如果 显示关闭按钮)。

宽度

  • 类型: 数值型
  • 说明: 设置或获取抽屉的宽度(像素),仅在左右弹出(弹出位置"left""right")时生效。默认 378。注意:该值为抽屉面板的宽度,而非内容区宽度。

高度

  • 类型: 数值型
  • 说明: 设置或获取抽屉的高度(像素),仅在上/下弹出(弹出位置"top""bottom")时生效。默认 378

弹出位置

  • 类型: 文本型
  • 说明: 设置或获取抽屉从哪个方向滑出。可选值:
    • "left":从左侧滑出
    • "right"(默认):从右侧滑出
    • "top":从顶部滑出
    • "bottom":从底部滑出

显示关闭按钮

  • 类型: 逻辑型
  • 说明: 设置或获取是否在标题栏右侧显示关闭按钮(×)。默认为 。点击关闭按钮会触发抽屉关闭,并执行关闭回调。

显示遮罩

  • 类型: 逻辑型
  • 说明: 设置或获取是否显示遮罩层(背景半透明层)。默认为 。遮罩层用于突出抽屉内容,并阻止用户与背景交互。

点击遮罩关闭

  • 类型: 逻辑型
  • 说明: 设置或获取是否允许用户点击遮罩层来关闭抽屉。默认为 。设为 时,用户必须通过关闭按钮或调用 关闭() 方法关闭。

内容

  • 类型: 文本型
  • 说明: 设置抽屉主体内容,支持 HTML 字符串。设置后,抽屉内容区会渲染该 HTML。如果同时使用了 置内容元素,则 内容 属性会被覆盖。

函数详解

置内容元素(元素)

  • 功能: 将抽屉的内容区设置为指定的 DOM 元素或视图组件。此方法会覆盖 内容 属性设置的 HTML 字符串,提供更灵活的组件化内容。
  • 参数: 元素,可以是原生 DOM 节点或视图组件实例(会自动取其原生对象)。
  • 返回值: 无。
  • 示例:
    变量 容器 = 创建元素("div")
    容器.innerHTML = "<p>自定义内容</p>"
    抽屉1.置内容元素(容器)
    

显示(父容器)

  • 功能: 显示抽屉,将其添加到页面指定父容器中并触发滑入动画。
  • 参数: 父容器(可选),可以是视图组件或原生 DOM 元素。若省略,默认添加到 body
  • 返回值: 无。
  • 示例: 抽屉1.显示()抽屉1.显示(面板1)

关闭()

  • 功能: 关闭抽屉,触发滑出动画,并从 DOM 中移除。会触发 置抽屉被关闭回调
  • 返回值: 无。
  • 示例: 抽屉1.关闭()

置抽屉被关闭回调(回调函数)

  • 功能: 设置抽屉关闭时的回调函数,无论通过点击关闭按钮、点击遮罩(若允许)还是调用 关闭() 方法,都会触发。
  • 参数: 回调函数,格式为 (源对象) => { ... }
    • 源对象:抽屉组件本身。
  • 返回值: 无。
  • 示例:
    抽屉1.置抽屉被关闭回调((源对象) => {
        调试输出("抽屉已关闭")
    })
    

事件说明

抽屉被关闭(源对象)

  • 功能:置抽屉被关闭回调 等效,适用于设计文件(.spldg)中定义的组件。
  • 示例:
    事件 抽屉1.抽屉被关闭(源对象)
        调试输出("抽屉已关闭")
    结束 事件
    

⚠️ 注意事项

  1. 父容器要求:默认添加到 body,可确保抽屉覆盖全屏。若指定了其他父容器,该父容器需具有相对定位或固定定位,且宽高足够覆盖视图区域,否则抽屉可能无法正确覆盖。
  2. 内容更新内容置内容元素 均可设置内容,但 置内容元素 优先级更高。调用 置内容元素 后,内容 属性将失效。
  3. 事件绑定:通过 置内容元素内容 属性添加的 HTML 内容中的事件(如 onclick)需使用原生 JavaScript 绑定,不能直接使用轻语言的 置被单击回调。若需要轻语言风格的事件,建议在 DOM 元素创建后通过轻语言方法绑定(如 按钮.置被单击回调)。
  4. 关闭回调置抽屉被关闭回调 在抽屉完全关闭后触发,可用于刷新主页面数据或执行后续逻辑。
  5. 遮罩点击关闭点击遮罩关闭 默认为 ,若希望用户必须通过按钮关闭,请设为
  6. 禁用状态:抽屉本身没有 禁用 属性,但其中的内容可独立控制。
  7. 多次显示:抽屉可以多次显示和关闭,状态会自动重置。但注意在关闭后,内容元素仍保留,不会自动清空。
  8. 定位方式:抽屉使用固定定位(position: fixed),因此即使页面滚动,抽屉也会固定在视口边缘。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档其它通用类组件_对话框 —— 类似弹窗组件
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、事件处理等
  • 文档综合演示:用户信息编辑抽屉 —— 实际应用示例

组件:描述列表

描述列表组件用于以键值对(标签-值)的形式展示结构化信息,支持多列布局,适用于展示用户信息、配置参数、产品规格、订单详情等只读数据。它提供清晰的视觉层次,便于用户快速浏览信息。

典型使用场景:

  • 用户个人信息展示(姓名、年龄、邮箱、电话等)
  • 产品规格参数(尺寸、重量、颜色、材质)
  • 订单详情(订单号、金额、状态、支付方式)
  • 系统配置信息(数据库连接、缓存设置等)
  • 任何需要以“字段名-字段值”形式展示的只读数据

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置列表标题标题描述列表1.标题 = "用户信息"
设置每行列数列数描述列表1.列数 = 2
添加单个键值对添加项(标签, 值)描述列表1.添加项("姓名", "张三")
批量设置键值对置项目数组(项目数组)描述列表1.置项目数组([{label:"姓名", value:"张三"}, ...])
清空所有键值对清空()描述列表1.清空()

样式美化参考

描述列表的外观可通过继承的视图属性以及 CSS 类进行美化:

  • 整体容器:通过 宽度背景颜色边框(如 "1px solid #e8e8e8")、边框圆角(建议 "8px")等属性美化。
  • 标题区域标题 文本的样式可通过 字体大小(建议 "16px")、字体粗细"bold")、文本颜色 控制。标题默认显示在列表顶部,背景色可单独设置。
  • 列表项:每个键值对由标签和值组成,标签通常加粗显示(font-weight: bold),值正常显示。可通过 CSS 类自定义标签宽度、颜色、对齐方式等。
  • 列数列数 控制每行显示的键值对数量,布局为网格形式,列数越多,每列宽度越窄。当 列数 = 1 时,每个键值对独占一行。
  • 内边距:通过 内边距(建议 "16px")控制列表整体内边距,使内容不贴边。

CSS 美化示例(在项目 CSS 文件中定义):

.my-description .desc-item {
    padding: 8px 12px;
    border-bottom: 1px solid #f0f0f0;
}
.my-description .desc-label {
    font-weight: bold;
    color: #666;
    width: 100px;
}
.my-description .desc-value {
    color: #333;
}

在代码中应用样式类:描述列表1.添加样式类("my-description")


基础示例

创建一个用户信息描述列表,包含姓名、年龄、邮箱、电话,每行显示 2 列。

变量 描述列表1 = 创建 描述列表()
描述列表1.左边 = 50
描述列表1.顶边 = 50
描述列表1.宽度 = 600
描述列表1.边框 = "1px solid #e8e8e8"
描述列表1.边框圆角 = "8px"
描述列表1.背景颜色 = "#ffffff"
描述列表1.内边距 = "16px"
描述列表1.标题 = "用户信息"
描述列表1.字体大小 = "14px"
描述列表1.列数 = 2

' 添加键值对
描述列表1.添加项("姓名", "张三")
描述列表1.添加项("年龄", "25 岁")
描述列表1.添加项("邮箱", "zhangsan@example.com")
描述列表1.添加项("电话", "138-0000-0000")

添加组件(描述列表1)

综合示例:产品规格展示

本示例展示一个产品规格表,包含多行键值对,采用 3 列布局,并显示标题“产品规格”。

' ========== 创建描述列表 ==========
变量 规格列表 = 创建 描述列表()
规格列表.左边 = 30
规格列表.顶边 = 30
规格列表.宽度 = 720
规格列表.边框 = "1px solid #e8e8e8"
规格列表.边框圆角 = "8px"
规格列表.背景颜色 = "#ffffff"
规格列表.内边距 = "16px"
规格列表.标题 = "产品规格"
规格列表.标题字体大小 = "18px"
规格列表.标题字体粗细 = "bold"
规格列表.标题颜色 = "#333"
规格列表.列数 = 3
规格列表.字体大小 = "14px"

' ========== 添加规格项 ==========
变量 规格数据 = [
    {label: "品牌", value: "VcnTech"},
    {label: "型号", value: "VT-2024"},
    {label: "颜色", value: "太空灰"},
    {label: "材质", value: "铝合金 + 玻璃"},
    {label: "重量", value: "178g"},
    {label: "屏幕尺寸", value: "6.7 英寸"},
    {label: "处理器", value: "Vcn A17"},
    {label: "存储容量", value: "256GB"},
    {label: "电池容量", value: "4500mAh"}
]

变量循环(i = 0, 取数组成员数(规格数据), 1)
    变量 项 = 规格数据[i]
    规格列表.添加项(项.label, 项.value)
结束循环

' ========== 添加底部操作按钮(使用HTML内容) ==========
' 由于描述列表不支持直接添加按钮,我们可以将其放入一个独立的按钮容器
变量 按钮容器 = 创建 弹性布局()
按钮容器.方向 = "row"
按钮容器.间距 = 12
按钮容器.左边 = 30
按钮容器.顶边 = 320
按钮容器.宽度 = 720
按钮容器.内容水平对齐 = "center"

变量 编辑按钮 = 创建 按钮()
编辑按钮.文本 = "编辑规格"
编辑按钮.背景颜色 = "#1890ff"
编辑按钮.文本颜色 = "#ffffff"
编辑按钮.边框圆角 = "6px"
编辑按钮.宽度 = 120
按钮容器.添加组件(编辑按钮)

变量 关闭按钮 = 创建 按钮()
关闭按钮.文本 = "关闭"
关闭按钮.背景颜色 = "#d9d9d9"
关闭按钮.文本颜色 = "#333"
关闭按钮.边框圆角 = "6px"
关闭按钮.宽度 = 120
按钮容器.添加组件(关闭按钮)

添加组件(按钮容器)

' 为按钮绑定事件
编辑按钮.置被单击回调((源对象) => {
    弹出提示("编辑产品规格功能")
})

关闭按钮.置被单击回调((源对象) => {
    弹出提示("已关闭详情")
})

属性详解

标题

  • 类型: 文本型
  • 说明: 设置或获取描述列表的标题文本。若设置为空字符串 "",标题栏将被隐藏,直接显示键值对列表。标题默认显示在列表顶部,带有下边框或背景色。

列数

  • 类型: 数值型
  • 说明: 设置或获取每行显示的键值对数量,默认 1。当 列数 = 1 时,每个键值对独占一行,标签和值水平排列;当 列数 > 1 时,键值对按网格布局排列,每行显示指定数量的项目。建议根据实际数据量和容器宽度设置合适的列数。

函数详解

添加项(标签, 值)

  • 功能: 向描述列表中添加一个键值对(标签-值)。
  • 参数:
    • 标签:文本型,必填,字段名称(如“姓名”)。
    • :文本型,必填,字段对应的值(如“张三”)。支持任意文本内容,如果值包含 HTML,将原样渲染。
  • 返回值: 数值型,新添加项在内部数组中的索引(从0开始)。
  • 示例: 描述列表1.添加项("邮箱", "user@example.com")

置项目数组(项目数组)

  • 功能: 批量设置所有键值对,会清空当前所有项,然后添加新数组中的项。
  • 参数: 项目数组,由对象组成的数组,每个对象须包含 labelvalue 属性。
  • 返回值: 无。
  • 示例:
    描述列表1.置项目数组([
        {label: "姓名", value: "张三"},
        {label: "年龄", value: "28"}
    ])
    

清空()

  • 功能: 清空所有键值对,列表变为空。
  • 返回值: 无。
  • 示例: 描述列表1.清空()

事件说明

描述列表组件未定义特有的事件,但继承自 视图 的所有事件均可使用(如 置被单击回调 可为整个列表绑定点击事件)。


⚠️ 注意事项

  1. 列数影响布局列数 改变布局密度,建议根据容器宽度和项数合理设置。若项数不足一行,剩余位置为空。
  2. 标签与值的对齐:标签默认左对齐,值也左对齐,但可通过 CSS 类自定义(如将值右对齐)。
  3. 值支持 HTML 参数支持 HTML 字符串,可用于显示链接、按钮或格式化文本,但注意 XSS 安全风险。
  4. 标题隐藏:若 标题 为空,标题栏隐藏,列表直接从键值对开始显示。
  5. 数据更新:添加或修改项后,组件会自动重新渲染,无需手动刷新。
  6. 样式覆盖:组件内部使用了默认样式(如标签加粗、边框等),可通过 CSS 类或 内联样式 覆盖。
  7. 与表格的区别:描述列表更适合展示结构化字段(字段名-值),而表格更适合展示列表数据(多行多列)。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档文本类组件_标签 —— 配合显示文本
  • 文档文本类组件_按钮 —— 配合操作按钮
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、数组操作等
  • 文档综合演示:产品规格展示 —— 实际应用示例

组件:文件选择框

文件选择框组件用于让用户从本地设备中选择一个或多个文件,支持多种文件类型过滤、多选、从摄像头/麦克风等媒体设备捕获(移动端),并提供了文件选择完毕的回调事件。它基于 HTML <input type="file"> 元素封装,适用于文件上传、图片选择、文档导入等需要用户选取文件的场景。

典型使用场景:

  • 用户头像上传(选择图片)
  • 文件上传(选择文档、压缩包等)
  • 批量导入(选择 CSV、Excel 数据文件)
  • 拍照/录像上传(移动端调用摄像头直接拍摄)
  • 附件上传(邮件、工单、消息中的附件)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
启用/禁多选多选文件选择框1.多选 = 真
限制文件类型接受类型文件选择框1.接受类型 = "image/*"
设置按钮文本按钮文本文件选择框1.按钮文本 = "选择图片"
禁用/启用组件禁用文件选择框1.禁用 = 真
获取所有已选文件取文件列表()变量 文件列表 = 文件选择框1.取文件列表()
获取指定索引的文件取文件(索引)变量 文件对象 = 文件选择框1.取文件(0)
清空已选文件清空()文件选择框1.清空()
设置选择完成回调置文件选择完毕回调(回调函数)文件选择框1.置文件选择完毕回调((源对象, 文件列表) => { ... })

样式美化参考

文件选择框的外观主要通过继承的视图属性和 CSS 类进行美化:

  • 整体容器:通过 宽度高度背景颜色边框(如 "1px solid #d9d9d9")、边框圆角(建议 "6px")等属性美化。
  • 按钮文本按钮文本 设置显示在按钮上的文字,默认 "选择文件"。按钮样式由组件内部控制,但可通过 CSS 类覆盖背景色、文字颜色等。
  • 文件列表显示:组件本身不显示已选文件列表,需通过回调自行处理显示逻辑。
  • 禁用状态禁用 = 真 时,按钮变灰且不可点击。

CSS 美化示例(在项目 CSS 文件中定义):

.my-file-input {
    border: 1px solid #d9d9d9;
    border-radius: 6px;
    padding: 4px 8px;
    font-size: 14px;
    background-color: #ffffff;
    transition: border-color 0.3s;
}
.my-file-input:hover {
    border-color: #1890ff;
}
.my-file-input:disabled {
    background-color: #f5f5f5;
    cursor: not-allowed;
}

在代码中应用样式类:文件选择框1.添加样式类("my-file-input")


基础示例

创建一个文件选择框,仅接受图片类型,支持多选,选择后输出文件信息。

变量 文件选择框1 = 创建 文件选择框()
文件选择框1.左边 = 50
文件选择框1.顶边 = 50
文件选择框1.宽度 = 160
文件选择框1.高度 = 36
文件选择框1.按钮文本 = "选择图片"
文件选择框1.接受类型 = "image/*"
文件选择框1.多选 = 真
文件选择框1.边框 = "1px solid #d9d9d9"
文件选择框1.边框圆角 = "6px"
文件选择框1.背景颜色 = "#ffffff"

文件选择框1.置文件选择完毕回调((源对象, 文件列表) => {
    变量 数量 = 取数组成员数(文件列表)
    调试输出("选择了 " + 数量 + " 个文件")
    变量循环(i = 0, 数量, 1)
        变量 文件 = 文件列表[i]
        调试输出("文件 " + (i+1) + ":" + 文件.name + ",大小:" + 文件.size + " 字节")
    结束循环
})

添加组件(文件选择框1)

综合示例:头像上传与预览

本示例构建一个头像上传功能,用户选择图片后立即显示预览,并展示文件信息,同时提供“上传”和“清除”按钮。

' ========== 创建布局 ==========
变量 主容器 = 创建 弹性布局()
主容器.方向 = "column"
主容器.宽度 = 400
主容器.左边 = 50
主容器.顶边 = 30
主容器.间距 = 12
添加组件(主容器)

' 标题
变量 标题 = 创建 标签()
标题.文本 = "👤 头像上传"
标题.字体大小 = "20px"
标题.字体粗细 = "bold"
主容器.添加组件(标题)

' 头像预览区域
变量 预览容器 = 创建 弹性布局()
预览容器.方向 = "row"
预览容器.侧轴对齐 = "center"
预览容器.主轴对齐 = "center"
预览容器.宽度 = 120
预览容器.高度 = 120
预览容器.背景颜色 = "#f0f0f0"
预览容器.边框 = "1px dashed #d9d9d9"
预览容器.边框圆角 = "60px"  ' 圆形
预览容器.溢出隐藏 = "hidden"
主容器.添加组件(预览容器)

变量 预览图片 = 创建 图片框()
预览图片.图片宽度 = 120
预览图片.图片高度 = 120
预览图片.图片显示模式 = "cover"
预览图片.替代文本 = "头像预览"
预览容器.添加组件(预览图片)

' 文件选择框
变量 文件选择框1 = 创建 文件选择框()
文件选择框1.宽度 = 160
文件选择框1.高度 = 36
文件选择框1.按钮文本 = "选择图片"
文件选择框1.接受类型 = "image/*"
文件选择框1.多选 = 假
文件选择框1.边框 = "1px solid #1890ff"
文件选择框1.边框圆角 = "6px"
主容器.添加组件(文件选择框1)

' 文件信息标签
变量 信息标签 = 创建 标签()
信息标签.文本 = "未选择文件"
信息标签.字体大小 = "14px"
信息标签.文本颜色 = "#999"
主容器.添加组件(信息标签)

' 操作按钮组
变量 按钮组 = 创建 弹性布局()
按钮组.方向 = "row"
按钮组.间距 = 12
主容器.添加组件(按钮组)

变量 上传按钮 = 创建 按钮()
上传按钮.文本 = "上传"
上传按钮.宽度 = 80
上传按钮.高度 = 32
上传按钮.背景颜色 = "#52c41a"
上传按钮.文本颜色 = "#ffffff"
上传按钮.边框圆角 = "6px"
上传按钮.禁用 = 真
按钮组.添加组件(上传按钮)

变量 清除按钮 = 创建 按钮()
清除按钮.文本 = "清除"
清除按钮.宽度 = 80
清除按钮.高度 = 32
清除按钮.背景颜色 = "#d9d9d9"
清除按钮.文本颜色 = "#333"
清除按钮.边框圆角 = "6px"
清除按钮.禁用 = 真
按钮组.添加组件(清除按钮)

' ========== 事件绑定 ==========
' 选择文件回调
文件选择框1.置文件选择完毕回调((源对象, 文件列表) => {
    如果(取数组成员数(文件列表) > 0)
        变量 文件 = 文件列表[0]
        ' 显示文件信息
        信息标签.文本 = "已选:" + 文件.name + "(" + 文件.size + " 字节)"
        ' 预览图片(通过创建临时URL)
        变量 图片URL = URL.createObjectURL(文件)
        预览图片.图片 = 图片URL
        预览图片.替代文本 = 文件.name
        ' 启用按钮
        上传按钮.禁用 = 假
        清除按钮.禁用 = 假
    否则
        信息标签.文本 = "未选择文件"
        预览图片.图片 = ""
        上传按钮.禁用 = 真
        清除按钮.禁用 = 真
    结束 如果
})

' 上传按钮
上传按钮.置被单击回调((源对象) => {
    变量 文件列表 = 文件选择框1.取文件列表()
    如果(取数组成员数(文件列表) == 0)
        弹出提示("请先选择图片")
        返回
    结束 如果
    变量 文件 = 文件列表[0]
    ' 模拟上传
    上传按钮.禁用 = 真
    上传按钮.文本 = "上传中..."
    延时执行(() => {
        上传按钮.禁用 = 假
        上传按钮.文本 = "上传"
        弹出提示("上传成功:" + 文件.name)
    }, 1500)
})

' 清除按钮
清除按钮.置被单击回调((源对象) => {
    文件选择框1.清空()  ' 清空已选文件
    预览图片.图片 = ""
    信息标签.文本 = "未选择文件"
    上传按钮.禁用 = 真
    清除按钮.禁用 = 真
    弹出提示("已清除")
})

属性详解

多选

  • 类型: 逻辑型
  • 说明: 设置或获取是否允许用户一次选择多个文件。当为 时,文件选择对话框中可按住 Ctrl 或 Shift 键选择多个文件。默认

接受类型

  • 类型: 文本型
  • 说明: 设置或获取允许选择的文件类型,用于过滤文件对话框中的可选文件。支持以下格式:
    • MIME 类型:如 "image/png""application/pdf"
    • 通配符:如 "image/*"(所有图片)、"audio/*"(所有音频)
    • 文件扩展名:如 ".doc"".xlsx"
    • 多个值用逗号分隔:如 "image/*,.pdf,.doc" 默认为空(允许所有文件类型)。

调用源

  • 类型: 文本型
  • 说明: 设置或获取媒体捕获源,主要用于移动端设备,可让用户直接从摄像头或麦克风捕获媒体。可选值:
    • "user":使用前置摄像头(自拍)
    • "environment":使用后置摄像头 通常与 接受类型 配合使用,如 接受类型 = "image/*"调用源 = "environment" 时,会弹出拍照选项。 默认为空(使用系统默认文件选择器)。

禁用

  • 类型: 逻辑型
  • 说明: 设置或获取是否禁用组件。禁用后,按钮不可点击,样式变灰。默认

按钮文本

  • 类型: 文本型
  • 说明: 设置或获取选择按钮上显示的文本。默认 "选择文件"。可以自定义为更符合场景的文字,如 "选择图片""上传文档" 等。

函数详解

取文件列表()

  • 功能: 获取当前已选择的所有文件列表。
  • 返回值: 数组,包含 File 对象(每个文件包含 namesizetypelastModified 等属性)。若未选择任何文件,返回空数组 []
  • 示例:
    变量 文件列表 = 文件选择框1.取文件列表()
    变量循环(i = 0, 取数组成员数(文件列表), 1)
        变量 文件 = 文件列表[i]
        调试输出("文件名:" + 文件.name)
    结束循环
    

取文件(索引)

  • 功能: 获取指定索引位置的文件对象。
  • 参数: 索引(数值型),从 0 开始。若省略索引,则默认取第一个文件(索引 0)。
  • 返回值: File 对象,如果索引无效则返回
  • 示例: 变量 文件 = 文件选择框1.取文件(0)

清空()

  • 功能: 清空当前已选择的文件列表,重置组件状态。调用后,界面上的文件选择按钮会恢复为未选择状态,且触发回调(文件列表为空)。
  • 返回值: 无。
  • 示例: 文件选择框1.清空()

置文件选择完毕回调(回调函数)

  • 功能: 设置当用户完成文件选择(点击“确定”按钮)时的回调函数。无论选择了一个还是多个文件,都会触发。
  • 参数: 回调函数,格式为 (源对象, 文件列表) => { ... }
    • 源对象:文件选择框组件本身。
    • 文件列表:包含已选文件的数组(File 对象列表)。
  • 返回值: 无。
  • 示例:
    文件选择框1.置文件选择完毕回调((源对象, 文件列表) => {
        弹出提示("选择了 " + 取数组成员数(文件列表) + " 个文件")
    })
    

事件说明

文件选择完毕(源对象, 文件列表)

  • 功能:置文件选择完毕回调 等效,适用于设计文件(.spldg)中定义的组件。
  • 示例:
    事件 文件选择框1.文件选择完毕(源对象, 文件列表)
        调试输出("已选文件数:" + 取数组成员数(文件列表))
    结束 事件
    

⚠️ 注意事项

  1. 文件对象属性File 对象包含 name(文件名)、size(字节大小)、type(MIME 类型)、lastModified(最后修改时间戳)等属性,可在回调中直接使用。
  2. 多选模式:设置 多选 = 真 后,用户可一次选择多个文件,取文件列表() 返回数组;若 多选 = 假,则只允许选择一个文件,但 取文件列表() 仍然返回数组(长度为 1)。
  3. 文件类型过滤接受类型 只是前端提示,用户仍可切换为“所有文件”绕过限制,后端需再次校验。
  4. 调用源(capture):在移动端且支持的情况下,设置 调用源 后,文件选择器会直接打开相机/麦克风,而不显示文件列表。建议搭配 接受类型 使用。
  5. 清空行为:调用 清空() 会重置文件选择框,但不会自动触发回调。如需在清空后执行逻辑,可手动调用回调处理。
  6. 预览图片:可使用 URL.createObjectURL(文件) 生成临时 URL 用于图片预览,但需注意内存释放(调用 URL.revokeObjectURL(url))。
  7. 文件大小文件.size 以字节为单位,可转换为 KB/MB 显示。
  8. 禁用状态禁用 = 真 时,按钮不可用,但仍然可以通过代码调用 取文件列表() 等方法获取之前选择的结果(如果有)。
  9. 事件触发时机置文件选择完毕回调 在用户点击“确定”后触发,若用户取消选择,则不会触发回调。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档图像类组件_图片框 —— 配合预览图片
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、数组操作等
  • 文档综合演示:头像上传与预览 —— 实际应用示例

组件:时间选择框

时间选择框组件用于让用户选择时间(时:分:秒),支持通过步长控制可选的秒数粒度(如每60秒一个可选点),并可设置禁用/只读状态、占位提示等。它基于 HTML <input type="time"> 元素封装,适用于预约时间、日程安排、提醒设置等需要精确时间选择的场景。

典型使用场景:

  • 预约系统(选择预约时间、服务时间)
  • 日程管理(设置会议时间、提醒时间)
  • 闹钟设置(选择闹钟时间)
  • 表单中的时间字段(上班时间、营业时间)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置时间值置值(时间字符串)时间选择框1.置值("14:30:00")
获取时间值字符串取值()变量 时间 = 时间选择框1.取值()
获取小时、分钟、秒取小时() / 取分钟() / 取秒()变量 时 = 时间选择框1.取小时()
设置步长(秒级)步长时间选择框1.步长 = 60
禁用/启用组件禁用时间选择框1.禁用 = 真
设置只读状态只读时间选择框1.只读 = 真
设置占位提示占位提示时间选择框1.占位提示 = "请选择时间"
设置选择完成回调置时间选择完毕回调(回调函数)时间选择框1.置时间选择完毕回调((源对象, 时间) => { ... })

样式美化参考

时间选择框的外观可通过继承的视图属性进行调整:

  • 整体容器:通过 宽度高度背景颜色边框(如 "1px solid #d9d9d9")、边框圆角(建议 "6px")等属性美化。
  • 字体样式:通过 字体大小(建议 "14px")、文本颜色 控制显示时间文本的外观。
  • 内边距:使用 内边距(如 "8px 12px")控制输入框内边距。
  • 禁用状态禁用 = 真 时,输入框变灰且不可交互。
  • 只读状态只读 = 真 时,输入框不可编辑但仍可聚焦,且样式可能略有不同(取决于浏览器)。

CSS 美化示例(在项目 CSS 文件中定义):

.my-time-input {
    border: 1px solid #d9d9d9;
    border-radius: 6px;
    padding: 8px 12px;
    font-size: 14px;
    transition: border-color 0.3s;
}
.my-time-input:focus {
    border-color: #1890ff;
    outline: none;
    box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
}
.my-time-input:disabled {
    background-color: #f5f5f5;
    cursor: not-allowed;
}
.my-time-input::placeholder {
    color: #bfbfbf;
}

在代码中应用样式类:时间选择框1.添加样式类("my-time-input")


基础示例

创建一个时间选择框,默认值为 18:30:00,步长为 60 秒(即只能选择整分钟),选择后输出时间。

变量 时间选择框1 = 创建 时间选择框()
时间选择框1.左边 = 50
时间选择框1.顶边 = 50
时间选择框1.宽度 = 160
时间选择框1.高度 = 36
时间选择框1.边框 = "1px solid #d9d9d9"
时间选择框1.边框圆角 = "6px"
时间选择框1.内边距 = "8px 12px"
时间选择框1.字体大小 = "14px"
时间选择框1.置值("18:30:00")
时间选择框1.步长 = 60  ' 每分钟一步

时间选择框1.置时间选择完毕回调((源对象, 时间字符串) => {
    弹出提示("选择的时间:" + 时间字符串)
})

添加组件(时间选择框1)

综合示例:会议预约时间选择

本示例构建一个会议预约表单,包含日期、开始时间、结束时间选择框,以及会议主题输入,提交时校验时间是否合理(开始时间必须早于结束时间)。

' ========== 创建表单容器 ==========
变量 表单容器 = 创建 绝对布局()
表单容器.左边 = 30
表单容器.顶边 = 30
表单容器.宽度 = 400
表单容器.背景颜色 = "#ffffff"
表单容器.边框 = "1px solid #e8e8e8"
表单容器.边框圆角 = "12px"
表单容器.内边距 = "24px"
添加组件(表单容器)

' 标题
变量 标题 = 创建 标签()
标题.文本 = "📅 预约会议"
标题.字体大小 = "20px"
标题.字体粗细 = "bold"
标题.文本颜色 = "#333"
标题.内边距 = "0 0 16px 0"
表单容器.添加组件(标题)

' 会议主题
变量 主题标签 = 创建 标签()
主题标签.文本 = "会议主题"
主题标签.字体大小 = "14px"
主题标签.文本颜色 = "#666"
主题标签.内边距 = "8px 0 4px"
表单容器.添加组件(主题标签)

变量 主题输入 = 创建 单行输入框()
主题输入.宽度 = 352
主题输入.高度 = 36
主题输入.提示文本 = "请输入会议主题"
主题输入.边框 = "1px solid #d9d9d9"
主题输入.边框圆角 = "6px"
主题输入.内边距 = "8px 12px"
表单容器.添加组件(主题输入)

' 开始时间
变量 开始标签 = 创建 标签()
开始标签.文本 = "开始时间"
开始标签.字体大小 = "14px"
开始标签.文本颜色 = "#666"
开始标签.内边距 = "12px 0 4px"
表单容器.添加组件(开始标签)

变量 开始时间框 = 创建 时间选择框()
开始时间框.宽度 = 352
开始时间框.高度 = 36
开始时间框.边框 = "1px solid #d9d9d9"
开始时间框.边框圆角 = "6px"
开始时间框.内边距 = "8px 12px"
开始时间框.字体大小 = "14px"
开始时间框.步长 = 60  ' 整分钟
开始时间框.置值("09:00:00")
开始时间框.占位提示 = "选择开始时间"
表单容器.添加组件(开始时间框)

' 结束时间
变量 结束标签 = 创建 标签()
结束标签.文本 = "结束时间"
结束标签.字体大小 = "14px"
结束标签.文本颜色 = "#666"
结束标签.内边距 = "12px 0 4px"
表单容器.添加组件(结束标签)

变量 结束时间框 = 创建 时间选择框()
结束时间框.宽度 = 352
结束时间框.高度 = 36
结束时间框.边框 = "1px solid #d9d9d9"
结束时间框.边框圆角 = "6px"
结束时间框.内边距 = "8px 12px"
结束时间框.字体大小 = "14px"
结束时间框.步长 = 60
结束时间框.置值("10:00:00")
结束时间框.占位提示 = "选择结束时间"
表单容器.添加组件(结束时间框)

' 提交按钮
变量 提交按钮 = 创建 按钮()
提交按钮.文本 = "预约"
提交按钮.宽度 = 352
提交按钮.高度 = 44
提交按钮.背景颜色 = "#1890ff"
提交按钮.文本颜色 = "#ffffff"
提交按钮.边框圆角 = "6px"
提交按钮.字体大小 = "16px"
提交按钮.内边距 = "16px 0 0"
表单容器.添加组件(提交按钮)

' 错误提示
变量 错误标签 = 创建 标签()
错误标签.文本 = ""
错误标签.字体大小 = "14px"
错误标签.文本颜色 = "#ff4d4f"
错误标签.内边距 = "8px 0 0"
错误标签.可视 = "hidden"
表单容器.添加组件(错误标签)

' ========== 提交校验 ==========
提交按钮.置被单击回调((源对象, 事件对象) => {
    变量 主题 = 删首尾空(主题输入.内容)
    变量 开始 = 开始时间框.取值()
    变量 结束 = 结束时间框.取值()
    
    如果(主题 == "")
        错误标签.文本 = "请输入会议主题"
        错误标签.可视 = "visible"
        主题输入.获取焦点()
        返回
    结束 如果
    如果(开始 == "" 或 结束 == "")
        错误标签.文本 = "请选择完整的时间"
        错误标签.可视 = "visible"
        返回
    结束 如果
    
    ' 比较时间(简单字符串比较,格式 HH:mm:ss 可直接比较)
    如果(开始 >= 结束)
        错误标签.文本 = "结束时间必须晚于开始时间"
        错误标签.可视 = "visible"
        返回
    结束 如果
    
    错误标签.可视 = "hidden"
    弹出提示("预约成功!会议:" + 主题 + " 从 " + 开始 + " 到 " + 结束)
    
    ' 清空表单(模拟提交后重置)
    主题输入.内容 = ""
    开始时间框.置值("09:00:00")
    结束时间框.置值("10:00:00")
})

' ========== 当时间改变时,隐藏错误提示 ==========
开始时间框.置时间选择完毕回调((源对象, 时间字符串) => {
    错误标签.可视 = "hidden"
})

结束时间框.置时间选择完毕回调((源对象, 时间字符串) => {
    错误标签.可视 = "hidden"
})

属性详解

禁用

  • 类型: 逻辑型
  • 说明: 设置或获取是否禁用组件。禁用后,用户无法点击输入框或通过键盘修改时间,样式变灰(由浏览器控制)。默认

只读

  • 类型: 逻辑型
  • 说明: 设置或获取是否为只读模式。只读模式下,用户可以看到时间值,但无法修改(输入框不可编辑)。与禁用的区别在于,只读状态样式通常不变(非灰色),且输入框仍然可以获得焦点。默认

步长

  • 类型: 数值型
  • 说明: 设置或获取秒级步长,决定了时间选择器在分钟或秒上的粒度。常用取值:
    • 1:秒级步长,用户可精确到秒。
    • 60:分钟级步长,秒数固定为 00。
    • 3600:小时级步长,分钟和秒固定为 00。 默认 60(分钟级)。此属性影响用户点击增减按钮或拖动时的变化量,也限制可选时间点。

占位提示

  • 类型: 文本型
  • 说明: 设置或获取输入框为空时显示的占位提示文本,如 "请选择时间"。当用户选择时间后,占位文本消失。

函数详解

置值(时间字符串)

  • 功能: 设置时间选择框的当前值。
  • 参数: 时间字符串,格式必须为 HH:mmHH:mm:ss(24小时制),例如 "14:30""14:30:00"。若省略秒部分,默认为 00
  • 返回值: 无。
  • 示例: 时间选择框1.置值("08:30:00")

取值()

  • 功能: 获取当前选择的时间字符串,格式固定为 HH:mm:ss(24小时制)。
  • 返回值: 文本型,如 "14:30:00";若未选择任何时间,返回空字符串 ""
  • 示例: 变量 时间 = 时间选择框1.取值()

取小时()

  • 功能: 获取当前时间的小时部分(0~23)。
  • 返回值: 数值型,若未选择时间返回 -10(浏览器行为不同,建议先判断 取值() 是否为空)。
  • 示例: 变量 时 = 时间选择框1.取小时()

取分钟()

  • 功能: 获取当前时间的分钟部分(0~59)。
  • 返回值: 数值型。
  • 示例: 变量 分 = 时间选择框1.取分钟()

取秒()

  • 功能: 获取当前时间的秒部分(0~59)。
  • 返回值: 数值型。
  • 示例: 变量 秒 = 时间选择框1.取秒()

置时间选择完毕回调(回调函数)

  • 功能: 设置当用户完成时间选择(即输入框失去焦点或用户按回车确认)时的回调函数。
  • 参数: 回调函数,格式为 (源对象, 时间字符串) => { ... }
    • 源对象:时间选择框组件本身。
    • 时间字符串:当前选择的时间(格式 HH:mm:ss)。
  • 返回值: 无。
  • 示例:
    时间选择框1.置时间选择完毕回调((源对象, 时间) => {
        调试输出("选择了时间:" + 时间)
    })
    

事件说明

时间选择完毕(源对象, 时间字符串)

  • 功能:置时间选择完毕回调 等效,适用于设计文件(.spldg)中定义的组件。
  • 示例:
    事件 时间选择框1.时间选择完毕(源对象, 时间字符串)
        调试输出("时间:" + 时间字符串)
    结束 事件
    

⚠️ 注意事项

  1. 时间格式置值 接受 HH:mmHH:mm:ss,但 取值() 始终返回 HH:mm:ss 格式。建议统一使用 HH:mm:ss 以避免混淆。
  2. 步长的实际效果步长 控制秒级步进,例如步长=60 时,用户只能选择 00:00、00:01、... 但实际上对分钟选择更常用。浏览器可能对步长的支持有限,建议测试目标浏览器。
  3. 禁用与只读的区别禁用 完全禁用输入,样式变灰;只读 允许用户聚焦但无法修改,样式不变。可根据需求选择。
  4. 占位提示显示:仅当输入框为空时显示占位文本,一旦选择时间,占位文本消失。
  5. 获取时间组成部分取小时()取分钟()取秒() 在未选择时间时可能返回 0-1,建议先通过 取值() 判断是否为空。
  6. 浏览器兼容性:时间选择框基于 <input type="time">,在大多数现代浏览器(Chrome、Firefox、Edge、Safari)中支持良好,但 UI 风格因浏览器而异。
  7. 回调触发时机置时间选择完毕回调 在用户通过点击确认或失去焦点时触发。若用户清空输入框(删除所有字符),也可能触发回调(此时时间字符串为空)。
  8. 设置时间值后触发回调:通过 置值 设置时间也会触发回调(如果值确实改变了)。注意避免在回调中再次设置值导致循环。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档其它通用类组件_数字输入框 —— 类似步长控制
  • 文档其它通用类组件_日期选择框 —— 日期选择组件
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、条件判断等
  • 文档综合演示:会议预约表单 —— 实际应用示例

组件:气泡提示框

气泡提示框(Tooltip)组件用于在用户悬停、聚焦或点击某个元素时,在该元素附近弹出一个包含提示信息的气泡卡片。它支持四个方向(上、下、左、右)弹出,可自定义标题、内容、背景色、文本颜色、延迟时间等,适用于表单提示、操作说明、帮助信息、图标释义等场景。

典型使用场景:

  • 表单字段的辅助说明(如密码格式提示)
  • 图标按钮的功能释义(如“删除”、“编辑”)
  • 数据展示的额外信息(如悬停显示完整内容)
  • 新手引导中的操作提示

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置气泡标题标题气泡提示框1.标题 = "提示"
设置气泡内容内容气泡提示框1.内容 = "这里是说明"
设置弹出方向弹出位置气泡提示框1.弹出位置 = "bottom"
设置触发方式触发方式气泡提示框1.触发方式 = "click"
设置背景色背景颜色气泡提示框1.背景颜色 = "#ffffff"
设置文本颜色文本颜色气泡提示框1.文本颜色 = "#333"
设置显示延迟(毫秒)显示延迟气泡提示框1.显示延迟 = 200
设置隐藏延迟(毫秒)隐藏延迟气泡提示框1.隐藏延迟 = 150
绑定目标元素附加到视图(元素)气泡提示框1.附加到视图(按钮1)
解除绑定取消附加()气泡提示框1.取消附加()
销毁组件销毁()气泡提示框1.销毁()

样式美化参考

气泡提示框的外观可通过以下属性进行自定义:

  • 整体容器:背景色和文本颜色分别由 背景颜色文本颜色 控制,默认半透明黑色背景搭配白色文字。
  • 方向与箭头弹出位置 决定气泡相对于目标元素的方向,箭头会自动指向目标。
  • 延迟控制显示延迟隐藏延迟 可控制提示框出现和消失的速度,避免误触。
  • 边框与圆角:可通过继承的 边框圆角(建议 "6px")和 边框 属性微调。
  • 内边距:通过 内边距(建议 "8px 12px")控制内容与边框的距离。

CSS 美化示例(在项目 CSS 文件中定义):

.my-tooltip {
    border-radius: 6px;
    padding: 8px 12px;
    box-shadow: 0 2px 8px rgba(0,0,0,0.2);
    font-size: 13px;
}

在代码中应用样式类:气泡提示框1.添加样式类("my-tooltip")


基础示例

创建一个按钮,悬停时显示带标题和内容的气泡提示。

变量 气泡提示框1 = 创建 气泡提示框()
气泡提示框1.左边 = 50
气泡提示框1.顶边 = 50
气泡提示框1.标题 = "提示"
气泡提示框1.内容 = "这是一个简单的气泡提示"
气泡提示框1.弹出位置 = "top"
气泡提示框1.触发方式 = "hover"
气泡提示框1.背景颜色 = "rgba(0,0,0,0.75)"
气泡提示框1.文本颜色 = "#ffffff"
气泡提示框1.显示延迟 = 100
气泡提示框1.隐藏延迟 = 100

' 创建目标元素(按钮)
变量 按钮1 = 创建 按钮()
按钮1.文本 = "悬停我"
按钮1.宽度 = 100
按钮1.高度 = 36
' 将气泡绑定到按钮
气泡提示框1.附加到视图(按钮1)

' 先添加按钮到容器
添加组件(按钮1)
' 再添加气泡(气泡组件本身不可见,但需添加到视图树)
添加组件(气泡提示框1)

综合示例:表单字段辅助提示

本示例创建一个登录表单,为用户名和密码输入框分别添加气泡提示,说明输入要求。

' ========== 创建表单容器 ==========
变量 表单容器 = 创建 绝对布局()
表单容器.左边 = 30
表单容器.顶边 = 30
表单容器.宽度 = 360
表单容器.背景颜色 = "#ffffff"
表单容器.边框 = "1px solid #e8e8e8"
表单容器.边框圆角 = "12px"
表单容器.内边距 = "24px"
添加组件(表单容器)

' 标题
变量 标题 = 创建 标签()
标题.文本 = "🔐 登录"
标题.字体大小 = "20px"
标题.字体粗细 = "bold"
标题.内边距 = "0 0 16px 0"
表单容器.添加组件(标题)

' ----- 用户名输入框 -----
变量 用户标签 = 创建 标签()
用户标签.文本 = "用户名"
用户标签.字体大小 = "14px"
用户标签.文本颜色 = "#666"
用户标签.内边距 = "8px 0 4px"
表单容器.添加组件(用户标签)

变量 用户名输入 = 创建 单行输入框()
用户名输入.宽度 = 312
用户名输入.高度 = 36
用户名输入.提示文本 = "请输入用户名"
用户名输入.边框 = "1px solid #d9d9d9"
用户名输入.边框圆角 = "6px"
用户名输入.内边距 = "8px 12px"
表单容器.添加组件(用户名输入)

' 用户名气泡提示
变量 气泡_用户 = 创建 气泡提示框()
气泡_用户.标题 = "用户名要求"
气泡_用户.内容 = "4-16位字母或数字,不能包含特殊字符"
气泡_用户.弹出位置 = "right"
气泡_用户.触发方式 = "focus"  ' 获得焦点时弹出
气泡_用户.背景颜色 = "rgba(0,0,0,0.8)"
气泡_用户.文本颜色 = "#ffffff"
气泡_用户.显示延迟 = 0
气泡_用户.隐藏延迟 = 200
气泡_用户.附加到视图(用户名输入)
添加组件(气泡_用户)

' ----- 密码输入框 -----
变量 密码标签 = 创建 标签()
密码标签.文本 = "密码"
密码标签.字体大小 = "14px"
密码标签.文本颜色 = "#666"
密码标签.内边距 = "12px 0 4px"
表单容器.添加组件(密码标签)

变量 密码输入 = 创建 密码输入框()
密码输入.宽度 = 312
密码输入.高度 = 36
密码输入.占位提示 = "请输入密码"
密码输入.边框 = "1px solid #d9d9d9"
密码输入.边框圆角 = "6px"
密码输入.内边距 = "8px 12px"
密码输入.最大长度 = 20
表单容器.添加组件(密码输入)

' 密码气泡提示
变量 气泡_密码 = 创建 气泡提示框()
气泡_密码.标题 = "密码要求"
气泡_密码.内容 = "至少8位,包含大小写字母和数字"
气泡_密码.弹出位置 = "right"
气泡_密码.触发方式 = "focus"
气泡_密码.背景颜色 = "rgba(0,0,0,0.8)"
气泡_密码.文本颜色 = "#ffffff"
气泡_密码.显示延迟 = 0
气泡_密码.隐藏延迟 = 200
气泡_密码.附加到视图(密码输入)
添加组件(气泡_密码)

' ----- 登录按钮 -----
变量 登录按钮 = 创建 按钮()
登录按钮.文本 = "登 录"
登录按钮.宽度 = 312
登录按钮.高度 = 44
登录按钮.背景颜色 = "#1890ff"
登录按钮.文本颜色 = "#ffffff"
登录按钮.边框圆角 = "6px"
登录按钮.字体大小 = "16px"
表单容器.添加组件(登录按钮)

属性详解

标题

  • 类型: 文本型
  • 说明: 设置或获取气泡的标题文本,以粗体显示在内容上方。若为空,则不显示标题区域。

内容

  • 类型: 文本型
  • 说明: 设置或获取气泡的主体内容文本。支持纯文本或简单的 HTML(如 <br><strong> 等),但建议保持简洁。

弹出位置

  • 类型: 文本型
  • 说明: 设置或获取气泡相对于目标元素弹出的方向。可选值:
    • "top"(默认):在目标上方弹出
    • "bottom":在目标下方弹出
    • "left":在目标左侧弹出
    • "right":在目标右侧弹出 组件会自动调整位置以确保气泡在可视区域内。

触发方式

  • 类型: 文本型
  • 说明: 设置或获取触发气泡显示的方式。可选值:
    • "hover"(默认):鼠标悬停时显示,移出时隐藏
    • "click":点击目标时切换显示/隐藏
    • "focus":目标元素获得焦点时显示,失去焦点时隐藏(适用于输入框)

背景颜色

  • 类型: 文本型
  • 说明: 设置或获取气泡的背景色,支持 CSS 颜色值。默认 "rgba(0,0,0,0.75)"(半透明黑色)。

文本颜色

  • 类型: 文本型
  • 说明: 设置或获取气泡内文本的颜色,支持 CSS 颜色值。默认 "#ffffff"(白色)。

显示延迟

  • 类型: 数值型
  • 说明: 设置或获取触发条件满足后,气泡显示之前的延迟时间(毫秒),避免误触。默认 100

隐藏延迟

  • 类型: 数值型
  • 说明: 设置或获取触发条件消失后,气泡隐藏之前的延迟时间(毫秒),给用户留出阅读时间。默认 100

函数详解

附加到视图(元素)

  • 功能: 将气泡提示框绑定到目标元素上,当目标元素触发指定事件时,气泡会在其附近弹出。
  • 参数: 元素,可以是:
    • 视图组件实例(如 按钮1输入框1
    • 原生 DOM 元素(如 创建元素("div") 返回的对象)
    • 选择器字符串(如 "#myButton"
  • 返回值: 无。
  • 示例: 气泡提示框1.附加到视图(用户名输入)

取消附加()

  • 功能: 解除当前气泡与目标元素的绑定,并立即隐藏气泡(如果正在显示)。
  • 返回值: 无。
  • 示例: 气泡提示框1.取消附加()

销毁()

  • 功能: 完全销毁气泡组件,从 DOM 中移除气泡节点并解除事件监听。调用后组件不可再用。
  • 返回值: 无。
  • 示例: 气泡提示框1.销毁()

⚠️ 注意事项

  1. 必须绑定目标元素:气泡本身不会自动显示,必须通过 附加到视图 绑定一个目标元素后才会生效。
  2. 父子容器顺序:建议先将目标元素添加到父容器,再将气泡添加到同一父容器,确保气泡的层级正确。
  3. 触发方式选择hover 适合桌面端,click 适合移动端(因为移动端没有悬停状态),focus 适合输入框。
  4. 延迟时间:合理设置延迟可提升用户体验,避免过于灵敏或响应迟钝。
  5. 内容长度:气泡内容不宜过长,否则可能超出屏幕或被裁剪。若内容较多,可考虑使用更复杂的弹窗组件。
  6. 手动控制显示:组件本身不提供手动显示/隐藏的方法,完全由触发方式自动控制。
  7. 销毁与内存泄漏:当不再需要气泡时,应调用 销毁() 释放资源,尤其在动态创建/销毁的场景下。
  8. 样式覆盖:若自定义样式,注意覆盖默认的背景色和文字颜色,确保可读性。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档其它通用类组件_通知提醒框 —— 类似弹窗提示组件
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、事件处理等
  • 文档综合演示:表单辅助提示 —— 实际应用示例

组件:水印标签

水印标签组件用于在指定元素(或整个页面)上添加背景水印文字,通常用于版权保护、文档标识、内部文件标记等场景。水印以半透明文字平铺在目标元素背景上,可自定义文字内容、字号、颜色、旋转角度、间距等,且不影响用户与目标元素的交互。

典型使用场景:

  • 内部文档/管理后台添加“机密”“内部使用”等水印
  • 版权保护,防止截图盗用
  • 状态标记(如“草稿”“已归档”)
  • 品牌标识(在页面背景添加品牌名)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置水印文字内容文本水印标签1.文本 = "机密文档"
设置水印字号(像素)字号水印标签1.字号 = 18
设置水印颜色(建议半透明)颜色水印标签1.颜色 = "rgba(0,0,0,0.06)"
设置旋转角度(度)旋转角度水印标签1.旋转角度 = -30
设置水印横向间距(像素)横向间距水印标签1.横向间距 = 40
设置水印纵向间距(像素)纵向间距水印标签1.纵向间距 = 120
设置起始偏移位置偏移X / 偏移Y水印标签1.偏移X = 10
设置层级(z-index)层级水印标签1.层级 = 99
绑定目标元素置目标元素(元素)水印标签1.置目标元素(面板1)
隐藏水印隐藏()水印标签1.隐藏()
刷新重绘刷新()水印标签1.刷新()
销毁组件销毁()水印标签1.销毁()

样式美化参考

水印本身是文字平铺,其外观主要通过以下属性调整:

  • 文字样式文本 决定显示内容,字号 控制大小,颜色 控制透明度(建议使用 rgba 半透明色,如 rgba(0,0,0,0.05)),字体(继承自视图)可设置字体族。
  • 布局排列旋转角度 使水印倾斜(通常为负值),横向间距纵向间距 控制水印之间的疏密程度。
  • 位置偏移偏移X偏移Y 可调整水印网格的整体起始位置,避免与内容重叠。
  • 层级层级(z-index)控制水印与目标元素其他内容的叠放顺序,默认 9,通常无需修改。

基础示例

在一个卡片元素上添加“VcnStudio 机密”水印。

' 创建目标卡片(一个面板)
变量 卡片 = 创建 卡片框()
卡片.左边 = 50
卡片.顶边 = 50
卡片.宽度 = 400
卡片.高度 = 300
卡片.标题 = "内部文档"
卡片.内容 = "<p>这里包含敏感信息,仅供内部使用。</p>"
添加组件(卡片)

' 创建水印并绑定到卡片
变量 水印 = 创建 水印标签()
水印.文本 = "VcnStudio 机密"
水印.字号 = 18
水印.颜色 = "rgba(0,0,0,0.06)"
水印.旋转角度 = -25
水印.横向间距 = 30
水印.纵向间距 = 100
水印.层级 = 5
水印.置目标元素(卡片)
添加组件(水印)

综合示例:为整个页面添加“草稿”水印

本示例为整个页面(body)添加“草稿”水印,用于标识当前版本为草稿状态。

' 创建水印
变量 页面水印 = 创建 水印标签()
页面水印.文本 = "草 稿"
页面水印.字号 = 24
页面水印.颜色 = "rgba(255,77,79,0.08)"
页面水印.旋转角度 = -30
页面水印.横向间距 = 50
页面水印.纵向间距 = 150
页面水印.层级 = 999
' 将水印添加到整个页面(body)
' 使用查找元素ByID或直接取body对象
变量 body元素 = 取本窗口对象().document.body
页面水印.置目标元素(body元素)
添加组件(页面水印)

' 添加一个切换按钮,用于显示/隐藏水印
变量 切换按钮 = 创建 按钮()
切换按钮.左边 = 50
切换按钮.顶边 = 30
切换按钮.文本 = "隐藏水印"
切换按钮.宽度 = 120
切换按钮.高度 = 36
切换按钮.背景颜色 = "#1890ff"
切换按钮.文本颜色 = "#ffffff"
切换按钮.边框圆角 = "6px"
添加组件(切换按钮)

变量 水印可见 = 真
切换按钮.置被单击回调((源对象) => {
    如果(水印可见)
        页面水印.隐藏()
        切换按钮.文本 = "显示水印"
    否则
        ' 隐藏后无法直接显示,需要重新刷新(但隐藏没有对应的显示方法,可重新设置目标元素并刷新)
        ' 注意:隐藏只是添加了 display:none,可重新调用刷新或重新设置目标元素
        ' 更简单:重新设置目标元素并刷新
        页面水印.置目标元素(body元素)
        页面水印.刷新()
        切换按钮.文本 = "隐藏水印"
    结束 如果
    水印可见 = !水印可见
})

属性详解

文本

  • 类型: 文本型
  • 说明: 设置或获取水印显示的文字内容。可以为任意字符串,支持中文、英文、数字等。

字号

  • 类型: 数值型
  • 说明: 设置或获取水印文字的字体大小,单位为像素(px)。默认 16

颜色

  • 类型: 文本型
  • 说明: 设置或获取水印文字的颜色,建议使用半透明色以避免遮挡背景内容,如 "rgba(0,0,0,0.06)"。支持所有 CSS 颜色值。默认 "rgba(0,0,0,0.08)"

旋转角度

  • 类型: 数值型
  • 说明: 设置或获取水印文字的旋转角度(度),负值表示逆时针旋转。默认 -22。常用范围 -45-15

横向间距

  • 类型: 数值型
  • 说明: 设置或获取水印之间在水平方向上的间隔距离,单位为像素。默认 24

纵向间距

  • 类型: 数值型
  • 说明: 设置或获取水印之间在垂直方向上的间隔距离,单位为像素。默认 96

偏移X

  • 类型: 数值型
  • 说明: 设置或获取水印网格在水平方向上的起始偏移量,单位为像素。默认 0。可用于微调水印位置,避免与特定内容重叠。

偏移Y

  • 类型: 数值型
  • 说明: 设置或获取水印网格在垂直方向上的起始偏移量,单位为像素。默认 0

层级

  • 类型: 数值型
  • 说明: 设置或获取水印的 z-index 值,控制水印与目标元素其他内容的叠放次序。默认 9。如果目标元素内部已有较高层级的元素,可适当提高此值。

函数详解

置目标元素(元素)

  • 功能: 指定水印要覆盖的目标元素。水印将作为该元素的背景层平铺显示。
  • 参数: 元素,可以是视图组件实例(如 卡片1)、原生 DOM 元素(如 body)或选择器字符串(如 "#container")。
  • 返回值: 无。
  • 示例: 水印标签1.置目标元素(面板1)

取目标元素()

  • 功能: 获取当前绑定的目标元素。
  • 返回值: 原生 DOM 元素,若未设置则返回
  • 示例: 变量 目标 = 水印标签1.取目标元素()

隐藏()

  • 功能: 隐藏水印(将水印的显示模式设为 none)。水印仍然存在于 DOM 中,可通过后续操作重新显示(但需注意,隐藏后若需重新显示,可调用 刷新() 或重新设置目标元素)。
  • 返回值: 无。
  • 示例: 水印标签1.隐藏()

刷新()

  • 功能: 重新渲染水印。当水印的属性(如文本、颜色、间距等)发生改变后,调用此方法使更改生效。也可用于隐藏后重新显示(重新设置目标元素并刷新)。
  • 返回值: 无。
  • 示例: 水印标签1.刷新()

销毁()

  • 功能: 完全销毁水印组件,从 DOM 中移除水印元素,释放相关资源。调用后组件不可再用。
  • 返回值: 无。
  • 示例: 水印标签1.销毁()

⚠️ 注意事项

  1. 目标元素必须存在:调用 置目标元素 时,目标元素必须已经添加到 DOM 中(即已调用 添加组件 或已存在于页面),否则水印无法显示。
  2. 半透明颜色建议:水印应使用半透明颜色(如 rgba(0,0,0,0.05)),以便既能辨认又不影响内容的可读性。
  3. 水印与交互:水印位于目标元素的背景层,不会阻止鼠标事件(如点击、选择文本等),用户仍可与目标元素正常交互。
  4. 刷新时机:修改水印属性后,需调用 刷新() 使更改生效。若只是修改 文本颜色 等,调用 刷新() 即可更新。
  5. 隐藏与显示隐藏() 仅隐藏水印,但水印仍然在 DOM 中。若要重新显示,可重新调用 置目标元素刷新(),或直接修改 可视 属性(但建议使用提供的方法)。
  6. 层级冲突:如果目标元素内有其他固定定位或高 z-index 的元素,水印可能被遮挡,可适当提高 层级 值。
  7. 性能:水印通过 Canvas 或 CSS 背景实现(具体实现由框架决定),通常性能良好,但若页面较大且水印密集,可能略有影响。
  8. 跨域/安全:水印仅用于前端视觉标识,不能替代真正的版权保护措施。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档其它通用类组件_卡片框 —— 常配合使用的内容容器
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、对象操作等
  • 文档综合演示:页面水印标记 —— 实际应用示例

组件:空状态面板

空状态面板组件用于在数据为空、无内容或操作失败时展示友好的提示界面,通常包含图标、描述文本和引导操作按钮。它有助于提升用户体验,让用户明确当前状态并知道下一步可以做什么。适用于列表为空、搜索无结果、购物车为空、错误提示等场景。

典型使用场景:

  • 列表数据为空(无订单、无收藏、无消息)
  • 搜索无结果(未找到匹配内容)
  • 购物车为空(提示用户去逛逛)
  • 操作失败或权限不足(提示无权限)
  • 首页或模块的初始状态(引导用户开始使用)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置图标(emoji 或字符)图标空状态面板1.图标 = "📭"
设置描述文本描述空状态面板1.描述 = "暂无订单"
设置图标颜色图标颜色空状态面板1.图标颜色 = "#1890ff"
设置描述文本颜色描述颜色空状态面板1.描述颜色 = "#999"
设置自定义图标(DOM 元素)置图标元素(元素)空状态面板1.置图标元素(SVG元素)
设置操作按钮/区域置操作元素(元素)空状态面板1.置操作元素(刷新按钮)
调整整体尺寸宽度 / 高度空状态面板1.宽度 = 400

样式美化参考

空状态面板的外观可通过继承的视图属性和专用属性进行调整:

  • 整体容器:通过 宽度高度背景颜色边框(如 "1px solid #f0f0f0")、边框圆角(建议 "8px")等属性美化。
  • 图标区域图标 支持 emoji(如 "📭")或文本字符;图标颜色 控制图标颜色。若需更复杂的图标(如 SVG),可使用 置图标元素 传入自定义 DOM 元素。
  • 描述文本描述 设置提示文字,描述颜色 控制文字颜色,可通过继承的 字体大小(建议 "16px")、字体粗细 等调整文字样式。
  • 操作区域:通过 置操作元素 可传入按钮、链接或其他交互元素,引导用户进行下一步操作。
  • 布局对齐:默认内容居中,可通过 内容水平对齐方式内容垂直对齐方式(继承自视图)调整对齐。

基础示例

创建一个简单的空状态面板,显示“暂无数据”和刷新按钮。

变量 空状态面板1 = 创建 空状态面板()
空状态面板1.左边 = 50
空状态面板1.顶边 = 50
空状态面板1.宽度 = 300
空状态面板1.高度 = 200
空状态面板1.图标 = "📭"
空状态面板1.描述 = "暂无数据"
空状态面板1.图标颜色 = "#1890ff"
空状态面板1.描述颜色 = "#999"
空状态面板1.字体大小 = "16px"
空状态面板1.边框 = "1px solid #e8e8e8"
空状态面板1.边框圆角 = "8px"
空状态面板1.背景颜色 = "#fafafa"

' 创建操作按钮(原生 DOM 元素)
变量 刷新按钮 = 创建元素("button")
刷新按钮.textContent = "刷新"
刷新按钮.style.padding = "6px 16px"
刷新按钮.style.background = "#1890ff"
刷新按钮.style.color = "#fff"
刷新按钮.style.border = "none"
刷新按钮.style.borderRadius = "4px"
刷新按钮.style.cursor = "pointer"
' 绑定点击事件(原生方式)
刷新按钮.onclick = () => {
    弹出提示("刷新中...")
}

空状态面板1.置操作元素(刷新按钮)

添加组件(空状态面板1)

综合示例:购物车空状态

本示例模拟一个购物车页面,当购物车为空时展示空状态面板,包含购物车图标、提示文字和“去逛逛”按钮,点击按钮跳转到商品列表。

' ========== 创建页面容器 ==========
变量 页面容器 = 创建 绝对布局()
页面容器.左边 = 30
页面容器.顶边 = 30
页面容器.宽度 = 400
页面容器.高度 = 350
页面容器.边框 = "1px solid #e8e8e8"
页面容器.边框圆角 = "12px"
页面容器.背景颜色 = "#ffffff"
添加组件(页面容器)

' 标题栏
变量 标题栏 = 创建 标签()
标题栏.文本 = "🛒 购物车"
标题栏.字体大小 = "18px"
标题栏.字体粗细 = "bold"
标题栏.内边距 = "16px"
标题栏.边框底边 = "1px solid #f0f0f0"
页面容器.添加组件(标题栏)

' ========== 空状态面板 ==========
变量 空状态 = 创建 空状态面板()
空状态.左边 = 40
空状态.顶边 = 60
空状态.宽度 = 320
空状态.高度 = 220
空状态.图标 = "🛒"
空状态.描述 = "购物车是空的"
空状态.图标颜色 = "#d9d9d9"
空状态.描述颜色 = "#999"
空状态.字体大小 = "18px"
空状态.边框 = "none"
空状态.背景颜色 = "transparent"
页面容器.添加组件(空状态)

' 子描述标签(额外补充)
变量 子描述 = 创建 标签()
子描述.文本 = "快去挑选心仪的商品吧!"
子描述.字体大小 = "14px"
子描述.文本颜色 = "#bfbfbf"
子描述.内容水平对齐 = "center"
子描述.左边 = 40
子描述.顶边 = 170
子描述.宽度 = 320
页面容器.添加组件(子描述)

' 操作按钮(“去逛逛”按钮)
变量 逛逛按钮 = 创建元素("button")
逛逛按钮.textContent = "去逛逛"
逛逛按钮.style.padding = "8px 32px"
逛逛按钮.style.background = "#1890ff"
逛逛按钮.style.color = "#fff"
逛逛按钮.style.border = "none"
逛逛按钮.style.borderRadius = "6px"
逛逛按钮.style.fontSize = "16px"
逛逛按钮.style.cursor = "pointer"
逛逛按钮.onclick = () => {
    弹出提示("跳转到商品列表页面")
    ' 实际项目中可调用:切换页面("商品列表")
}
空状态.置操作元素(逛逛按钮)

属性详解

图标

  • 类型: 文本型
  • 说明: 设置或获取空状态显示的图标,支持 emoji(如 "📭")、Unicode 字符(如 "⚠️")或简单的 HTML 实体。默认 "📭"

描述

  • 类型: 文本型
  • 说明: 设置或获取空状态显示的描述文本,用于说明当前状态或提示用户。默认 "暂无数据"

图标颜色

  • 类型: 文本型
  • 说明: 设置或获取图标的颜色,支持 CSS 颜色值。默认由主题决定(通常为灰色)。

描述颜色

  • 类型: 文本型
  • 说明: 设置或获取描述文本的颜色,支持 CSS 颜色值。默认由主题决定(通常为灰色)。

函数详解

置图标元素(元素)

  • 功能: 使用自定义 DOM 元素替换默认的图标显示。适用于需要使用 SVG 图标、图片或其他复杂图形作为图标的情况。
  • 参数: 元素,原生 DOM 元素(如通过 创建元素("svg") 生成的 SVG 元素)。
  • 返回值: 无。
  • 示例:
    变量 svg = 创建元素("svg")
    svg.innerHTML = '<path d="..." />'  ' 设置 SVG 路径
    空状态面板1.置图标元素(svg)
    

置操作元素(元素)

  • 功能: 设置空状态面板底部的操作区域元素,通常为按钮或链接,用于引导用户进行下一步操作(如刷新、跳转、重试等)。
  • 参数: 元素,原生 DOM 元素(如按钮、链接或容器)。
  • 返回值: 无。
  • 示例:
    变量 按钮 = 创建元素("button")
    按钮.textContent = "重试"
    按钮.onclick = () => { 弹出提示("重试中...") }
    空状态面板1.置操作元素(按钮)
    

事件说明

空状态面板本身未定义特有事件,但继承自 视图 的所有事件均可使用(如 置被单击回调 可为整个面板绑定点击事件)。操作按钮的事件需在传入的 DOM 元素上自行绑定(如 onclick)。


⚠️ 注意事项

  1. 操作按钮需自行绑定事件:通过 置操作元素 传入的元素需自行绑定事件(如 onclick),组件不会自动处理。
  2. 图标与描述居中:组件默认将图标和描述居中显示,可通过继承的 内容水平对齐方式 调整。
  3. 自定义图标:使用 置图标元素 会覆盖 图标 属性设置的文本/emoji 图标。
  4. 边框与背景:组件本身无边框,但可通过继承的 边框背景颜色 等属性美化外观。
  5. 操作元素样式:传入的操作元素(如按钮)样式需自行设置,组件不会自动美化。
  6. 显示与隐藏:可通过 可视 属性控制整个空状态面板的显示与隐藏。
  7. 内容垂直居中:默认内容在面板内垂直居中,若需调整,可修改 内边距 或使用弹性布局包裹。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档其它通用类组件_卡片框 —— 常用于包裹空状态面板
  • 文档文本类组件_标签 —— 配合显示描述文本
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、DOM 操作等
  • 文档综合演示:购物车空状态 —— 实际应用示例

组件:返回顶部按钮

返回顶部按钮组件用于在页面滚动到一定距离后,自动显示一个悬浮按钮,点击后平滑滚动回到页面顶部。它支持自定义图标、大小、形状、颜色、位置偏移和显示阈值,并可指定滚动监听容器(默认为整个窗口)。适用于长内容页面、文档阅读、电商列表等需要快速返回顶部的场景。

典型使用场景:

  • 长文章/文档阅读(博客、帮助文档)
  • 商品列表/搜索结果页(无限滚动后快速返回顶部)
  • 单页应用的长页面(仪表盘、数据报表)
  • 移动端页面(方便拇指操作)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置按钮图标图标返回顶部按钮1.图标 = "⬆"
设置按钮大小大小返回顶部按钮1.大小 = 48
设置形状形状返回顶部按钮1.形状 = "square"
设置背景颜色背景颜色返回顶部按钮1.背景颜色 = "#52c41a"
设置水平偏移(距右)偏移X返回顶部按钮1.偏移X = 32
设置垂直偏移(距下)偏移Y返回顶部按钮1.偏移Y = 32
设置显示阈值(滚动距离)显示阈值返回顶部按钮1.显示阈值 = 600
指定滚动监听容器置滚动容器(容器元素)返回顶部按钮1.置滚动容器(面板1)
手动返回顶部返回顶部()返回顶部按钮1.返回顶部()
显示按钮(添加到页面)显示(父容器)返回顶部按钮1.显示()
销毁组件销毁()返回顶部按钮1.销毁()

样式美化参考

返回顶部按钮的外观可通过以下属性进行自定义:

  • 按钮形状与大小形状 支持 "circle"(圆形,默认)和 "square"(方形);大小 控制宽高(像素),建议不小于 40px 以保证可点击性。
  • 图标与颜色图标 支持文本字符(如 "↑""⬆")或 emoji;背景颜色 设置按钮底色,建议使用品牌色或高亮色。
  • 位置与偏移:按钮固定于右下角(偏移X偏移Y 控制距右和距下的距离),不可更改位置(固定为右下角)。
  • 悬停效果:可通过继承的 置鼠标被进入回调置鼠标被移出回调 动态改变背景色或缩放,增强交互反馈。
  • 过渡动画:组件默认带有淡入淡出过渡,可通过 CSS 类自定义。

CSS 美化示例(在项目 CSS 文件中定义):

.my-back-top {
    border-radius: 50%;
    box-shadow: 0 2px 8px rgba(0,0,0,0.2);
    transition: transform 0.3s;
}
.my-back-top:hover {
    transform: scale(1.1);
}

在代码中应用样式类:返回顶部按钮1.添加样式类("my-back-top")


基础示例

创建一个简单的返回顶部按钮,默认右下角显示,滚动超过 400px 后出现。

变量 返回顶部按钮1 = 创建 返回顶部按钮()
返回顶部按钮1.图标 = "↑"
返回顶部按钮1.大小 = 44
返回顶部按钮1.形状 = "circle"
返回顶部按钮1.背景颜色 = "#1890ff"
返回顶部按钮1.文本颜色 = "#ffffff"
返回顶部按钮1.显示阈值 = 400
返回顶部按钮1.偏移X = 24
返回顶部按钮1.偏移Y = 24

' 添加单击回调(可在此记录事件)
返回顶部按钮1.置被单击回调((源对象) => {
    调试输出("用户点击了返回顶部按钮")
})

' 显示按钮
返回顶部按钮1.显示()

综合示例:在滚动容器内使用

本示例创建一个具有固定高度的滚动容器(垂直滚动框),让返回顶部按钮监听该容器内部的滚动事件,而非整个页面。

' ========== 创建滚动容器 ==========
变量 滚动容器 = 创建 垂直滚动框()
滚动容器.左边 = 50
滚动容器.顶边 = 30
滚动容器.宽度 = 400
滚动容器.高度 = 300
滚动容器.边框 = "1px solid #e8e8e8"
滚动容器.边框圆角 = "8px"
滚动容器.背景颜色 = "#fafafa"
滚动容器.内边距 = "8px"
添加组件(滚动容器)

' 向滚动容器添加大量内容以产生滚动
变量循环(i = 1, 50, 1)
    变量 项 = 创建 标签()
    项.文本 = "第 " + i + " 行内容"
    项.内边距 = "8px"
    项.边框底边 = "1px solid #f0f0f0"
    滚动容器.添加组件(项)
结束循环

' ========== 创建返回顶部按钮(监听该容器) ==========
变量 返回顶部按钮1 = 创建 返回顶部按钮()
返回顶部按钮1.图标 = "⬆"
返回顶部按钮1.大小 = 40
返回顶部按钮1.形状 = "circle"
返回顶部按钮1.背景颜色 = "#1890ff"
返回顶部按钮1.文本颜色 = "#ffffff"
返回顶部按钮1.显示阈值 = 200  ' 容器内滚动 200px 后显示
返回顶部按钮1.偏移X = 16
返回顶部按钮1.偏移Y = 16

' 指定滚动容器(注意:需传入原生 DOM 元素)
变量 容器元素 = 滚动容器.取原生对象()
返回顶部按钮1.置滚动容器(容器元素)

' 显示按钮(父容器可以指定为滚动容器的父级,以便按钮覆盖在容器之上)
' 这里直接添加到页面,但按钮位置是相对于视口的,会影响显示。
' 更合理的做法是将按钮添加到滚动容器的父容器,并设置合适的定位。
' 但组件本身是固定定位,所以添加到 body 即可,它会覆盖在容器上方。
返回顶部按钮1.显示()

' 添加状态提示
变量 状态标签 = 创建 标签()
状态标签.左边 = 50
状态标签.顶边 = 350
状态标签.文本 = "滚动容器内容已加载,滚动查看按钮效果"
状态标签.字体大小 = "14px"
状态标签.文本颜色 = "#999"
添加组件(状态标签)

属性详解

图标

  • 类型: 文本型
  • 说明: 设置或获取按钮内显示的图标字符,支持普通文本(如 "↑")、emoji(如 "⬆")或 HTML 字符串。默认 "↑"

背景颜色

  • 类型: 文本型
  • 说明: 设置或获取按钮的背景颜色,支持 CSS 颜色值。默认 "#1890ff"

大小

  • 类型: 数值型
  • 说明: 设置或获取按钮的宽度和高度(像素),即按钮为正方形。默认 40。建议不小于 40px 以保证触控区域足够大。

形状

  • 类型: 文本型
  • 说明: 设置或获取按钮的形状,可选值:
    • "circle":圆形(边框圆角 50%),默认
    • "square":方形(可配合 边框圆角 实现圆角矩形)

偏移X

  • 类型: 数值型
  • 说明: 设置或获取按钮距离屏幕右侧边缘的偏移量(像素)。默认 24

偏移Y

  • 类型: 数值型
  • 说明: 设置或获取按钮距离屏幕底部边缘的偏移量(像素)。默认 24

显示阈值

  • 类型: 数值型
  • 说明: 设置或获取滚动容器(或窗口)垂直滚动距离达到多少像素时显示按钮。当滚动距离小于此值时,按钮自动隐藏。默认 400

函数详解

置滚动容器(容器元素)

  • 功能: 指定要监听滚动事件的目标容器(默认为 window)。当容器内滚动距离达到 显示阈值 时,按钮自动显示。
  • 参数: 容器元素,可以是原生 DOM 元素(如通过 取原生对象() 获取)或选择器字符串。
  • 返回值: 无。
  • 示例: 返回顶部按钮1.置滚动容器(滚动框.取原生对象())

返回顶部()

  • 功能: 手动触发平滑滚动到顶部(针对当前监听的滚动容器)。效果等同于点击按钮。
  • 返回值: 无。
  • 示例: 返回顶部按钮1.返回顶部()

显示(父容器)

  • 功能: 将按钮添加到页面并启用滚动监听。若不调用此方法,按钮不会显示。
  • 参数: 父容器(可选),可以是视图组件或原生 DOM 元素,默认为 body
  • 返回值: 无。
  • 示例: 返回顶部按钮1.显示(面板1) 将按钮添加到面板中(但按钮仍为固定定位,相对视口定位)。

销毁()

  • 功能: 销毁组件,从 DOM 中移除按钮元素,取消滚动监听,释放资源。调用后组件不可再用。
  • 返回值: 无。
  • 示例: 返回顶部按钮1.销毁()

事件说明

返回顶部按钮本身未定义特有事件,但继承自 视图 的所有事件均可使用,特别是 置被单击回调 是最常用的交互方式。


⚠️ 注意事项

  1. 固定定位:按钮使用 position: fixed,相对视口定位,即使页面滚动,按钮仍固定在屏幕右下角(除非指定了父容器但定位方式不变)。
  2. 父容器影响:调用 显示(父容器) 时,父容器应具有足够大的尺寸或为 body,否则按钮可能被裁剪或定位异常。通常建议默认添加到 body
  3. 滚动容器要求:若使用 置滚动容器 指定了自定义容器,该容器需具有固定高度且内容溢出可滚动,否则滚动事件无法正确触发。
  4. 显示阈值与滚动方向:阈值指垂直滚动的像素值,与滚动方向无关(向下滚动到一定距离后显示,向上滚回到阈值以上则隐藏)。
  5. 销毁与内存泄漏:在页面切换或组件不再需要时,应调用 销毁() 移除事件监听,避免内存泄漏。
  6. 与悬浮按钮的区别:返回顶部按钮专用于回到顶部,位置固定于右下角;悬浮按钮更通用,位置可四角选择,图标和功能更灵活。
  7. 样式覆盖:默认样式可能比较简单,可通过 CSS 类或内联样式自定义,注意保持可点击性。
  8. 平滑滚动:点击后使用 scrollTobehavior: 'smooth' 实现平滑滚动,所有现代浏览器均支持。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档其它通用类组件_悬浮按钮 —— 功能类似的固定定位按钮
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、事件处理等
  • 文档综合演示:长页面滚动导航 —— 实际应用示例

组件:通知提醒框

通知提醒框组件用于在页面角落显示临时通知消息,支持信息、成功、警告、错误四种类型,可自定义标题、内容、位置、显示时长等,并支持单击和关闭回调。适用于操作结果反馈、系统通知、状态提醒等场景。

典型使用场景:

  • 操作成功/失败反馈(保存成功、删除失败)
  • 系统通知(新消息、更新提醒)
  • 表单提交结果(注册成功、登录失败)
  • 后台管理操作反馈(数据导入结果、配置生效)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置通知标题标题通知提醒框1.标题 = "操作成功"
设置通知内容内容通知提醒框1.内容 = "数据已保存"
设置通知类型类型通知提醒框1.类型 = "success"
设置显示位置位置通知提醒框1.位置 = "bottomLeft"
设置自动关闭时长(秒)显示时长通知提醒框1.显示时长 = 3
显示通知显示(父容器)通知提醒框1.显示()
手动关闭通知关闭()通知提醒框1.关闭()
设置单击回调置通知被单击回调(回调函数)通知提醒框1.置通知被单击回调((源对象) => { ... })
设置关闭回调置通知被关闭回调(回调函数)通知提醒框1.置通知被关闭回调((源对象) => { ... })

样式美化参考

通知提醒框的外观可通过以下属性进行自定义:

  • 类型颜色:不同 类型 会赋予不同的颜色方案(如 success 为绿色,error 为红色),背景色和边框色由类型决定。
  • 标题与内容标题 以加粗显示,内容 为普通文本,可通过继承的 字体大小(建议 "14px")调整内容文字大小。
  • 位置位置 决定通知出现在屏幕的哪个角落,默认 "topRight"
  • 自动关闭显示时长 控制通知自动消失的时间(秒),设为 0 则不会自动关闭,需用户手动点击关闭或调用 关闭()
  • 圆角与阴影:可通过继承的 边框圆角(建议 "8px")和 内联样式 添加阴影效果。

CSS 美化示例(在项目 CSS 文件中定义):

.my-notification {
    border-radius: 8px;
    box-shadow: 0 4px 12px rgba(0,0,0,0.15);
    padding: 12px 20px;
    font-size: 14px;
}

在代码中应用样式类:通知提醒框1.添加样式类("my-notification")


基础示例

创建一个右上角的成功通知,4.5 秒后自动关闭。

变量 通知提醒框1 = 创建 通知提醒框()
通知提醒框1.标题 = "操作成功"
通知提醒框1.内容 = "您的数据已保存成功!"
通知提醒框1.类型 = "success"
通知提醒框1.位置 = "topRight"
通知提醒框1.显示时长 = 4.5

通知提醒框1.置通知被单击回调((源对象) => {
    弹出提示("通知被点击")
})

通知提醒框1.显示()

综合示例:表单提交反馈

本示例模拟一个表单提交操作,根据提交结果显示不同位置和类型的通知。

' ========== 创建表单 ==========
变量 表单容器 = 创建 绝对布局()
表单容器.左边 = 50
表单容器.顶边 = 50
表单容器.宽度 = 360
表单容器.背景颜色 = "#ffffff"
表单容器.边框 = "1px solid #e8e8e8"
表单容器.边框圆角 = "12px"
表单容器.内边距 = "24px"
添加组件(表单容器)

' 标题
变量 标题 = 创建 标签()
标题.文本 = "📝 提交反馈"
标题.字体大小 = "18px"
标题.字体粗细 = "bold"
标题.内边距 = "0 0 16px 0"
表单容器.添加组件(标题)

' 内容输入框
变量 内容标签 = 创建 标签()
内容标签.文本 = "反馈内容"
内容标签.字体大小 = "14px"
内容标签.文本颜色 = "#666"
内容标签.内边距 = "8px 0 4px"
表单容器.添加组件(内容标签)

变量 内容输入 = 创建 编辑框()
内容输入.宽度 = 312
内容输入.高度 = 100
内容输入.提示文本 = "请输入您的反馈"
内容输入.边框 = "1px solid #d9d9d9"
内容输入.边框圆角 = "6px"
内容输入.内边距 = "8px 12px"
内容输入.字体大小 = "14px"
表单容器.添加组件(内容输入)

' 提交按钮
变量 提交按钮 = 创建 按钮()
提交按钮.文本 = "提交反馈"
提交按钮.宽度 = 312
提交按钮.高度 = 44
提交按钮.背景颜色 = "#1890ff"
提交按钮.文本颜色 = "#ffffff"
提交按钮.边框圆角 = "6px"
提交按钮.字体大小 = "16px"
表单容器.添加组件(提交按钮)

' ========== 提交逻辑 ==========
提交按钮.置被单击回调((源对象) => {
    变量 内容 = 删首尾空(内容输入.内容)
    如果(内容 == "")
        ' 显示警告通知(左下角)
        变量 通知 = 创建 通知提醒框()
        通知.标题 = "提示"
        通知.内容 = "请填写反馈内容"
        通知.类型 = "warning"
        通知.位置 = "bottomLeft"
        通知.显示时长 = 3
        通知.显示()
        返回
    结束 如果
    
    ' 模拟提交过程(禁用按钮)
    提交按钮.禁用 = 真
    提交按钮.文本 = "提交中..."
    
    延时执行(() => {
        提交按钮.禁用 = 假
        提交按钮.文本 = "提交反馈"
        
        ' 模拟提交成功或失败(随机)
        变量 是否成功 = 取随机整数(0, 1) == 1
        如果(是否成功)
            ' 成功通知(右上角)
            变量 成功通知 = 创建 通知提醒框()
            成功通知.标题 = "提交成功"
            成功通知.内容 = "您的反馈已收到,感谢您的支持!"
            成功通知.类型 = "success"
            成功通知.位置 = "topRight"
            成功通知.显示时长 = 5
            成功通知.置通知被单击回调((源对象) => {
                弹出提示("查看详情")
            })
            成功通知.显示()
            内容输入.内容 = ""  ' 清空
        否则
            ' 错误通知(右下角)
            变量 失败通知 = 创建 通知提醒框()
            失败通知.标题 = "提交失败"
            失败通知.内容 = "网络异常,请稍后重试"
            失败通知.类型 = "error"
            失败通知.位置 = "bottomRight"
            失败通知.显示时长 = 4
            失败通知.显示()
        结束 如果
    }, 1500)
})

属性详解

标题

  • 类型: 文本型
  • 说明: 设置或获取通知的标题文本,以加粗形式显示在内容上方。若设置为空字符串 "",则标题区域隐藏,只显示内容。

内容

  • 类型: 文本型
  • 说明: 设置或获取通知的主体内容文本,为普通文本(不支持 HTML)。

类型

  • 类型: 文本型
  • 说明: 设置或获取通知的类型,决定通知的样式(颜色、图标等)。可选值:
    • "info"(默认):信息类(蓝色)
    • "success":成功类(绿色)
    • "warning":警告类(橙色)
    • "error":错误类(红色)

显示时长

  • 类型: 数值型
  • 说明: 设置或获取通知在自动关闭前停留的秒数。设为 0 表示不自动关闭,需用户手动关闭或调用 关闭()。默认 4.5

位置

  • 类型: 文本型
  • 说明: 设置或获取通知在屏幕中显示的位置。可选值:
    • "topRight"(默认):右上角
    • "topLeft":左上角
    • "bottomRight":右下角
    • "bottomLeft":左下角

函数详解

显示(父容器)

  • 功能: 将通知添加到页面并显示(触发展开动画)。每次调用都会创建一个新的通知实例(多个通知可同时显示)。
  • 参数: 父容器(可选),可以是视图组件或原生 DOM 元素,默认为 body。通常无需指定。
  • 返回值: 无。
  • 示例: 通知提醒框1.显示()

关闭()

  • 功能: 手动关闭当前通知(触发展开动画反向),并从 DOM 中移除。如果通知已自动关闭或未显示,调用无效果。
  • 返回值: 无。
  • 示例: 通知提醒框1.关闭()

置通知被单击回调(回调函数)

  • 功能: 设置通知被单击时的回调函数。无论点击通知的哪个区域(标题或内容),都会触发。
  • 参数: 回调函数,格式为 (源对象) => { ... }源对象 为当前通知组件实例。
  • 返回值: 无。
  • 示例:
    通知提醒框1.置通知被单击回调((源对象) => {
        弹出提示("点击了通知")
    })
    

置通知被关闭回调(回调函数)

  • 功能: 设置通知被关闭时的回调函数。无论是自动关闭还是手动调用 关闭(),都会触发。
  • 参数: 回调函数,格式为 (源对象) => { ... }
  • 返回值: 无。
  • 示例:
    通知提醒框1.置通知被关闭回调((源对象) => {
        调试输出("通知已关闭")
    })
    

事件说明

通知被单击(源对象)

  • 功能:置通知被单击回调 等效,适用于设计文件(.spldg)中定义的组件。
  • 示例:
    事件 通知提醒框1.通知被单击(源对象)
        调试输出("通知被单击")
    结束 事件
    

通知被关闭(源对象)

  • 功能:置通知被关闭回调 等效,适用于设计文件。
  • 示例:
    事件 通知提醒框1.通知被关闭(源对象)
        调试输出("通知已关闭")
    结束 事件
    

⚠️ 注意事项

  1. 每次显示创建新实例:每次调用 显示() 都会创建一个新的通知实例,可同时显示多个通知。如需复用,建议每次新建通知对象。
  2. 自动关闭计时显示时长 从通知显示时开始计时,鼠标悬停在通知上会暂停计时(默认行为),移出后继续。
  3. 关闭回调触发:自动关闭和手动 关闭() 都会触发 置通知被关闭回调
  4. 单击回调与关闭:单击通知会触发 置通知被单击回调,但不会自动关闭(除非手动在回调中调用 关闭())。
  5. 类型与图标:不同类型的通知会自动显示对应的图标(如成功为 ✓,错误为 ✕),无需额外设置。
  6. 位置堆叠:多个通知在同一位置显示时会纵向堆叠,后出现的在上方(或根据位置不同而不同)。
  7. 父容器:默认添加到 body,若指定其他父容器,通知将相对于该容器定位(但建议使用默认,确保覆盖全屏)。
  8. 销毁:通知在关闭后会自动从 DOM 中移除,无需手动销毁。但若想提前移除可调用 关闭()
  9. 样式定制:通知的样式(背景、边框、字体等)可通过 CSS 类或继承属性覆盖,但注意 类型 会覆盖背景色,需确保自定义样式优先级更高。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档其它通用类组件_气泡提示框 —— 类似提示组件
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、条件判断等
  • 文档综合演示:表单提交反馈 —— 实际应用示例

组件:颜色选择器

颜色选择器组件用于让用户从预定义或自定义的颜色面板中选择颜色,支持设置和获取颜色值(十六进制格式),并可获取 RGB 分量。它基于 HTML <input type="color"> 元素封装,适用于主题设置、样式配置、图表颜色选择等需要颜色选取的场景。

典型使用场景:

  • 主题颜色自定义(网站主题色、品牌色设置)
  • 图表/报表颜色配置(折线图、柱状图颜色)
  • 文本/背景颜色设置(富文本编辑器、设计工具)
  • 表单中的颜色字段(产品颜色、标签颜色)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置颜色值置颜色(颜色值)颜色选择器1.置颜色("#ff4d4f")
获取当前颜色值(#RRGGBB)取颜色()变量 颜色 = 颜色选择器1.取颜色()
获取 RGB 数组取RGB()变量 rgb = 颜色选择器1.取RGB()
禁用/启用组件禁用颜色选择器1.禁用 = 真
设置颜色选择完成回调置颜色选择完毕回调(回调函数)颜色选择器1.置颜色选择完毕回调((源对象, 颜色值) => { ... })

样式美化参考

颜色选择器的外观可通过继承的视图属性进行调整:

  • 整体容器:通过 宽度高度边框(如 "1px solid #d9d9d9")、边框圆角(建议 "6px")等属性美化。颜色选择器默认显示为一个小方形色块,点击后弹出系统颜色选择面板。
  • 色块样式:色块本身显示当前选中的颜色,其大小和形状由 宽度高度 控制,建议设置为正方形(如 宽度 = 36高度 = 36)。
  • 禁用状态禁用 = 真 时,色块变灰且不可点击。

CSS 美化示例(在项目 CSS 文件中定义):

.my-color-picker {
    border: 1px solid #d9d9d9;
    border-radius: 4px;
    cursor: pointer;
    transition: border-color 0.3s;
}
.my-color-picker:hover {
    border-color: #1890ff;
}
.my-color-picker:disabled {
    opacity: 0.6;
    cursor: not-allowed;
}

在代码中应用样式类:颜色选择器1.添加样式类("my-color-picker")


基础示例

创建一个颜色选择器,初始颜色为蓝色(#1890ff),选择后输出颜色值。

变量 颜色选择器1 = 创建 颜色选择器()
颜色选择器1.左边 = 50
颜色选择器1.顶边 = 50
颜色选择器1.宽度 = 44
颜色选择器1.高度 = 44
颜色选择器1.边框 = "1px solid #d9d9d9"
颜色选择器1.边框圆角 = "6px"
颜色选择器1.置颜色("#1890ff")

颜色选择器1.置颜色选择完毕回调((源对象, 颜色值) => {
    弹出提示("选择的颜色:" + 颜色值)
})

添加组件(颜色选择器1)

综合示例:主题颜色自定义面板

本示例构建一个主题颜色配置面板,包含颜色选择器、预览区域和颜色值显示,支持多个颜色属性的设置。

' ========== 创建配置面板 ==========
变量 面板 = 创建 绝对布局()
面板.左边 = 30
面板.顶边 = 30
面板.宽度 = 400
面板.高度 = 300
面板.背景颜色 = "#ffffff"
面板.边框 = "1px solid #e8e8e8"
面板.边框圆角 = "12px"
面板.内边距 = "20px"
添加组件(面板)

' 标题
变量 标题 = 创建 标签()
标题.文本 = "🎨 主题颜色设置"
标题.字体大小 = "18px"
标题.字体粗细 = "bold"
标题.内边距 = "0 0 16px 0"
面板.添加组件(标题)

' 主色设置
变量 主色标签 = 创建 标签()
主色标签.文本 = "主色"
主色标签.字体大小 = "14px"
主色标签.文本颜色 = "#666"
主色标签.内边距 = "8px 0 4px"
面板.添加组件(主色标签)

变量 主色选择器 = 创建 颜色选择器()
主色选择器.宽度 = 40
主色选择器.高度 = 40
主色选择器.边框 = "1px solid #d9d9d9"
主色选择器.边框圆角 = "6px"
主色选择器.置颜色("#1890ff")
面板.添加组件(主色选择器)

' 主色值显示
变量 主色值标签 = 创建 标签()
主色值标签.文本 = "#1890ff"
主色值标签.字体大小 = "14px"
主色值标签.文本颜色 = "#333"
主色值标签.内边距 = "8px 0 0"
主色值标签.左边 = 60
主色值标签.顶边 = 58  ' 需要根据实际布局调整,此处简化
面板.添加组件(主色值标签)

' 背景色设置
变量 背景标签 = 创建 标签()
背景标签.文本 = "背景色"
背景标签.字体大小 = "14px"
背景标签.文本颜色 = "#666"
背景标签.内边距 = "12px 0 4px"
面板.添加组件(背景标签)

变量 背景选择器 = 创建 颜色选择器()
背景选择器.宽度 = 40
背景选择器.高度 = 40
背景选择器.边框 = "1px solid #d9d9d9"
背景选择器.边框圆角 = "6px"
背景选择器.置颜色("#f0f0f0")
面板.添加组件(背景选择器)

' 背景色值显示
变量 背景值标签 = 创建 标签()
背景值标签.文本 = "#f0f0f0"
背景值标签.字体大小 = "14px"
背景值标签.文本颜色 = "#333"
背景值标签.内边距 = "8px 0 0"
面板.添加组件(背景值标签)

' 预览区域(演示颜色变化)
变量 预览容器 = 创建 弹性布局()
预览容器.方向 = "row"
预览容器.侧轴对齐 = "center"
预览容器.主轴对齐 = "center"
预览容器.宽度 = 360
预览容器.高度 = 60
预览容器.边框 = "1px solid #e8e8e8"
预览容器.边框圆角 = "6px"
预览容器.内边距 = "12px"
预览容器.背景颜色 = "#f0f0f0"
预览容器.左边 = 0
预览容器.顶边 = 200
面板.添加组件(预览容器)

变量 预览文本 = 创建 标签()
预览文本.文本 = "预览文字"
预览文本.字体大小 = "18px"
预览文本.字体粗细 = "bold"
预览文本.文本颜色 = "#1890ff"
预览容器.添加组件(预览文本)

' ========== 绑定回调事件 ==========
主色选择器.置颜色选择完毕回调((源对象, 颜色值) => {
    主色值标签.文本 = 颜色值
    预览文本.文本颜色 = 颜色值
})

背景选择器.置颜色选择完毕回调((源对象, 颜色值) => {
    背景值标签.文本 = 颜色值
    预览容器.背景颜色 = 颜色值
})

属性详解

颜色

  • 类型: 文本型
  • 说明: 设置或获取当前选中的颜色值,格式为 #RRGGBB(十六进制大写,如 #FF0000)。设置后,色块会同步更新。

禁用

  • 类型: 逻辑型
  • 说明: 设置或获取是否禁用颜色选择器。禁用后,色块不可点击,样式变灰。默认为

函数详解

置颜色(颜色值)

  • 功能: 设置当前颜色值,并更新色块显示。
  • 参数: 颜色值(文本型),格式必须为 #RRGGBB(以 # 开头,后跟6位十六进制字符)。
  • 返回值: 无。
  • 示例: 颜色选择器1.置颜色("#ff4d4f")

取颜色()

  • 功能: 获取当前选中的颜色值。
  • 返回值: 文本型,格式为 #RRGGBB(大写十六进制)。
  • 示例: 变量 当前颜色 = 颜色选择器1.取颜色()

取RGB()

  • 功能: 获取当前颜色的 RGB 分量数组。
  • 返回值: 数组,格式为 [R, G, B],每个分量范围为 0~255。
  • 示例:
    变量 rgb = 颜色选择器1.取RGB()
    调试输出("红色分量:" + rgb[0])
    调试输出("绿色分量:" + rgb[1])
    调试输出("蓝色分量:" + rgb[2])
    

置颜色选择完毕回调(回调函数)

  • 功能: 设置当用户完成颜色选择(点击确定或关闭颜色面板)时的回调函数。
  • 参数: 回调函数,格式为 (源对象, 颜色值) => { ... }
    • 源对象:颜色选择器组件本身。
    • 颜色值:用户选择的颜色(#RRGGBB 格式)。
  • 返回值: 无。
  • 示例:
    颜色选择器1.置颜色选择完毕回调((源对象, 颜色值) => {
        调试输出("新颜色:" + 颜色值)
    })
    

事件说明

颜色选择完毕(源对象, 颜色值)

  • 功能:置颜色选择完毕回调 等效,适用于设计文件(.spldg)中定义的组件。
  • 示例:
    事件 颜色选择器1.颜色选择完毕(源对象, 颜色值)
        调试输出("选择的颜色:" + 颜色值)
    结束 事件
    

⚠️ 注意事项

  1. 颜色格式:所有颜色值必须为 #RRGGBB 格式(6位十六进制),不支持 #RGB 简写或 rgb() 函数。设置非标准格式可能导致显示异常。
  2. 取RGB返回值取RGB() 返回的数组元素为数值型,可直接用于计算。
  3. 回调触发时机置颜色选择完毕回调 仅在用户通过颜色面板确认选择时触发。若通过代码 置颜色 修改,不会触发回调。
  4. 禁用状态禁用 = 真 时,色块不可点击,但通过代码 置颜色 仍可修改值(但视觉上可能不更新?实际上禁用后设置颜色仍然会更新显示,只是不可交互)。
  5. 默认颜色:若未设置初始颜色,浏览器默认为 #000000(黑色)。
  6. 系统颜色面板:颜色选择器调用的是浏览器原生的颜色选择面板,不同操作系统和浏览器界面可能不同,但功能一致。
  7. 样式定制:色块本身是 <input type="color">,其样式受浏览器限制,部分样式(如背景色)可能无法完全自定义,但可通过外层容器美化。
  8. 取值大小写取颜色() 返回的是大写十六进制(如 #FF0000),与输入时的大小写无关。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档其它通用类组件_数字输入框 —— 类似数值输入组件
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、数组操作等
  • 文档综合演示:主题颜色配置 —— 实际应用示例

组件:骨架屏

骨架屏组件用于在内容加载完成前展示占位图形,模拟页面或列表的布局结构,让用户感知到内容正在加载,从而提升用户体验。它支持头像、标题、多行段落等占位元素,并可启用动画效果。适用于数据加载、列表渲染、详情页展示等场景。

典型使用场景:

  • 列表数据加载(商品列表、文章列表)
  • 详情页内容加载(商品详情、文章详情)
  • 卡片加载(用户信息卡、数据统计卡)
  • 页面初始渲染(首页、个人中心)

📌 继承自视图的成员速查

本组件继承自 视图 类,可直接使用以下属性和方法:

属性: ID、左边、顶边、右边、底边、宽度、高度、背景、背景颜色、背景图像、文本、文本颜色、字体、字体大小、字体粗细、行高、边框、边框圆角、边框宽度、光标样式、显示模式、透明度、外边距、外边距底、外边距左、外边距右、外边距顶、最大高度、最大宽度、最小高度、最小宽度、内边距、内边距底、内边距左、内边距右、内边距顶、定位、CLASS、InnerHTML、OuterHTML、内容水平对齐方式、首行缩进、可视、显示层级、内联样式、禁用

方法: 追加内联样式(样式文本)、置内联样式(名称,值)、取内联样式值(名称)、取Style对象()、添加事件(事件名称, 回调函数)、删除事件(事件名称, 回调函数)、获取焦点()、清除焦点()、添加样式类(类名称)、移除样式类(类名称)、取样式类列表()、取样式类()、执行单击()、取属性值(属性名)、取属性节点(属性名)、取布局参数()、取渲染宽度()、取渲染高度()、取渲染顶边()、取渲染左边()、左侧对齐到(目标组件,偏移量)、右侧对齐到(目标组件,偏移量)、顶边对齐到(目标组件,偏移量)、底边对齐到(目标组件,偏移量)、右侧对齐到左(目标组件, 偏移量)、左侧对齐到右(目标组件, 偏移量)、底边对齐到顶(目标组件, 偏移量)、顶边对齐到底(目标组件, 偏移量)、有指定属性(属性名)、有属性()、内容可编辑()、包含CSS类(类名)、取命名空间()、取下个节点()、取下个元素()、取节点名称()、取节点类型()、取父节点()、取父元素()、取上个节点()、取上个元素()、销毁()、删除属性(属性名)、删除属性节点(属性名)、置属性值(属性名, 属性值)、置属性节点(属性节点)、取标签名()、移动(左边 顶边, 宽度, 高度)、取原生对象()、置被单击回调(回调函数)、置被双击回调(回调函数)、置鼠标被进入回调(回调函数)、置鼠标被移出回调(回调函数)、置鼠标被移动回调(回调函数)、置鼠标被按下回调(回调函数)、置鼠标被抬起回调(回调函数)、置鼠标滚轮被滚动回调(回调函数)、置键盘被按下回调(回调函数)、置按键被抬起回调(回调函数)、置按键被压下回调(回调函数)、置被失去焦点回调(回调函数)、置被获得焦点回调(回调函数)

事件: 被单击(源对象,事件源)、被双击(源对象,事件源)、鼠标被进入(源对象,事件源)、鼠标被移出(源对象,事件源)、鼠标被移动(源对象,事件源)、鼠标被按下(源对象,事件源)、鼠标被抬起(源对象,事件源)、鼠标滚轮被滚动(源对象,事件源)、键盘被按下(源对象,事件源)、按键被抬起(源对象,事件源)、按键被压下(源对象,事件源)、被失去焦点(源对象,事件源)、被获得焦点(源对象,事件源)

💡 完整成员列表及详细说明请参考:视图


常用操作速查

操作属性/方法示例
设置段落行数行数骨架屏1.行数 = 4
显示/隐藏头像占位头像骨架屏1.头像 = 真
设置头像形状头像形状骨架屏1.头像形状 = "square"
显示/隐藏标题占位标题骨架屏1.标题 = 真
设置标题宽度标题宽度骨架屏1.标题宽度 = "50%"
设置最后一行段落宽度段落宽度骨架屏1.段落宽度 = "40%"
启用/禁用加载动画动画骨架屏1.动画 = 真
控制显示/隐藏加载中骨架屏1.加载中 = 假

样式美化参考

骨架屏的外观主要通过继承的视图属性进行调整:

  • 整体容器:通过 宽度高度背景颜色边框(如 "1px solid #e8e8e8")、边框圆角(建议 "8px")等属性美化。
  • 占位块颜色:默认占位块为浅灰色(#f0f0f0),可通过 CSS 类自定义。建议使用浅色背景以模拟真实内容。
  • 内边距:通过 内边距(如 "16px")控制占位内容与边界的距离。
  • 动画动画 = 真 时,占位块会呈现渐变的流动效果(闪烁),模拟加载中的动态感。

CSS 美化示例(在项目 CSS 文件中定义):

.my-skeleton {
    background-color: #ffffff;
    border-radius: 8px;
    padding: 16px;
}
.my-skeleton .skeleton-block {
    background-color: #e8e8e8;
    border-radius: 4px;
}

在代码中应用样式类:骨架屏1.添加样式类("my-skeleton")


基础示例

创建一个包含头像、标题和 3 行段落的骨架屏,并启用动画。

变量 骨架屏1 = 创建 骨架屏()
骨架屏1.左边 = 50
骨架屏1.顶边 = 50
骨架屏1.宽度 = 400
骨架屏1.高度 = 200
骨架屏1.背景颜色 = "#ffffff"
骨架屏1.边框 = "1px solid #e8e8e8"
骨架屏1.边框圆角 = "8px"
骨架屏1.内边距 = "16px"
骨架屏1.头像 = 真
骨架屏1.头像形状 = "circle"
骨架屏1.标题 = 真
骨架屏1.标题宽度 = "40%"
骨架屏1.行数 = 3
骨架屏1.段落宽度 = "60%"
骨架屏1.动画 = 真

添加组件(骨架屏1)

综合示例:模拟数据加载

本示例模拟一个用户列表的加载过程,先显示骨架屏,2 秒后加载真实数据并替换。

' ========== 创建容器 ==========
变量 容器 = 创建 绝对布局()
容器.左边 = 30
容器.顶边 = 30
容器.宽度 = 400
容器.高度 = 300
容器.边框 = "1px solid #e8e8e8"
容器.边框圆角 = "12px"
容器.背景颜色 = "#ffffff"
容器.内边距 = "16px"
添加组件(容器)

' 标题
变量 标题标签 = 创建 标签()
标题标签.文本 = "👥 用户列表"
标题标签.字体大小 = "18px"
标题标签.字体粗细 = "bold"
标题标签.内边距 = "0 0 12px 0"
容器.添加组件(标题标签)

' ========== 骨架屏 ==========
变量 骨架 = 创建 骨架屏()
骨架.左边 = 0
骨架.顶边 = 44
骨架.宽度 = 368
骨架.高度 = 220
骨架.背景颜色 = "transparent"
骨架.头像 = 真
骨架.头像形状 = "circle"
骨架.标题 = 真
骨架.标题宽度 = "30%"
骨架.行数 = 4
骨架.段落宽度 = "80%"
骨架.动画 = 真
骨架.加载中 = 真
容器.添加组件(骨架)

' ========== 真实内容(初始隐藏) ==========
变量 内容容器 = 创建 弹性布局()
内容容器.方向 = "column"
内容容器.左边 = 0
内容容器.顶边 = 44
内容容器.宽度 = 368
内容容器.间距 = 8
内容容器.可视 = "hidden"  ' 初始隐藏
容器.添加组件(内容容器)

' 模拟数据
变量 用户数据 = [
    {name: "张三", email: "zhangsan@example.com"},
    {name: "李四", email: "lisi@example.com"},
    {name: "王五", email: "wangwu@example.com"}
]

变量循环(i = 0, 取数组成员数(用户数据), 1)
    变量 用户 = 用户数据[i]
    变量 行 = 创建 弹性布局()
    行.方向 = "row"
    行.侧轴对齐 = "center"
    行.内边距 = "8px"
    行.边框底边 = "1px solid #f0f0f0"
    
    变量 头像占位 = 创建 弹性布局()
    头像占位.方向 = "row"
    头像占位.侧轴对齐 = "center"
    头像占位.主轴对齐 = "center"
    头像占位.宽度 = 32
    头像占位.高度 = 32
    头像占位.边框圆角 = "16px"
    头像占位.背景颜色 = "#1890ff"
    头像占位.文本颜色 = "#ffffff"
    头像占位.字体大小 = "14px"
    头像占位.文本 = 用户.name[0]  ' 取首字母
    行.添加组件(头像占位)
    
    变量 信息 = 创建 弹性布局()
    信息.方向 = "column"
    信息.内边距 = "0 0 0 12px"
    
    变量 姓名 = 创建 标签()
    姓名.文本 = 用户.name
    姓名.字体大小 = "14px"
    姓名.字体粗细 = "bold"
    信息.添加组件(姓名)
    
    变量 邮箱 = 创建 标签()
    邮箱.文本 = 用户.email
    邮箱.字体大小 = "12px"
    邮箱.文本颜色 = "#999"
    信息.添加组件(邮箱)
    
    行.添加组件(信息)
    内容容器.添加组件(行)
结束循环

' ========== 模拟加载 ==========
延时执行(() => {
    ' 隐藏骨架,显示真实内容
    骨架.加载中 = 假
    内容容器.可视 = "visible"
    弹出提示("数据加载完成")
}, 2000)

属性详解

行数

  • 类型: 数值型
  • 说明: 设置或获取段落占位的行数,每行模拟一段文本。默认 3

头像

  • 类型: 逻辑型
  • 说明: 设置或获取是否显示头像占位(圆形或方形色块)。默认为

标题

  • 类型: 逻辑型
  • 说明: 设置或获取是否显示标题占位(较宽的色块)。默认为

标题宽度

  • 类型: 文本型
  • 说明: 设置或获取标题占位色块的宽度,支持百分比(如 "40%")或像素值(如 "120px")。默认 "40%"

段落宽度

  • 类型: 文本型
  • 说明: 设置或获取最后一行段落占位的宽度,用于模拟不同长度的文本行。支持百分比或像素值。默认 "60%"

头像形状

  • 类型: 文本型
  • 说明: 设置或获取头像占位的形状。可选值:
    • "circle"(默认):圆形
    • "square":方形(可配合 边框圆角 实现圆角矩形)

加载中

  • 类型: 逻辑型
  • 说明: 设置或获取骨架屏是否处于加载状态。当为 时,骨架屏隐藏(通常用于加载完成后切换显示)。默认为

动画

  • 类型: 逻辑型
  • 说明: 设置或获取是否启用渐变动画(占位块会呈现流动闪烁效果)。默认为

事件说明

骨架屏组件本身未定义特有事件,但继承自 视图 的所有事件均可使用。通常骨架屏只用于展示,无需交互。


⚠️ 注意事项

  1. 加载状态控制:通过 加载中 属性控制骨架屏显示/隐藏,加载完成后设为 并显示真实内容。
  2. 与真实内容的切换:建议将骨架屏与真实内容放在同一容器中,通过 加载中可视 属性控制显隐,避免布局抖动。
  3. 标题与头像布局:当 头像 = 真标题 = 真 时,头像在左,标题在右,模拟列表项布局。
  4. 段落行数行数 控制段落数量,最后一行宽度由 段落宽度 控制,其他行宽度为 100%。
  5. 动画性能动画 = 真 时会持续触发重绘,对性能有轻微影响。若页面中有多个骨架屏,建议仅在必要时启用。
  6. 内边距与背景:建议设置 内边距 让占位内容与边框保持距离,设置 背景颜色 让骨架屏更清晰。
  7. 隐藏骨架屏:设置 加载中 = 假 会隐藏骨架屏,但组件仍在 DOM 中,可重复使用(重新设置 加载中 = 真 可再次显示)。
  8. 自定义样式:占位块的颜色、圆角等可通过 CSS 类自定义,但需了解组件内部的类名结构。

相关文档

  • 文档框架基础类_视图 —— 视图类提供的所有通用属性和方法
  • 文档列表类组件_列表框 —— 常配合骨架屏展示列表数据
  • 文档轻语言网站:轻语言语法速查 —— 拉姆达表达式、延时执行等
  • 文档综合演示:数据加载骨架屏 —— 实际应用示例

综合演示:MySQL数据库操作

文档概述

本演示文档展示了如何使用轻语言开发一个完整的 Web 应用,包含以下核心功能:

  • 用户注册:前端提交账号密码 → 后端 API 接收 → 存入 MySQL
  • 用户登录:前端提交凭证 → 后端验证 → 返回登录状态(Session)
  • 管理端:查询、模糊查询、修改、删除用户数据
  • 安全性:使用 PDO 参数化查询防止 SQL 注入

涉及组件

  • 标签、按钮、单行输入框、表格、弹性布局、对话框
  • 请求接口、MySQL连接、MySQL查询、MySQL执行、会话凭证

部署要求

  • PHP 环境(本地推荐 PhpStudy)
  • MySQL 数据库(需提前创建 test 数据库和 mytable 表)

数据库建表语句

-- 建表语句
CREATE TABLE `mytable` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `pass` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

接口请求地址

前端通过 请求接口 函数调用后端 API,实际 HTTP 请求格式为:

http://你的域名/User.php?a=注册账号
http://你的域名/Admin.php?a=查询所有用户

💡 参数 a 指定要调用的后端函数名。

网站访问地址

  • 用户端

    • http://域名.com/

    • http://localhost:1996/index.html

    • 子级目录:http://localhost/mywebsite/

  • 管理端

    • http://域名.com/index.html?admin

    • http://localhost:1996/index.html?admin

    • 子级目录:http://localhost/mywebsite/index.html?admin

MySQL相关操作函数

本演示文档使用的 MySQL 操作函数(如 MySQL连接MySQL查询MySQL执行 等)的详细说明和参数列表,请参考专门的文档:服务端(PHP)函数_MYSQL操作.md

以下为完整项目代码:

用户端

用户注册登录页面.spldg

<?xml version="1.0" encoding="utf-8"?>
<页面 标题="用户注册登录" 宽度="440" 高度="270">
  <绝对布局 名称="根布局">
    <标签 名称="标签1" 左边="12" 顶边="12" 高度="40" 宽度="498" 文本="注册/登录账号" 字体大小="24px" />
    <按钮 名称="按钮1" 左边="12" 宽度="128" 顶边="150" 高度="40" 文本="注册账号" 文本颜色="#ff0089" />
    <单行输入框 名称="单行输入框1" 左边="12" 顶边="58" 高度="40" 宽度="288" 提示文本="请输入账号" />
    <单行输入框 名称="单行输入框2" 宽度="288" 高度="40" 左边="12" 顶边="104" 提示文本="请输入密码" />
    <按钮 名称="按钮2" 宽度="128" 高度="40" 左边="172" 顶边="150" 文本="登录账号" />
    <标签 名称="标签2" 左边="14" 顶边="204" 高度="25" 宽度="166" 文本="登录状态?" 背景颜色="#BFE8FB" />
    <标签 名称="标签3" 宽度="99" 高度="25" 左边="201" 顶边="204" 文本="退出" 文本颜色="#FF0000" 光标样式="pointer" 背景颜色="#BFE8FB" />
  </绝对布局>
</页面>

用户注册登录页面.spl

' ****************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 文件描述:
' 修改日志:
' ****************************************************************************

' 页面变量,整个页面都能使用
变量 页面变量 = "新页面"

事件 页面加载完毕()
    ' 设置输入框2的类型为:输入密码模式
    单行输入框2.类型 = "password"
    ' 检测登录状态
    刷新登录状态()
结束 事件

事件 按钮1.被单击(源对象,事件源)
    如果(单行输入框1.内容 == "" 或 单行输入框2.内容 == "")
        信息框("账号与密码不能为空!")
        返回
    结束 如果
    变量 待提交数据 = "username=" + 单行输入框1.内容 + "&password=" + 单行输入框2.内容
    ' 调试输出("待提交数据:" + 待提交数据)
    请求接口("User","注册账号",(请求结果,标记)=>{
        ' 这里返回的请求结果为后端我们的接口函数返回的内容
        调试输出(请求结果)
        如果(请求结果 == "")
            信息框("请求失败!")
            返回
        结束 如果
        ' 由于我们后端返回的为 JSON 字符串,这里我们将其转换为 JSON 对象
        变量 jsonObj = JSON解析(请求结果)
        信息框("返回结果:" + jsonObj.msg + ",状态码:" + jsonObj.code)
    },待提交数据)
    '* ==============================================================================
    '* 部分朋友可能会有个疑问:
    '* 为什么这里不能像安卓那样使用直链操作数据库?
    '* 答:
    '*    如果使用直链数据库操作,网页右键查看源代码、您的数据库账号密码就全部暴露了,
    '*    这种方式无异于是告诉任何人您的数据库账号密码,因此任何人都能连接操作。
    '*    使用后端接口操作数据库就可以避免这个问题,因为后端接口代码是运行在服务器上面的
    '*    右键查看网页源码,无法查看到后端代码,因此采用这种方式是比较安全的。
    '* ==============================================================================
结束 事件

事件 按钮2.被单击(源对象,事件源)
    如果(单行输入框1.内容 == "" 或 单行输入框2.内容 == "")
        信息框("账号与密码不能为空!")
        返回
    结束 如果
    变量 待提交数据 = "username=" + 单行输入框1.内容 + "&password=" + 单行输入框2.内容
    请求接口("User","登录账号",(请求结果,标记)=>{
        调试输出(请求结果)
        如果(请求结果 == "")
            信息框("请求失败!")
            返回
        结束 如果
        变量 jsonObj = JSON解析(请求结果)
        如果(jsonObj.code == 100)
            弹出提示("账号登录成功")
            刷新登录状态()
        否则
            弹出提示(jsonObj.msg)
        结束 如果
    },待提交数据)
结束 事件

函数 刷新登录状态()
    请求接口("User","取登录状态",(请求结果,标记)=>{
        如果(请求结果 == "")
            返回
        结束 如果
        调试输出(请求结果)
        变量 jsonObj = JSON解析(请求结果)
        如果(jsonObj.code == 100)
            标签2.文本 = "欢迎回来:" + jsonObj.msg
        否则
            标签2.文本 = jsonObj.msg
        结束 如果
    })
结束 函数

事件 标签3.被单击(源对象,事件源)
    请求接口("User","退出登录",(请求结果,标记)=>{
        刷新登录状态()
    })
结束 事件

用户注册登录页面对应的服务器脚本程序文件:User.sph

' ****************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 程序作者:
' 联系信息:
' 文件描述:API 接口文件、运行在服务器中;服务器需安装PHP环境、可用于
'      在服务器端操作数据库、接收前端APP、软件、网站或小程序提交
'      的请求;编译时将输出为标准PHP脚本文件。
'      本文件在前端访问时的地址:
'      http://你的域名/Api.php?a=待调用函数名称
' 注意事项:
'      1、API 文件中的函数都为全局函数;多个API文件中不能存在相同名称的函数,建议命名为:API接口文件名_函数名
'      2、如果服务器目录存在二级目录、域名中也需要带上二级目录,例如:http://你的域名/二级目录/Api.php?a=待调用函数名称
'      3、API 文件运行时需要服务器安装 PHP 环境的支持;本地开发时可以使用 PhpStudy2018
'      4、如果核心库没有相关中文函数,在代码中可以直接使用PHP原始英文函数
' ****************************************************************************
' 开启 Session 记录用户登录状态
启用会话凭证()

' 向客户端发送服务器的响应报头(Response Header),一般保持默认即可
置响应头("Content-Type: text/html; charset=utf-8")
置响应头("Content-Language: zh-CN")

' 引用轻语言封装的PHP核心库,注:如果要删除该引用请确保当前文件中未使用轻语言封装的函数
引用 "library/qing.core.php"

' 连接数据库,参数分别为:地址,数据库名称,数据库账号,数据库密码
MySQL连接("localhost","test","root","root")

' 调用主函数:“文件被访问”、即当在任何前端中访问该文件时,地址中不带任何参数名,都将会先调用该函数
文件被访问()

' 入口函数,函数名可自定义命名,主要作用:
' 当本文件被访问时,获取其前端传来的请求参数值,根据请求参数值调用当前文件中的函数
函数 文件被访问()
    ' 通过URL中的键参获取要执行的函数,这里我们默认规定键名为“a”,例如:
    ' 前端请求地址为:http://xxx.com/本文件名.php?a=测试输出
    ' 其“a”后面的值“测试输出”即为我们要执行的函数,使用“取请求值”函数将其取出后,然后执行。
    变量 待执行函数名 = 取请求值("a")
    如果(为空(待执行函数名))
        输出 "待执行函数不能为空"
    否则
        ' 增加安全验证,只允许执行我们定义的函数,当然不加也可以,这里仅作标准开发演示
        变量 可被执行的函数列表 = [ "注册账号", "登录账号" ,"取登录状态","退出登录"]
        如果(取成员是否存在(待执行函数名,可被执行的函数列表) == 真)
            输出 执行函数(待执行函数名)
        否则
            输出 "请求执行非法的函数"
        结束 如果
    结束 如果
结束 函数


' 前端请求注册账号
函数 注册账号()
    ' 注意:调用该函数之前,您需要提前在您的数据库中创建一个表,
    ' 表中至少包含2个字段:name,pass
    ' 然后在该函数中接收前端传来的数据值
    变量 userName = 取请求值("username")
    变量 passWord = 取请求值("password")
    ' 检测一下,提交的请求值是否为空值
    如果(为空(userName))
        返回 格式化内容(1,"账号不能为空")
    结束 如果
    如果(为空(passWord))
        返回 格式化内容(1,"密码不能为空")
    结束 如果
    ' 检测一下,添加的目标账号是否已经存在
    如果(MySQL查找("mytable","name = ?",[userName]))
        返回 格式化内容(1,"添加的账号:" + userName + "已经存在")
    结束 如果
    ' 如何符合添加要求,则将这些数据添加到一个数组中
    变量 待添加数据 = [userName,passWord]
    ' 然后构建SQL语句、这里需要注意:由于内置的 MySQL 操作函数采用了PDO方式(防注入)
    ' 因此这里的SQL语句可能和大家平常在网上看到那种不一样,具体格式为:
    变量 SQL命令 = "insert into mytable(name,pass)value(?,?)"
    ' mytable 为数据库中的表名
    ' mytable 后面括号的内容为数据表中的字段
    ' value   后面括号为表中字段对应要添加的占位符
    ' 规定:第一个括号里面有几个字段,value后面就要添加几个 ? 作为占位符
    ' 而我们待添加的数据成员长度(数组个数)也必须与字段数量完全一致
    ' 例如:
    ' 上述我们要添加 2 个值,那么待添加的数据数组长度也必须为 2 个
    ' 上述准备工作做好后,就可以开始向数据库中添加数据了
    ' 如果 MySQL执行 函数执行成功,返回真、否则返回假
    如果(MySQL执行(SQL命令,待添加数据))
        返回 格式化内容(0,"数据添加成功")
    否则
        返回 格式化内容(1,"数据添加失败")
    结束 如果
结束 函数

函数 登录账号()
    ' 登录账号的实现逻辑:
    ' 使用前端提交的请求值查询数据表中是否存在指定记录,如果存在且与提交数据匹配
    ' 则保护登录状态,返回给前端登录成功
    变量 userName = 取请求值("username")
    变量 passWord = 取请求值("password")
    ' 检测一下,提交的请求值是否为空值
    如果(为空(userName) 或 为空(passWord))
        返回 格式化内容(1,"账号或密码不能为空")
    结束 如果
    ' 查询表中是否存在符合请求值的记录
    变量 查询结果 = MySQL取一行("mytable","name=? and pass=?",[userName,passWord])
    如果(为空(查询结果) 或 取数组成员数(查询结果) == 0)
        返回 格式化内容(1,"账号或密码不正确!")
    结束 如果
    ' 否则保存登录状态,并返回登录成功
    置会话凭证("登录账户",userName)
    返回 格式化内容(100,"登录成功!")
结束 函数

函数 取登录状态()
    变量 已登录账户 = 取会话凭证("登录账户")
    如果(已登录账户 != "")
        返回 格式化内容(100,已登录账户)
    否则
        返回 格式化内容(1,"未登录")
    结束 如果
结束 函数

函数 退出登录()
    ' 删除会话凭证中保存的:登录账户 相关数据
    销毁会话凭证()
结束 函数

管理端

管理页面.spldg

<?xml version="1.0" encoding="utf-8"?>
<页面 标题="后台管理" 宽度="819" 高度="478">
  <绝对布局 名称="根布局">
    <按钮 名称="按钮1" 左边="329" 宽度="78" 顶边="18" 高度="31" 文本="查询" />
    <表格 名称="表格1" 左边="21" 顶边="55" 高度="346" 宽度="582" />
    <单行输入框 名称="单行输入框1" 左边="21" 顶边="18" 高度="31" 宽度="302" 提示文本="请输入待查询用户" />
    <按钮 名称="按钮2" 宽度="77" 高度="31" 左边="413" 顶边="18" 文本="模糊查询" />
    <按钮 名称="按钮3" 宽度="107" 高度="31" 左边="496" 顶边="18" 文本="获取全部数据" />
    <弹性布局 名称="弹性布局1" 左边="628" 顶边="75" 高度="171" 宽度="184">
      <单行输入框 名称="单行输入框2" 提示文本="请输入新用户名" />
      <单行输入框 名称="单行输入框3" 提示文本="请输入新密码" />
      <按钮 名称="按钮_修改" 文本="修改" />
      <按钮 名称="按钮_取消修改" 文本="取消" />
    </弹性布局>
  </绝对布局>
</页面>

管理页面.spl

' ****************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 修改日志:
' ****************************************************************************

' 定义当点击编辑标签时显示的弹窗
变量 程_编辑弹窗 = 创建 对话框()

事件 页面加载完毕()
    初始化编辑面板弹窗()
    ' 初始化表头及加载数据
    表格1.置表头("ID","账号","密码","操作")
    查询所有用户数据()
结束 事件

函数 初始化编辑面板弹窗()
    ' 弹性布局1 作为对话框面板内容,添加到弹窗
    弹性布局1.方向 = "column"
    弹性布局1.定位 = ""
    程_编辑弹窗.标题 = "编辑信息"
    ' 调整一下弹性布局中子组件
    变量循环(i = 0,弹性布局1.取子组件数(),1)
        变量 子对象 = 弹性布局1.取子组件(i)
        子对象.外边距 = "5px 0px"
        子对象.内边距 = "5px 0px"
    结束循环
    ' 添加给弹窗
    程_编辑弹窗.置视图(弹性布局1)
结束 函数

事件 按钮1.被单击(源对象,事件源)
    如果(单行输入框1.内容 == "")
        弹出提示("请输入待查询用户名称")
        返回
    结束 如果
    变量 待提交数据 = "name=" + 单行输入框1.内容
    请求接口("Admin","查询指定用户",(请求结果,标记)=>{
        调试输出(请求结果)
        如果(请求结果 == "")
            弹出提示("查询失败")
            返回
        结束 如果
        表格1.清空()
        ' 解析并判断是否查询到数据
        变量 jsonObj = JSON解析(请求结果)
        如果(jsonObj.code == 1)
            弹出提示(jsonObj.msg)
            返回
        结束 如果
        ' 取出查询到的用户列表
        变量 用户列表 = jsonObj.msg
        变量循环(i = 0,取数组成员数(用户列表),1)
            ' 取出列表中每一个用户对象
            变量 用户 = 用户列表[i]
            ' 使用自定义函数创建每一行后面的编辑,删除按钮
            变量 局_操作标签 = 创建操作标签(i)
            ' 然后将用户ID,名称、密码、及操作布局添加到表中
            表格1.添加一行(用户.id,用户.name,用户.pass,局_操作标签)
        结束循环
    },待提交数据)
结束 事件

事件 按钮2.被单击(源对象,事件源)
    ' 模糊查询与精确查询的代码几乎一样,只是后端的SQL语句不同
    如果(单行输入框1.内容 == "")
        弹出提示("请输入待查询用户名称")
        返回
    结束 如果
    变量 待提交数据 = "name=" + 单行输入框1.内容
    请求接口("Admin","模糊查询指定用户",(请求结果,标记)=>{
        调试输出(请求结果)
        如果(请求结果 == "")
            弹出提示("查询失败")
            返回
        结束 如果
        表格1.清空()
        ' 解析并判断是否查询到数据
        变量 jsonObj = JSON解析(请求结果)
        如果(jsonObj.code == 1)
            弹出提示(jsonObj.msg)
            返回
        结束 如果
        ' 取出查询到的用户列表
        变量 用户列表 = jsonObj.msg
        变量循环(i = 0,取数组成员数(用户列表),1)
            ' 取出列表中每一个用户对象
            变量 用户 = 用户列表[i]
            ' 使用自定义函数创建每一行后面的编辑,删除按钮
            变量 局_操作标签 = 创建操作标签(i)
            ' 然后将用户ID,名称、密码、及操作布局添加到表中
            表格1.添加一行(用户.id,用户.name,用户.pass,局_操作标签)
        结束循环
    },待提交数据)
结束 事件

事件 按钮3.被单击(源对象,事件源)
    查询所有用户数据()
结束 事件

函数 查询所有用户数据()
    表格1.清空()
    请求接口("Admin","查询所有用户",(请求结果,标记)=>{
        调试输出(请求结果)
        如果(请求结果 == "")
            返回
        结束 如果
        变量 jsonObj = JSON解析(请求结果)
        ' 注意:这里返回的请求结果里面的 msg 值为一个 JSON 数组
        变量 用户列表 = jsonObj.msg
        变量循环(i = 0,取数组成员数(用户列表),1)
            ' 取出列表中每一个用户对象
            变量 用户 = 用户列表[i]
            ' 使用自定义函数创建每一行后面的编辑,删除按钮
            变量 局_操作标签 = 创建操作标签(i)
            ' 然后将用户ID,名称、密码、及操作布局添加到表中
            表格1.添加一行(用户.id,用户.name,用户.pass,局_操作标签)
        结束循环
    })
结束 函数

' 将创建操作标签的代码单独封装成一个函数调用
函数 创建操作标签(索引)
    ' 创建表格中操作栏的 编辑|删除 标签
    变量 局_操作布局 = 创建 弹性布局()
    局_操作布局.定位 = ""
    变量 局_编辑标签 = 创建 标签()
    局_编辑标签.定位 = ""
    局_编辑标签.文本 = "编辑"
    局_编辑标签.文本颜色 = "#006cd7"
    局_编辑标签.光标样式 = "pointer"
    局_编辑标签.外边距右 = "10px"
    局_编辑标签.置被单击回调(()=>{
        ' 弹出提示("表项:" + 索引 + "编辑")
        ' 弹出自定义对话框弹窗,编辑内容
        编辑指定用户(索引)
    })
    变量 局_删除标签 = 创建 标签()
    局_删除标签.定位 = ""
    局_删除标签.文本 = "删除"
    局_删除标签.文本颜色 = "#ff0000"
    局_删除标签.光标样式 = "pointer"
    局_删除标签.置被单击回调(()=>{
        ' 根据索引取出表中当前行的数据,再根据列索引取出用户名
        变量 目标行 = 表格1.取一行(索引)
        调试输出(目标行)
        变量 待删除用户名 = 目标行[1]
        删除数据表用户(待删除用户名)
    })
    ' 将编辑、删除标签添加到操作布局中
    局_操作布局.添加组件(局_编辑标签)
    局_操作布局.添加组件(局_删除标签)
    ' 返回整个操作布局
    返回 局_操作布局
结束 函数

函数 删除数据表用户(用户名)
    如果(确认框("确定要删除“" + 用户名 + "”吗?") == 真)
        ' 发送删除请求
        请求接口("Admin","删除用户",(请求结果,标记)=>{
            如果(请求结果 == "")
                信息框("发送删除请求失败")
                返回
            结束 如果
            变量 jsonObj = JSON解析(请求结果)
            弹出提示(jsonObj.msg)
            如果(jsonObj.code == 100)
                ' 刷新数据表、查询所有数据
                查询所有用户数据()
            结束 如果
        },"name=" + 用户名)
    结束 如果
结束 函数

函数 编辑指定用户(索引)
    变量 行数据 = 表格1.取一行(索引)
    单行输入框2.内容 = 行数据[1]
    单行输入框3.内容 = 行数据[2]
    ' 注册面板中的按钮事件
    按钮_修改.置被单击回调(()=>{
        变量 待提交数据 = "id=" + 行数据[0] + "&name=" + 单行输入框2.内容 + "&pass=" + 单行输入框3.内容
        '调试输出(待提交数据)
        请求接口("Admin","编辑用户",(请求结果,标记)=>{
            变量 jRes = JSON解析(请求结果)
            弹出提示(jRes.msg)
            ' 根据后端返回的状态码,判断是否修改成功
            如果(jRes.code == 100)
                ' 刷新数据
                查询所有用户数据()
                ' 关闭弹窗
                程_编辑弹窗.关闭()
            结束 如果
        },待提交数据)
    })
    按钮_取消修改.置被单击回调(()=>{
        程_编辑弹窗.关闭()
    })
    程_编辑弹窗.显示()
结束 函数

管理页面对应的服务器脚本程序文件:Admin.sph

' ****************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 文件描述:管理端接口文件、用于管理,查询、修改、删除表中的数据。
' 修改日志:
' ****************************************************************************
' 开启 Session 记录用户登录状态
启用会话凭证()

' 向客户端发送服务器的响应报头(Response Header)
置响应头("Content-Type: text/html; charset=utf-8")
置响应头("Content-Language: zh-CN")

' 引用轻语言封装的PHP核心库,注:如果要删除该引用请确保当前文件中未使用轻语言封装的函数
引用 "library/qing.core.php"

' 连接数据库,参数分别为:地址,数据库名称,数据库账号,数据库密码;注意:连接数据库操作必须放在引用核心库之后
MySQL连接("localhost","test","root","root")

' 调用主函数:“文件被访问”、即当在任何前端中访问该文件时,地址中不带任何参数名,都将会先调用该函数
文件被访问()

' 入口函数,函数名可自定义命名,主要作用:
' 当本文件被访问时,获取其前端传来的请求参数值,根据请求参数值调用当前文件中的函数
函数 文件被访问()
    ' 通过URL中的键参获取要执行的函数,这里我们默认规定键名为“a”,例如:
    ' 前端请求地址为:http://xxx.com/本文件名.php?a=测试输出
    ' 其“a”后面的值“测试输出”即为我们要执行的函数,使用“取请求值”函数将其取出后,然后执行。
    变量 待执行函数名 = 取请求值("a")
    如果(为空(待执行函数名))
        输出 "待执行函数不能为空"
    否则
        输出 执行函数(待执行函数名)
    结束 如果
结束 函数

函数 查询所有用户()
    ' 查询表中所有用户数据,返回给前端
    变量 查询结果 = MySQL查询("select * from mytable",[])
    如果(为空(查询结果))
        返回 格式化内容(1,"数据查询失败")
    结束 如果
    ' 查询结果不为空、则将查询结果格式化为JSON数据格式值返回给前端
    返回 格式化内容(0,查询结果)
结束 函数

函数 查询指定用户()
    变量 name = 取请求值("name")
    如果(为空(name))
        返回 格式化内容(1,"待查询用户名不能为空")
    结束 如果
    变量 查询结果 = MySQL查询("select * from mytable where name=?",[name])
    如果(为空(查询结果))
        返回 格式化内容(1,"未查询到用户名为:" + name + " 的用户")
    结束 如果
    返回 格式化内容(0,查询结果)
结束 函数

函数 模糊查询指定用户()
    变量 name = 取请求值("name")
    如果(为空(name))
        返回 格式化内容(1,"待查询用户名不能为空")
    结束 如果
    ' 模糊查询核心改动:
    ' name = ? 修改为 like ?
    ' 且待查询的关键字两边必须加上 % %
    变量 待查询账号 = "%" + name + "%"
    变量 查询结果 = MySQL查询("select * from mytable where name like ?",[待查询账号])
    如果(为空(查询结果))
        返回 格式化内容(1,"未查询到用户名为:" + name + " 的用户")
    结束 如果
    返回 格式化内容(0,查询结果)
结束 函数

函数 删除用户()
    ' 根据前端传来的条件值删除用户,这里我们仍然根据用户名进行删除
    变量 name = 取请求值("name")
    如果(为空(name))
        返回 格式化内容(1,"待删除用户名不能为空")
    结束 如果
    变量 SQL命令 = "delete from mytable where name = ?"
    如果(MySQL执行(SQL命令,[name]))
        返回 格式化内容(100,"用户删除成功")
    否则
        返回 格式化内容(1,"用户删除失败")
    结束 如果
结束 函数

函数 编辑用户()
    变量 id = 取请求值("id")
    变量 name = 取请求值("name")
    变量 pass = 取请求值("pass")
    如果(为空(id) 或 为空(name) 或 为空(pass))
        返回 格式化内容(1,"待修改内容不能为空数据")
    结束 如果
    变量 SQL命令 = "update mytable set name=?,pass=? where id=?"
    如果(MySQL执行(SQL命令,[name,pass,id]))
        返回 格式化内容(100,"用户数据修改成功")
    否则
        返回 格式化内容(1,"用户数据修改失败")
    结束 如果
结束 函数

学习要点

通过本综合演示,你可以学习到以下轻语言全栈开发技术:

知识点代码位置说明
MySQL连接初始化MySQL连接("localhost","test","root","root").sph 文件中初始化数据库连接,必须放在 引用 "library/qing.core.php" 之后
PDO 参数化查询MySQL执行(SQL命令,[userName,passWord])使用 ? 占位符 + 数组传参,从根本上防止 SQL 注入
模糊查询"select * from mytable where name like ?"SQL 中将 = 改为 like,并在参数两侧拼接 % 实现模糊搜索
会话凭证管理启用会话凭证置会话凭证取会话凭证销毁会话凭证通过 Session 实现"登录状态"在前后端之间的传递与保持
接口函数白名单可被执行的函数列表 = [ "注册账号", "登录账号" , ...]防止前端通过 URL 任意调用任意函数,提升 API 安全性
前端请求接口请求接口("User","注册账号",回调,待提交数据)前端通过接口名调用后端函数,由框架自动转换为 HTTP 请求并解析响应
JSON 数据交换格式化内容(状态码,数据)JSON解析(请求结果)后端统一返回 {code,msg} 结构,前端解析后按 code 分支处理
动态表格渲染表格1.添加一行(用户.id,用户.name,用户.pass,局_操作标签)在循环中将每行数据 + 操作按钮布局一同塞入表格
自定义组件创建创建 弹性布局创建 标签置被单击回调在普通函数中动态创建组件并绑定事件回调
对话框弹窗创建 对话框置视图(弹性布局1)显示关闭将布局作为对话框内容视图,实现自定义编辑面板

安全最佳实践

本演示遵循了以下安全开发规范,请在实际项目中同样遵守:

  1. 永远不要在前端代码中直连数据库:网页右键查看源代码会暴露数据库账号密码。所有数据库操作必须通过后端 .sph 接口完成。
  2. 永远使用 PDO 参数化查询:禁止使用字符串拼接构造 SQL,必须使用 ? 占位符 + 数组传参的形式(如 MySQL执行(SQL命令,[name,pass]))。
  3. API 函数白名单:在 文件被访问 入口函数中限制可调用的函数名,拒绝前端传入未定义的函数名。
  4. 空值校验:在接口函数开头使用 为空() 检测必填字段,返回明确的错误信息。
  5. 唯一性校验:注册前使用 MySQL查找 检测账号是否已存在,避免重复注册。
  6. 会话过期处理:使用 销毁会话凭证() 实现安全退出,避免长期持有失效登录态。

扩展方向

你可以基于本演示继续扩展以下功能:

  • 密码加密:使用 md5() 或更安全的 password_hash()(PHP 原生函数)对密码进行加密存储
  • 权限分级:在 mytable 表中新增 role 字段,区分普通用户和管理员,在 .sph 中根据 role 限制可调用的接口
  • 分页查询:使用 SQL 的 LIMIT 子句实现分页,前端通过表格的"上一页 / 下一页"按钮请求不同页
  • 数据导出:将查询结果通过 JSON编码 或 CSV 格式导出,提供"下载用户列表"功能
  • 登录验证码:集成第三方滑动验证码或图形验证码,防止暴力破解
  • 操作日志:在每次 CRUD 操作时,将操作人、操作时间、操作内容写入 log 表,实现审计

💡 相关文档:本演示中使用的 MySQL 操作函数(MySQL连接MySQL查询MySQL执行 等)详细参数说明请参考文档服务端(PHP)函数_MYSQL操作;前端 请求接口 函数用法请参考文档轻语言网站:发送网络请求与接口请求.sph 接口文件结构请参考文档轻语言网站:服务端脚本程序API接口;界面 XML 标签和属性定义请参考文档轻语言网站:界面XML定义规范

综合演示:WebSocket使用演示

文档概述

本例程演示如何在轻语言网站中使用 WS客户端 不可视组件与远程 WebSocket 服务端建立双向长连接通信。完整覆盖了 WS 连接、收发消息、错误处理与连接关闭的全流程,是轻语言中实现实时通讯、数据推送、在线协作等场景的入门示例。

💡 本演示使用公共测试服务器 wss://echo.websocket.org/,该服务器会将收到的消息原样回传(echo),便于本地无需自建服务端即可验证收发链路。

学习目标

阅读本文档后,你应当能够掌握以下内容:

  • 不可视组件的声明与使用:变量 页_Ws客户 = 创建 WS客户端()
  • WebSocket 连接地址的两种协议:ws://(非加密)与 wss://(加密)
  • WS 客户端四个核心回调:连接成功、收到消息、发生错误、连接被关闭
  • 事件源对象 WS事件源 的使用方式(如 WS事件源.data 取消息内容)
  • 不可视组件的命名规范(页_ 前缀表页面级变量)

涉及组件

本演示实际使用到的组件如下:

组件名称作用参考文档
页面<页面>页面根容器文档框架基础类_页面
绝对布局<绝对布局>父级定位容器文档布局类组件_绝对布局
编辑框<编辑框1>多行显示收到的消息日志,逐行追加文档文本类组件_编辑框
编辑框<编辑框2>单行输入待发送内容(提示文本占位)文档文本类组件_编辑框
按钮<按钮1/2/3>分别对应连接服务器、发送消息、关闭服务器文档文本类组件_按钮
WS客户端代码中 创建不可视组件,承载 WebSocket 连接与回调文档不可视类型组件_WS客户端

📌 WS客户端不可视组件,无法在 .spldg 中以 XML 标签声明,必须在 .spl 中通过 创建 WS客户端() 动态实例化。

涉及函数与关键字

以下为本演示代码中出现的轻语言关键字与内置函数:

关键字: 变量创建事件 ... 结束 事件

WS客户端方法:

  • 连接(服务端地址) —— 连接 WebSocket 服务端,返回是否开始尝试连接
  • 发送数据(数据) —— 通过已建立的连接发送文本消息
  • 关闭() —— 主动关闭 WebSocket 连接
  • 置连接成功回调(回调) —— 连接建立成功时触发,回调参数为 (事件源)
  • 置收到消息回调(回调) —— 收到服务端消息时触发,回调参数为 (WS事件源)
  • 置发生错误回调(回调) —— 连接发生异常时触发,回调参数为 (事件源)
  • 置连接被关闭回调(回调) —— 连接被关闭时触发,回调无参数

编辑框方法:

  • 追加文本行(文本) —— 向编辑框追加一行文本(自动换行)

调试函数:

  • 调试输出(内容) —— 在控制台输出调试信息

程序结构与运行流程

本项目由成对的两个文件组成:

首页.spldg   ← 页面布局文件(XML 格式)
首页.spl     ← 页面逻辑文件(轻语言代码)

运行时流程如下:

  1. 浏览器打开网站 → 加载 首页 页面
  2. 框架解析 首页.spldg 构建 DOM,执行 首页.spl 中的 页面加载完毕 事件(本演示在该事件中无操作,仅作占位)
  3. 用户点击「连接服务器」→ 触发 按钮1.被单击 → 调用 页_Ws客户.连接(...) 并注册 4 个回调
  4. 连接成功后触发 置连接成功回调,控制台输出 "WS连接服务端成功"
  5. 用户在 编辑框2 输入内容后点击「发送消息」→ 触发 按钮2.被单击 → 调用 页_Ws客户.发送数据(编辑框2.内容)
  6. 服务端 echo 回消息 → 触发 置收到消息回调 → 在 编辑框1 中追加显示 WS事件源.data
  7. 用户点击「关闭服务器」→ 触发 按钮3.被单击 → 调用 页_Ws客户.关闭(),连接被关闭后触发 置连接被关闭回调

数据模型

WS 客户端的回调参数 WS事件源(或称 事件源)是浏览器原生 MessageEvent 对象,常用属性如下:

属性类型说明
data文本/二进制服务端发送的消息内容(文本协议时为字符串)
origin文本消息来源 URL
timeStamp数值事件创建时间戳

本演示中通过 WS事件源.data 取出消息文本并追加到 编辑框1

程序源代码

首页.spldg

<?xml version="1.0" encoding="utf-8"?>
<页面 标题="页面标题" 宽度="500" 高度="453">
  <绝对布局 名称="根布局">
    <按钮 名称="按钮1" 左边="10" 宽度="119" 顶边="168" 高度="40" 文本="连接服务器" />
    <编辑框 名称="编辑框1" 左边="10" 顶边="9" 高度="144" 宽度="461" />
    <按钮 名称="按钮2" 宽度="119" 高度="40" 左边="352" 顶边="252" 文本="发送消息" />
    <编辑框 名称="编辑框2" 宽度="336" 高度="67" 左边="135" 顶边="168" 提示文本="请输入待发送的内容" />
    <按钮 名称="按钮3" 宽度="119" 高度="40" 左边="10" 顶边="223" 文本="关闭服务器" />
  </绝对布局>
</页面>

首页.spl

' ****************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 程序作者:
' 联系信息:
' 窗口描述:默认首页。
' ****************************************************************************

' WS客户端组件为不可视组件,我们声明一个页面对象
变量 页_Ws客户 = 创建 WS客户端()

事件 页面加载完毕()
    
结束 事件

事件 按钮1.被单击(源对象,事件源)
    ' 使用公用WS服务器测试
	页_Ws客户.连接("wss://echo.websocket.org/")
    页_Ws客户.置连接成功回调(()=>{
        调试输出("WS连接服务端成功")
    })
    页_Ws客户.置收到消息回调((WS事件源)=>{
        调试输出("WS收到消息:")
        调试输出(WS事件源)
        编辑框1.追加文本行(WS事件源.data)
    })
    页_Ws客户.置发生错误回调((WS事件源)=>{
        调试输出("WS发生错误:")
        调试输出(WS事件源)
    })
    页_Ws客户.置连接被关闭回调(()=>{
        调试输出("WS连接被关闭")
    })
结束 事件

事件 按钮2.被单击(源对象,事件源)
    页_Ws客户.发送数据(编辑框2.内容)
结束 事件

事件 按钮3.被单击(源对象,事件源)
    页_Ws客户.关闭()
结束 事件


关键代码解读

1. 不可视组件的实例化方式

变量 页_Ws客户 = 创建 WS客户端()
  • WS客户端 是不可视组件,不能.spldg 中以 <WS客户端> 标签声明
  • 必须在 .spl 顶部以 变量 声明并 创建 实例化,作用域为整个页面
  • 命名约定:页_ 前缀表示「页面级变量」,便于与函数内局部变量(局_)和模块级变量(程_)区分

2. WebSocket 协议前缀

页_Ws客户.连接("wss://echo.websocket.org/")
  • ws:// 为非加密连接(类似 HTTP),适用于本地调试或无 TLS 的内网服务
  • wss:// 为加密连接(类似 HTTPS),适用于生产环境,需要服务端配置证书
  • 本演示使用的 echo.websocket.org 是公共服务,会把收到的消息原样回传

3. 四个回调的注册时机

页_Ws客户.连接("wss://echo.websocket.org/")  ' ① 先发起连接
页_Ws客户.置连接成功回调(...)              ' ② 再注册回调
页_Ws客户.置收到消息回调(...)
页_Ws客户.置发生错误回调(...)
页_Ws客户.置连接被关闭回调(...)

注意:本演示先调用 连接 再注册回调。这是因为 连接 是异步的——返回后并未真正建立连接,回调注册会在连接握手完成前完成。但更稳妥的写法是先注册回调,再发起连接,避免握手过快导致回调未就绪时事件已触发。

4. 收到消息回调的事件源参数

页_Ws客户.置收到消息回调((WS事件源)=>{
    编辑框1.追加文本行(WS事件源.data)
})
  • 回调参数名可自定义(本例为 WS事件源,区别于按钮事件的 事件源
  • WS事件源.data 即服务端发来的消息内容
  • 编辑框1.追加文本行(...) 会自动换行追加,适合做消息日志显示

5. 发送与关闭的调用条件

事件 按钮2.被单击(源对象,事件源)
    页_Ws客户.发送数据(编辑框2.内容)
结束 事件
  • 发送数据 要求连接已处于「已连接」状态(状态码 1)
  • 若未连接就发送,浏览器会抛出 InvalidStateError
  • 生产环境中应先通过 取连接状态() 判断或在 UI 上禁用发送按钮

注意事项

  • 回调注册时机:建议先调用 置...回调 再调用 连接,避免极端网络下握手过快导致事件丢失。本演示代码顺序在多数情况下可工作,但生产环境请调整为更严谨的顺序。
  • 发送前需判断连接状态:未连接时调用 发送数据 会抛出原生异常,建议先调用 取连接状态() 判断是否为 1(已连接)。
  • echo.websocket.org 为公共测试服务:仅供联调使用,不保证可用性与稳定性,生产环境请部署自己的 WebSocket 服务端。
  • 消息协议:本演示发送与接收均为文本字符串。如需发送二进制数据(如 Blob/ArrayBuffer),需在连接前设置 binaryType 属性(请参考浏览器 WebSocket 文档)。
  • WS客户端不可视:不要在 .spldg 中尝试声明 WS客户端,必须通过 创建 实例化。
  • 跨域限制:WebSocket 不受同源策略限制,但仍需服务端允许你的来源 origin。

学习要点总结

知识点关键代码适用场景
不可视组件实例化变量 页_Ws客户 = 创建 WS客户端()WS、SSE、后台任务等不可视组件
WS 连接页_Ws客户.连接("wss://...")实时通讯
连接成功回调置连接成功回调(回调)握手完成后初始化
收到消息回调置收到消息回调((WS事件源)=>{...})接收服务端推送
错误回调置发生错误回调(回调)异常处理与重连
关闭回调置连接被关闭回调(回调)断线提示与清理
发送消息发送数据(文本)客户端 → 服务端
关闭连接关闭()主动断开
事件源属性WS事件源.data取消息内容
追加文本行编辑框1.追加文本行(...)日志/消息流显示

相关文档

  • 文档不可视类型组件_WS客户端 —— WS客户端的完整方法与事件说明
  • 文档框架基础类_页面 —— 页面级事件(页面加载完毕等)
  • 文档文本类组件_编辑框 —— 编辑框的属性与方法(追加文本行等)
  • 文档文本类组件_按钮 —— 按钮的属性与被单击事件
  • 文档布局类组件_绝对布局 —— 绝对布局的使用
  • 文档轻语言网站:轻语言语法速查 —— 关键字、流程控制、拉姆达表达式
  • 文档综合演示:网页留言板开发 —— 同样使用列表框与事件驱动的入门示例
  • 文档综合演示:MySQL数据库操作 —— 对比的 HTTP 请求接口模式(短连接)

综合演示:XML 与使用代码动态创建组件演示

文档概述

本示例展示如何使用 XML 定义界面布局,并通过轻语言代码实现组件的动态创建、添加、迁移——把可视化设计中已存在的组件(绝对布局1及其子组件)整体迁移到垂直滚动框中。这是轻语言中「XML 静态布局 + 代码动态生成」混合开发模式的典型范例,也是理解容器视图、组件类型判断、弹性布局转换的关键示例。

💡 本演示的核心价值在于「迁移组件」这一场景:已存在于 .spldg 中的组件可以通过修改 定位移动 等属性后,用 添加组件 重新挂到另一个容器下,实现组件的跨容器移动。

学习目标

阅读本文档后,你应当能够掌握以下内容:

  • 动态创建组件:变量 局_按钮 = 创建 按钮()
  • 动态添加组件到容器:根布局.添加组件(局_按钮) / 垂直滚动框1.添加组件(...)
  • 动态组件的布局参数设置:移动(左边, 顶边, 宽度, 高度) 支持整数与带单位文本
  • 非绝对布局容器中子组件需清空 定位局_按钮对象.定位 = ""
  • 容器子组件遍历:取子组件数() + 取子组件(索引)
  • 组件类型判断:子组件对象 类属 单行输入框
  • 绝对布局转弹性布局:绝对布局1.转为弹性布局("column")
  • 闭包回调注册:置被单击回调((源对象,事件源)=>{...})

涉及组件

本演示实际使用到的组件如下:

组件名称作用参考文档
页面<页面>页面根容器文档框架基础类_页面
绝对布局<绝对布局>(根布局)顶层定位容器文档布局类组件_绝对布局
绝对布局<绝对布局1>待迁移的面板容器(含子组件)文档布局类组件_绝对布局
垂直滚动框<垂直滚动框1>接收迁移组件的滚动容器文档列表类组件_垂直滚动框
标签<标签1>状态显示文档文本类组件_标签
按钮<按钮1> + 动态创建的多个按钮触发迁移 / 动态生成文档文本类组件_按钮
单行输入框<单行输入框1>绝对布局1 的子组件(迁移演示)文档文本类组件_单行输入框
单选框<单选框1>绝对布局1 的子组件文档选择类组件_单选框
多选框<多选框1>绝对布局1 的子组件文档选择类组件_多选框

📌 弹性布局 类虽未在 .spldg 中声明,但通过 转为弹性布局("column") 在运行时把绝对布局1 转换为弹性布局(详见后文「关键代码解读」)。

涉及函数与关键字

以下为本演示代码中出现的轻语言关键字与内置函数:

关键字: 变量事件 ... 结束 事件函数 ... 结束 函数变量循环 ... 结束循环如果 ... 结束 如果创建类属返回

组件创建:

  • 创建 按钮() —— 动态实例化一个按钮组件(返回视图对象)

视图通用方法:

  • 移动(左边, 顶边, 宽度, 高度) —— 一次性设置位置与尺寸,参数可为整数(默认 px)或带单位文本
  • 置被单击回调(回调) —— 设置被单击的回调函数
  • 定位 = "" —— 清空定位,交由父布局接管(用于非绝对布局容器)

容器视图方法(绝对布局、弹性布局、滚动框等均继承):

  • 添加组件(组件) —— 向容器追加一个子组件
  • 取子组件数() —— 取得容器中子组件数量
  • 取子组件(索引) —— 取得指定索引的子组件对象

绝对布局特有方法:

  • 转为弹性布局(方向) —— 将绝对布局转换为弹性布局,参数为方向(如 "column" 纵向、"row" 横向)

运算符:

  • 类属 —— 类型判断运算符,等价于 JavaScript 的 instanceof,如 子组件对象 类属 单行输入框
  • % —— 取余运算符,如 i % 2 == 0 判断奇偶

程序结构与运行流程

本项目由成对的两个文件组成:

demo.spldg   ← 页面布局文件(XML 格式,定义静态组件)
demo.spl     ← 页面逻辑文件(轻语言代码,动态创建与迁移)

运行时流程如下:

  1. 浏览器加载 demo 页面 → 框架解析 demo.spldg 构建静态 DOM(根布局、标签1、垂直滚动框1、按钮1、绝对布局1 及其 3 个子组件)
  2. 执行 demo.spl 中的 页面加载完毕 事件:
    • 动态创建 1 个按钮 → 设置文本、位置、单击回调 → 添加到 根布局
    • 调用 动态批量创建组件() → 在 垂直滚动框1 中循环创建多个按钮
  3. 用户点击「按钮1」(静态按钮)→ 触发 按钮1.被单击 → 将 绝对布局1 整体迁移到 垂直滚动框1
    • 修改 绝对布局1 的定位为 relative、宽度 100%、高度 auto
    • 遍历子组件,清空定位、调整外边距,对单行输入框特判样式
    • 绝对布局1 转为弹性布局(纵向)
    • 绝对布局1 添加到 垂直滚动框1

程序源代码

demo.spldg

<?xml version="1.0" encoding="utf-8"?>
<页面 标题="页面标题" 宽度="628" 高度="496">
  <绝对布局 名称="根布局">
    <标签 名称="标签1" 左边="12" 顶边="108" 高度="40" 宽度="218" 文本="我是最棒的!" 背景颜色="#B8E4C7" />
    <垂直滚动框 名称="垂直滚动框1" 左边="394" 顶边="108" 高度="318" 宽度="219" 背景颜色="#DFE7FB" />
    <按钮 名称="按钮1" 左边="12" 顶边="176" 高度="39" 宽度="120" 文本="动态迁移组件" />
    <绝对布局 名称="绝对布局1" 左边="154" 顶边="176" 高度="134" 宽度="234" 背景颜色="#B8E6B5">
      <单行输入框 名称="单行输入框1" 左边="3" 顶边="5" 高度="34" 宽度="228" />
      <单选框 名称="单选框1" 左边="28" 顶边="45" 高度="36" 宽度="106" 标题="单选框1" />
      <多选框 名称="多选框1" 左边="13" 顶边="87" 高度="40" 宽度="105" 标题="多选框1" />
    </绝对布局>
  </绝对布局>
</页面>

demo.spl

' ****************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 程序作者:
' 联系信息:
' 窗口描述:默认首页。
' ****************************************************************************

' 页面变量,整个页面都能使用
变量 页面变量 = "首页"

事件 页面加载完毕()
    ' 这里我们演示创建一个按钮,和循环创建10个按钮添加到滚动框中
    ' 注意:如果可视化设计器窗口中(界面布局文件.spldg)已经添加了名称为“按钮1”的按钮组件,那么在代码中动态创建按钮时
    ' 就不能再取名为“按钮1”
    变量 局_按钮 = 创建 按钮()
    局_按钮.文本 = "我是动态创建的按钮" 
    ' 设置当前创建的按钮布局位置,参数值可以为整数、或文本,当设置含有单位的参数值时,必须为文本类型
    ' 例如:下方的10,20 不带单位时,默认为px像素,如果设置单位则需要使用双引号包裹作为文本参数值设置
    局_按钮.移动(10,20,"50%","60px")
    ' 为按钮设置被单击事件,当按钮在页面中被用户单击后,系统反馈给我们(开发者)
    局_按钮.置被单击回调((源对象,源事件)=>{
        弹出提示("动态创建的按钮被单击")
        标签1.文本 = "动态创建的按钮被单击"
    })
    ' 将按钮添加到根布局或任意其它布局中
    根布局.添加组件(局_按钮)
    ' 除了上述方式外,我们也可以将创建组件的代码放在一个函数中,然后在合适的地方调用函数
    动态批量创建组件()
结束 事件

函数 动态批量创建组件()
    垂直滚动框1.边框圆角 = "4px"
    变量循环(i = 0,10,1)
        变量 局_按钮对象 = 创建 按钮()
        ' 注意:任何添加到父布局为非绝对布局的容器中时,都需要设置定位为空或适合父布局的定位
        ' 设置为指定定位后,由父布局处理子组件的定位模式,这里我们设置其子组件的定位为空
        局_按钮对象.定位 = ""
        ' 设置一下宽高尺寸
        局_按钮对象.宽度 = "100%"
        局_按钮对象.内边距 = "10px"
        局_按钮对象.外边距底 = "10px"
        ' 设置不同索引的颜色背景
        如果(i % 2 == 0)
            局_按钮对象.背景颜色 = "#18b165"
        结束 如果
        ' 设置其它属性
        局_按钮对象.文本 = "动态按钮" + i
        局_按钮对象.置被单击回调((源对象,事件源)=>{
            标签1.文本 = "垂直滚动框中按钮被单击,索引:" + i
        })
        垂直滚动框1.添加组件(局_按钮对象)
    结束循环
结束 函数

事件 按钮1.被单击(源对象,事件源)
    ' 将窗口中的“绝对布局1”(类似面板)连同子组件内容添加到垂直滚动框中
    ' 由于“绝对布局1”本身是放在根布局(绝对定位)中,因此要将其添加到滚动框内之前
    ' 我们需要修改其定位属性及尺寸,由于保护了子组件,我们设置其布局为 相对布局,并修改其宽度
    ' 铺面滚动框、高度自动
    绝对布局1.定位 = "relative"
    绝对布局1.宽度 = "100%"
    绝对布局1.高度 = "auto"
    ' 修改其子组件相关属性
    变量 子组件数量 = 绝对布局1.取子组件数()
    变量循环(i = 0,子组件数量,1)
        变量 子组件对象 = 绝对布局1.取子组件(i)
        ' 调试输出(子组件对象)
        ' 这里返回的子组件对象为视图对象、每个视图对象都拥有视图类所有属性和事件
        ' 设置子组件定位为空、且调整布局参数为空
        子组件对象.定位 = ""
        子组件对象.移动("","","","")
        ' 设置上下外边距为10px、左右外边距为 0px
        子组件对象.外边距 = "10px 0px"
        ' 判断指定类型组件,并设置其属性
        如果(子组件对象 类属 单行输入框)
            子组件对象.内边距 = "6px"
            子组件对象.边框圆角 = "6px"
        结束 如果
        ' 将其转为弹性布局
        绝对布局1.转为弹性布局("column")
    结束循环
    ' 添加到垂直滚动框中
    垂直滚动框1.添加组件(绝对布局1)
结束 事件


关键代码解读

1. 动态创建组件与命名冲突

变量 局_按钮 = 创建 按钮()
局_按钮.文本 = "我是动态创建的按钮"
  • 创建 按钮() 实例化一个按钮视图对象,返回值赋给局部变量 局_按钮
  • 命名冲突注意.spldg 中已声明的组件名(如 按钮1)在页面中已被占用,动态创建时不能再取同名,否则会覆盖原有组件引用
  • 局部变量推荐用 局_ 前缀,与页面级 页_、模块级 程_ 区分

2. 移动方法的参数类型

局_按钮.移动(10,20,"50%","60px")
  • 移动(左边, 顶边, 宽度, 高度) 四个参数均可为整数或文本
  • 整数:默认单位为 px,如 10 等价于 10px
  • 带单位文本:必须用双引号包裹,如 "50%""60px"
  • 若传带单位却不加引号(如 50%)会被当作表达式解析导致错误

3. 非绝对布局容器中的子组件定位

局_按钮对象.定位 = ""
  • 绝对布局的子组件靠 左边/顶边 定位
  • 弹性布局、滚动框等容器靠自身布局算法排列子组件
  • 因此添加到非绝对布局容器前,必须清空子组件的 定位(设为 ""),交由父布局接管
  • 否则子组件会保留绝对定位,脱离父布局的流式排列

4. 组件类型判断:类属运算符

如果(子组件对象 类属 单行输入框)
    子组件对象.内边距 = "6px"
    子组件对象.边框圆角 = "6px"
结束 如果
  • 类属 是轻语言的类型判断运算符,等价于 JavaScript 的 instanceof
  • 用法:对象 类属 类型名,返回逻辑值
  • 这里遍历绝对布局1 的子组件时,对「单行输入框」类型的子组件做特判样式处理
  • 因为 取子组件(i) 返回的是通用 视图 对象,访问子类特有属性前需先判断类型

5. 绝对布局转弹性布局

绝对布局1.转为弹性布局("column")
  • 转为弹性布局(方向) 是绝对布局的特有方法
  • "column" 为纵向排列,"row" 为横向排列
  • 转换后原绝对布局的子组件按弹性布局算法重新排列
  • 注意:本演示中该语句位于 变量循环 内部,会被多次调用。由于转换是幂等的(重复转换无副作用),功能上不会出错,但更合理的写法是将其移到循环外,仅调用一次:
变量循环(i = 0,子组件数量,1)
    ' ...子组件属性调整...
结束循环
' 转换应在循环外,只调用一次
绝对布局1.转为弹性布局("column")

6. 组件迁移的整体流程

' ① 修改容器自身定位与尺寸
绝对布局1.定位 = "relative"
绝对布局1.宽度 = "100%"
绝对布局1.高度 = "auto"
' ② 遍历并调整子组件
变量循环(i = 0,子组件数量,1)
    变量 子组件对象 = 绝对布局1.取子组件(i)
    子组件对象.定位 = ""
    子组件对象.移动("","","","")
    ' ...
结束循环
' ③ 转换布局
绝对布局1.转为弹性布局("column")
' ④ 添加到目标容器
垂直滚动框1.添加组件(绝对布局1)

「组件迁移」的本质是:把一个容器整体挂到另一个容器下。迁移前需调整定位策略(从绝对改为 relative/弹性),否则原绝对布局的子组件无法在新容器中正确排列。

7. 闭包中的循环变量

变量循环(i = 0,10,1)
    变量 局_按钮对象 = 创建 按钮()
    局_按钮对象.置被单击回调((源对象,事件源)=>{
        标签1.文本 = "垂直滚动框中按钮被单击,索引:" + i
    })
结束循环
  • 回调内引用了循环变量 i,依赖拉姆达表达式对当前值的捕获
  • 官方示例普遍采用这种写法,说明轻语言的拉姆达对循环变量按每次迭代的值捕获(类似 JavaScript let 语义)
  • 生成代码时可参照此模式,但若遇异常应改用参数绑定方式

注意事项

  • 循环边界语义:轻语言 变量循环(初始 = 起始, 目标, 递增) 等效于 for(初始=起始; 初始<目标; 初始+=递增),即初始变量小于目标值时循环、达到目标值时退出,左闭右开区间 [起始, 目标)。本演示中 变量循环(i = 0, 子组件数量, 1) 会循环 子组件数量 次(i=0~子组件数量-1),配合 取子组件(i) 遍历子组件正好不越界,是正确的写法。
  • 转为弹性布局 的位置:本演示将其放在循环内,每次迭代都调用一次。功能上因幂等不会出错,但建议放在循环外仅调用一次。
  • 动态组件命名:动态创建的组件不能与 .spldg 中已声明的组件同名,否则会覆盖原有引用。
  • 非绝对布局容器中的子组件:添加到弹性布局、滚动框等容器前,必须设置子组件 定位 = "",否则保留绝对定位会导致布局错乱。
  • 移动 参数类型:带单位的值(如 "50%""60px")必须用双引号包裹为文本;纯整数默认为 px。
  • 类属 运算符:用于判断对象是否为某类型,等价于 instanceof。遍历容器子组件访问子类特有属性前应先做类型判断。
  • 组件迁移本质:是把容器整体挂到另一容器下,迁移前需调整定位策略(绝对 → relative/弹性),否则子组件在新容器中无法正确排列。

学习要点总结

知识点关键代码适用场景
动态创建组件变量 局_按钮 = 创建 按钮()运行时按需生成组件
添加到容器容器.添加组件(组件)动态组件挂载
移动方法移动(10,20,"50%","60px")一次性设置位置尺寸
整数与单位文本10 vs "60px"参数类型选择
清空定位定位 = ""子组件交由父布局
子组件遍历取子组件数() + 取子组件(i)容器内组件处理
类型判断对象 类属 单行输入框子类特有属性访问前判断
转弹性布局转为弹性布局("column")绝对布局转纵向弹性
组件迁移改定位 + 调子组件 + 添加到新容器跨容器移动
闭包回调置被单击回调((源对象,事件源)=>{...})动态组件事件绑定
奇偶特判i % 2 == 0循环中差异化样式

相关文档

  • 文档框架基础类_页面 —— 页面级事件
  • 文档框架基础类_视图 —— 通用方法(移动、定位、置被单击回调等)
  • 文档框架基础类_容器视图 —— 容器通用方法(添加组件、取子组件数、取子组件)
  • 文档布局类组件_绝对布局 —— 绝对布局与 转为弹性布局 方法
  • 文档布局类组件_弹性布局 —— 弹性布局的属性与方向
  • 文档列表类组件_垂直滚动框 —— 垂直滚动框的添加组件方法
  • 文档文本类组件_按钮 —— 按钮的属性与事件
  • 文档文本类组件_单行输入框 —— 单行输入框(类型判断目标)
  • 文档选择类组件_单选框 —— 单选框
  • 文档选择类组件_多选框 —— 多选框
  • 文档轻语言网站:循环语句体结构 —— 变量循环计次循环判断循环 的完整说明
  • 文档轻语言网站:轻语言语法速查 —— 关键字、运算符、拉姆达表达式
  • 文档综合演示:网页留言板开发 —— 列表框数据驱动渲染(另一种动态生成模式)
  • 文档综合演示:手机移动端记事本网页开发 —— 列表项动态创建标签
  • 文档轻语言网站:自定义设计列表内容 —— 列表框/宫格框自定义渲染
  • 文档综合演示:MySQL数据库操作 —— 同样使用 取子组件数 遍历子组件

综合演示:XML 定义待办事项列表

文档概述

本演示展示了如何使用 XML 定义界面 + 轻语言编写逻辑的方式,开发一个完整的待办事项(Todo List)应用。涵盖数据持久化(保存配置/读取配置)、列表框数据驱动渲染(置请求加载项目回调)、自定义复合列表项(弹性布局 + 复选框 + 文本 + 删除按钮)、空状态控制、回车键添加等典型场景。

  • 核心功能:添加待办、标记完成、删除待办、统计计数、空状态提示、本地存储持久化
  • 技术亮点
    • 使用 列表框 + 置请求加载项目回调 实现数据驱动渲染
    • 复合列表项:弹性布局嵌套「复选框 + 文本」与「删除按钮」
    • 使用 保存配置/读取配置 实现 localStorage 持久化
    • 键盘事件(回车添加)+ 按钮事件双触发
    • 空状态标签的可视切换

学习目标

阅读本文档后,你应当能够掌握以下内容:

  • .spldg(XML)定义页面布局,包含列表框、编辑框、按钮、标签等组件
  • .spl(轻语言)实现待办列表的增删改查逻辑
  • 使用 保存配置/读取配置 进行本地持久化(localStorage)
  • 使用 JSON解析/JSON编码 在字符串与对象数组之间转换
  • 列表框的「数据填充 + 渲染回调 + 渲染()」三段式数据驱动渲染
  • 在渲染回调中创建复合视图(弹性布局嵌套多组件)
  • 通过 置被单击回调置选中状态被改变回调 注册事件
  • 列表项点击事件中捕获外层 索引(闭包语义)
  • 键盘事件 键盘被按下 + 事件源.key == "Enter" 实现回车提交

涉及组件

组件名称作用参考文档
标签标签_标题标签_统计标签_空状态标题、统计、空状态提示文档文本类组件_标签
编辑框编辑框_输入待办输入待办内容文档文本类组件_编辑框
按钮按钮_添加添加按钮文档按钮类组件_按钮
列表框列表框_待办事项待办列表容器文档列表类组件_列表框
弹性布局代码中 创建 弹性布局()列表项复合根布局文档布局类组件_弹性布局
复选框代码中 创建 单选框()标记完成状态文档选择类组件_单选框
绝对布局根布局页面根布局文档布局类组件_绝对布局

📌 待办列表项的展示视图并非预置组件,而是在 置请求加载项目回调 中动态创建的复合视图:以弹性布局为根,内含「左容器(复选框 + 文本标签)+ 删除按钮」。

涉及函数与关键字

关键字: 变量事件 ... 结束 事件函数 ... 结束 函数如果 ... 否则 ... 结束 如果变量循环 ... 结束循环

列表框方法:

  • 添加项目(数据) —— 向数据集合追加一条数据
  • 添加项目集(数据数组) —— 批量追加一组数据
  • 置请求加载项目回调(回调) —— 设置渲染回调,框架按索引逐项调用取展示视图
  • 渲染() —— 触发按当前数据集合重新渲染
  • 清空() —— 清空数据集合与已渲染视图

渲染回调参数:

  • 项目集合 —— 全部数据集合(数组),通过 项目集合[索引] 取当前项
  • 索引 —— 当前正在渲染的项索引(从 0 开始)

数据持久化:

  • 保存配置(键, 值) —— 保存到 localStorage(值为字符串)
  • 读取配置(键) —— 从 localStorage 读取字符串,不存在返回
  • JSON编码(对象) —— 对象/数组编码为 JSON 字符串
  • JSON解析(文本) —— JSON 字符串解析为对象/数组

组件创建:

  • 创建 弹性布局()创建 单选框()创建 标签()创建 按钮()

视图通用方法/属性:

  • 添加组件(组件)置被单击回调(回调)置选中状态被改变回调(回调)
  • 宽度高度定位方向主轴对齐侧轴对齐内边距间隔
  • 文本字体大小文本颜色字体装饰line-through 删除线)
  • 背景颜色边框圆角可视选中标题

数组操作:

  • 取数组成员数(数组) —— 获取数组长度
  • 添加成员(数组, 值) —— 追加元素
  • 删除成员(数组, 索引) —— 删除指定索引元素

对象操作:

  • 删除对象属性(对象, 属性名) —— 删除对象属性

其它:

  • 弹出提示(文本, 持续毫秒) —— 轻提示
  • 确认框(文本) —— 确认对话框,返回 /
  • 删首尾空(文本) —— 去除首尾空白
  • 取现行时间() —— 当前时间

代办事项页面.spldg

<?xml version="1.0" encoding="utf-8"?>
<页面 标题="待办事项" 宽度="500" 高度="400">
  <绝对布局 名称="根布局" 宽度="100%" 高度="100%">
    <标签 名称="标签_标题" 左边="20" 顶边="20" 宽度="200" 高度="40" 文本="📋 待办事项" 字体大小="22" 文本颜色="#333" />
    <编辑框 名称="编辑框_输入待办" 左边="20" 顶边="70" 宽度="340" 高度="36" 提示文本="输入待办事项,按回车添加" />
    <按钮 名称="按钮_添加" 左边="370" 顶边="70" 宽度="100" 高度="36" 文本="添加" 背景颜色="#52c41a" 文本颜色="#ffffff" />
    <列表框 名称="列表框_待办事项" 左边="20" 顶边="120" 宽度="450" 高度="220" 拉伸内容="假" 分隔线样式="solid" 分隔线颜色="#e8e8e8" />
    <标签 名称="标签_统计" 左边="226" 顶边="20" 宽度="254" 高度="40" 文本="共 0 项" 字体大小="14" 文本颜色="#999" 内容水平对齐方式="靠右" />
    <标签 名称="标签_空状态" 左边="20" 顶边="180" 宽度="450" 高度="61" 文本="🎯 暂无待办事项,添加一条吧!" 字体大小="16" 文本颜色="#ccc" 内容水平对齐方式="居中" 可视="假" />
  </绝对布局>
</页面>

代办事项页面.spl

'* ******************************************************************************
'* 版权说明:Copyright(C) All Rights Reserved VcnStudio
'* 程序版本:V1.0
'* 文件描述:待办事项列表逻辑
'* 修改日志:
'* ******************************************************************************

' ========== 页面变量 ==========
变量 待办列表 = []
变量 列表项组件 = { }  ' 用于存储每个待办项对应的组件,方便删除和更新

' ========== 页面加载事件 ==========
事件 页面加载完毕()
    ' 加载已有数据
    变量 保存的数据 = 读取配置("待办列表")
    如果(保存的数据 != 空)
        待办列表 = JSON解析(保存的数据)
    结束 如果
    列表框_待办事项.添加项目集(待办列表)
    ' 设置列表框的渲染回调
    列表框_待办事项.置请求加载项目回调((项目集合, 索引) => {
        变量 项目数据 = 项目集合[索引]
        ' 创建每个列表项:弹性布局(水平排列)
        变量 项容器 = 创建 弹性布局()
        项容器.宽度 = 430
        项容器.高度 = 36
        项容器.定位 = 相对定位
        项容器.方向 = "row"
        项容器.主轴对齐 = "space-between"
        项容器.侧轴对齐 = "center"
        项容器.内边距 = "4px 8px"
        ' 左侧:复选框 + 文本
        变量 左容器 = 创建 弹性布局()
        左容器.方向 = "row"
        左容器.侧轴对齐 = "center"
        左容器.间隔 = 8
        变量 复选框 = 创建 单选框()
        复选框.选中 = 项目数据.已完成
        复选框.标题 = ""
        复选框.置选中状态被改变回调((源对象, 是否选中) => {
            ' 更新数据状态
            项目数据.已完成 = 是否选中
            待办列表[索引] = 项目数据
            保存配置("待办列表", JSON编码(待办列表))
            更新统计信息()
        })

        变量 文本标签 = 创建 标签()
        文本标签.文本 = 项目数据.内容
        文本标签.字体大小 = 14
        如果(项目数据.已完成)
            文本标签.文本颜色 = "#999"
            文本标签.字体装饰 = "line-through"
        否则
            文本标签.文本颜色 = "#333"
            文本标签.字体装饰 = "none"
        结束 如果

        左容器.添加组件(复选框)
        左容器.添加组件(文本标签)

        ' 右侧:删除按钮
        变量 删除按钮 = 创建 按钮()
        删除按钮.文本 = "×"
        删除按钮.宽度 = 28
        删除按钮.高度 = 28
        删除按钮.背景颜色 = "#ff4d4f"
        删除按钮.文本颜色 = "#ffffff"
        删除按钮.边框圆角 = 4
        删除按钮.置被单击回调((源对象, 事件对象) => {
            删除待办事项(索引)
        })

        项容器.添加组件(左容器)
        项容器.添加组件(删除按钮)

        ' 存储组件引用以便后续更新
        列表项组件[索引] = {
            "容器": 项容器,
            "复选框": 复选框,
            "文本标签": 文本标签
        }

        返回 项容器
    })
    列表框_待办事项.渲染()
    更新统计信息()
结束 事件

' ========== 刷新列表 ==========
函数 刷新列表()
    ' 清空并重新添加数据
    列表框_待办事项.清空()
    变量循环(计次 = 0, 取数组成员数(待办列表), 1)
        列表框_待办事项.添加项目(待办列表[计次])
    结束循环
    列表框_待办事项.渲染()
    ' 更新统计信息和空状态
    更新统计信息()
结束 函数

' ========== 更新统计信息 ==========
函数 更新统计信息()
    变量 总数 = 取数组成员数(待办列表)
    变量 已完成数 = 0
    变量循环(计次 = 0, 总数, 1)
        如果(待办列表[计次].已完成)
            已完成数 = 已完成数 + 1
        结束 如果
    结束循环
    标签_统计.文本 = "共 " + 总数 + " 项,已完成 " + 已完成数 + " 项"
    ' 空状态显示控制
    如果(总数 == 0)
        标签_空状态.可视 = 真
        列表框_待办事项.可视 = 假
    否则
        标签_空状态.可视 = 假
        列表框_待办事项.可视 = 真
    结束 如果
结束 函数

函数 添加代办事项()
    变量 新内容 = 编辑框_输入待办.内容
    如果(删首尾空(新内容) == "")
        弹出提示("请输入待办事项内容")
        返回
    结束 如果
    变量 新事项 = {
        "内容": 新内容,
        "已完成": 假,
        "创建时间": 取现行时间()
    }
    添加成员(待办列表, 新事项)
    保存配置("待办列表", JSON编码(待办列表))
    ' 清空输入框
    编辑框_输入待办.内容 = ""
    ' 刷新列表
    刷新列表()
    弹出提示("✅ 添加成功", 1500)
结束 函数

' ========== 删除待办事项 ==========
函数 删除待办事项(索引)
    变量 确认 = 确认框("确定要删除这条待办事项吗?")
    如果(确认 == 假)
        返回
    结束 如果
    删除成员(待办列表, 索引)
    保存配置("待办列表", JSON编码(待办列表))
    ' 清除组件引用
    删除对象属性(列表项组件, 索引)
    ' 刷新列表
    刷新列表()
    弹出提示("🗑️ 已删除", 1500)
结束 函数

' ========== 添加按钮点击事件 ==========
事件 按钮_添加.被单击(源对象, 事件源)
    添加代办事项()
结束 事件

' ========== 输入框回车事件 ==========
事件 编辑框_输入待办.键盘被按下(源对象,事件源)
    如果(事件源.key == "Enter")
        添加代办事项()
    结束 如果
结束 事件

关键代码解读

1. 数据持久化:保存配置 + JSON 编解码

变量 保存的数据 = 读取配置("待办列表")
如果(保存的数据 != 空)
    待办列表 = JSON解析(保存的数据)
结束 如果
' ...修改后...
保存配置("待办列表", JSON编码(待办列表))
  • 保存配置/读取配置 底层为浏览器 localStorage,只能存字符串
  • 待办列表是对象数组,必须先用 JSON编码 转字符串再保存,读取时用 JSON解析 还原
  • 任何修改(添加/删除/切换完成)后都要重新 保存配置 才能持久化

2. 列表框数据驱动渲染三段式

列表框_待办事项.添加项目集(待办列表)               ' ① 填充数据
列表框_待办事项.置请求加载项目回调((项目集合, 索引) => { ' ② 定义渲染回调
    ' ...创建项容器并返回...
    返回 项容器
})
列表框_待办事项.渲染()                              ' ③ 触发渲染
  • 第①步 添加项目集 批量填数据(也可用循环 添加项目
  • 第②步 置请求加载项目回调 定义每项的展示视图
  • 第③步 渲染() 让框架遍历数据集合,按索引逐项回调取视图并加入 DOM
  • 模型要点:数据与视图分离添加项目 不产生 DOM,必须 渲染() 才触发

3. 复合列表项:弹性布局嵌套

变量 项容器 = 创建 弹性布局()
项容器.方向 = "row"
项容器.主轴对齐 = "space-between"
' 左容器:复选框 + 文本
变量 左容器 = 创建 弹性布局()
左容器.添加组件(复选框)
左容器.添加组件(文本标签)
' 右侧:删除按钮
项容器.添加组件(左容器)
项容器.添加组件(删除按钮)
返回 项容器
  • 列表项根为水平弹性布局(方向 = "row"),用 主轴对齐 = "space-between" 让左容器和删除按钮两端对齐
  • 左容器也是弹性布局,内部 间隔 = 8 让复选框与文本之间留空
  • 复合视图必须以一个根容器返回,不能返回多个组件

4. 嵌套闭包中的索引捕获

列表框_待办事项.置请求加载项目回调((项目集合, 索引) => {
    变量 复选框 = 创建 单选框()
    复选框.置选中状态被改变回调((源对象, 是否选中) => {
        待办列表[索引] = 项目数据          ' 引用外层 索引
    })
    变量 删除按钮 = 创建 按钮()
    删除按钮.置被单击回调((源对象, 事件对象) => {
        删除待办事项(索引)                  ' 引用外层 索引
    })
    返回 项容器
})
  • 内层回调引用外层渲染回调的 索引 参数
  • 用户点击时外层回调早已返回,依赖拉姆达按调用时的值捕获(类似 JS let 语义)
  • 每次渲染回调调用时 索引 独立,因此每项的点击都能取到正确序号
  • ⚠️ 注意:若后续调用 刷新列表() 重新渲染,新回调会绑定新的 索引;旧的已销毁视图不会触发

5. 列表项组件引用缓存

变量 列表项组件 = { }   ' 页面变量
' 渲染回调内
列表项组件[索引] = {
    "容器": 项容器,
    "复选框": 复选框,
    "文本标签": 文本标签
}
' 删除时
删除对象属性(列表项组件, 索引)
  • 用对象 列表项组件 按索引缓存每项的组件引用,方便后续直接访问
  • 删除待办时同步清除缓存,避免内存泄漏与脏引用

6. 切换完成状态的视图更新策略

复选框.置选中状态被改变回调((源对象, 是否选中) => {
    项目数据.已完成 = 是否选中
    待办列表[索引] = 项目数据
    保存配置("待办列表", JSON编码(待办列表))
    更新统计信息()
})
  • 切换完成状态时,更新数据 + 持久化 + 刷新统计
  • 文本标签的删除线/颜色样式是在渲染回调中根据 项目数据.已完成 初始设置的
  • ⚠️ 注意:此处没有调用 刷新列表() 重新渲染整列,因此切换完成后文本的删除线样式不会立即变化。若需立即变化,可在此回调中直接操作缓存的 文本标签
复选框.置选中状态被改变回调((源对象, 是否选中) => {
    项目数据.已完成 = 是否选中
    待办列表[索引] = 项目数据
    保存配置("待办列表", JSON编码(待办列表))
    ' 直接更新已缓存的文本标签样式(即时生效)
    变量 缓存项 = 列表项组件[索引]
    如果(是否选中)
        缓存项.文本标签.文本颜色 = "#999"
        缓存项.文本标签.字体装饰 = "line-through"
    否则
        缓存项.文本标签.文本颜色 = "#333"
        缓存项.文本标签.字体装饰 = "none"
    结束 如果
    更新统计信息()
})

7. 空状态与列表可视切换

如果(总数 == 0)
    标签_空状态.可视 = 真
    列表框_待办事项.可视 = 假
否则
    标签_空状态.可视 = 假
    列表框_待办事项.可视 = 真
结束 如果
  • 可视 属性控制组件显示/隐藏(底层为 display 切换)
  • 空状态标签 .spldg 中初始 可视="假",加载时根据数据动态切换

8. 回车键添加

事件 编辑框_输入待办.键盘被按下(源对象,事件源)
    如果(事件源.key == "Enter")
        添加代办事项()
    结束 如果
结束 事件
  • 键盘事件通过 事件源.key 判断按键("Enter" 是回车键的标准 key 值)
  • 按钮_添加.被单击 共用同一个 添加代办事项() 函数,避免逻辑重复

注意事项

  • 持久化需 JSON 编解码保存配置 只能存字符串,对象数组必须 JSON编码 后存、JSON解析 后取。
  • 渲染回调必须返回视图:若不 返回 视图组件,对应项不会显示。
  • 闭包索引捕获:内层回调引用外层 索引 依赖拉姆达按值捕获语义;若遇异常应改用参数绑定或缓存对象。
  • 切换状态即时更新:仅修改数据不重新渲染时,视图样式不会自动更新;如需即时变化,直接操作缓存的组件实例。
  • 循环边界语义变量循环(计次 = 0, 取数组成员数(待办列表), 1) 等效于 for(i=0; i<长度; i++),即 计次 < 目标值 时循环、达到目标值退出,左闭右开区间,遍历数组正好不越界。
  • 删除索引同步删除成员(待办列表, 索引) 后必须刷新列表重新渲染,否则渲染回调中绑定的旧索引会错位。
  • .spldg.spl 成对:两个文件名称必须相同且同时存在,组件通过 名称 属性在 .spl 中被引用。
  • 弹出提示 字符变体:本文档统一使用 弹出提示,不同文档中可能存在 弹出提示 等字符显示差异,实际为同一函数。

学习要点总结

知识点关键代码适用场景
数据持久化保存配置(键,值) + 读取配置(键)localStorage 存取
JSON 编解码JSON编码(对象) / JSON解析(文本)对象与字符串转换
批量填数据添加项目集(数组)一次性加入多项
数据驱动渲染置请求加载项目回调 + 渲染()列表项自定义展示
复合列表项弹性布局嵌套多组件复杂列表项
主轴对齐主轴对齐 = "space-between"两端对齐
嵌套闭包内层回调引用外层 索引项点击事件
组件引用缓存列表项组件[索引] = {...}后续直接访问
空状态切换可视 = 真/假空列表提示
数组操作添加成员/删除成员/取数组成员数列表数据维护
键盘事件键盘被按下 + 事件源.key回车提交
删除线样式字体装饰 = "line-through"已完成态标记

相关文档

  • 文档列表类组件_列表框 —— 列表框完整属性与方法
  • 文档布局类组件_弹性布局 —— 弹性布局方向、对齐、间隔
  • 文档布局类组件_绝对布局 —— 绝对布局作为根布局
  • 文档文本类组件_标签 —— 标签属性
  • 文档文本类组件_编辑框 —— 编辑框与提示文本、键盘事件
  • 文档按钮类组件_按钮 —— 按钮属性
  • 文档选择类组件_单选框 —— 单选框/复选框与选中回调
  • 文档前端(JavaScript)函数_存储配置 —— 保存配置/读取配置
  • 文档前端(JavaScript)函数_JSON —— JSON编码/JSON解析
  • 文档前端(JavaScript)函数_数组 —— 添加成员/删除成员/取数组成员数
  • 文档轻语言网站:循环语句体结构 —— 变量循环计次循环 说明
  • 文档轻语言网站:变量与数组与对象的定义 —— 变量、数组、对象、拉姆达
  • 文档轻语言网站:自定义设计列表内容 —— 列表框/宫格框渲染基础
  • 文档综合演示:网页留言板开发 —— 列表框数据驱动渲染示例
  • 文档综合演示:手机移动端记事本网页开发 —— 移动端列表+本地存储示例
  • 文档轻语言网站:界面XML定义规范 —— .spldg XML 写法规范

综合演示:公用模块、全局变量、全局函数、及使用外部CDN库演示

本示例展示如何使用全局公用模块,项目内自定义中文脚本资源文件、全局封装函数复用,跨页面使用函数、以及使用外部CDN库、网络资源库。

关于“引用”关键字

在轻语言中,引用 关键字用于引入外部脚本文件,支持以下三种场景:

引用类型示例说明
项目内 JSX 脚本引用 "公用模块1.jsx"引入项目中自定义的中文脚本文件
外部 CDN 库引用 "https://code.jquery.com/jquery-1.12.4.min.js"引入网络上的第三方库
后端 PHP 文件引用 "static/lib.php"在后端 API 接口中引入 PHP 文件

编译时,在网页前端 引用 "xxx.jsx" 会被转换为标准的 <script src="xxx.js"> 标签,在 PHP 后端会转换为标准的 include "/file.php" 语句。

定义并使用公用脚本全局函数、全局变量

公用模块1.jsx

' ****************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 文件描述:公用模块,定义全局变量和函数,供整个应用复用
' 修改日志:
' ****************************************************************************

' 全局变量:在整个应用中可直接访问
变量 公用模块1_网站URL = "http://www.vcnstudio.com"

' 全局函数:在整个应用中可直接调用
函数 公用模块1_计算乘法(参数一, 参数二)
    返回 参数一 * 参数二
结束 函数

' 带参数校验的全局函数
函数 公用模块1_计算除法(被除数, 除数)
    如果(除数 == 0)
        返回 0
    结束 如果
    返回 被除数 / 除数
结束 函数

测试公用模块页面.spl

' ****************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 窗口描述:测试页面
' ****************************************************************************

' 引用项目中的公用模块
引用 "公用模块1.jsx"

事件 页面加载完毕()
    标签1.文本 = "页面加载完毕,欢迎使用 VcnStudio!"
结束 事件

事件 按钮1.被单击(来源对象, 事件源)
    ' 调用公用模块中的变量和函数
    调试输出("网站URL:" + 公用模块1_网站URL)
    调试输出("3 × 20 = " + 公用模块1_计算乘法(3, 20))
    调试输出("100 ÷ 4 = " + 公用模块1_计算除法(100, 4))
结束 事件

引用外部CDN库示例

' 引用 jQuery 库
引用 "https://code.jquery.com/jquery-1.12.4.min.js"

' 引用 Axios 库
引用 "https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"

事件 按钮1.被单击(来源对象,事件源)
    ' 使用 jQuery 操作组件 
    $(标签1.取原生对象()).text("jQuery 修改文本成功!")

    ' 使用 axios 发送请求
    axios.get("/api/data").then((响应) => {
        调试输出(响应.data)
    })
结束 事件

跨页面共享数据

公用模块2.jsx

公用模块2.jsx 中定义全局变量,可以实现跨页面数据共享:

变量 公用模块2_全局登录状态 = 假
变量 公用模块2_全局用户信息 = 空

函数 公用模块2_设置登录状态(状态, 用户信息)
    公用模块2_全局登录状态 = 状态
    公用模块2_全局用户信息 = 用户信息
    保存配置("用户信息", JSON编码(用户信息))
结束 函数

函数 公用模块2_取登录状态()
    返回 公用模块2_全局登录状态
结束 函数

登录页面.spl

引用 "公用模块2.jsx"

' 登录页面中设置
事件 按钮_登录.被单击(源对象, 事件源)
    公用模块2_设置登录状态(真, {"姓名":"张三", "角色":"管理员"})
    切换页面("首页")
结束 事件

首页.spl

' 首页 页面中读取
事件 页面加载完毕()
    如果(公用模块2_取登录状态())
        标签1.文本 = "欢迎," +公用模块2_全局用户信息.姓名
    否则
        切换页面("登录页")
    结束 如果
结束 事件

⚠️ 注意事项

  1. 全局变量和函数不可重复声明:在多个 .jsx 文件中不能声明同名的全局变量或函数,否则后声明的会覆盖先声明的。
  2. 建议添加前缀:为了避免命名冲突,建议在全局变量和函数名前添加模块名前缀,例如 公用模块1_网站URL公用模块1_计算乘法
  3. 引用顺序:如果多个模块之间互相依赖,需要确保引用顺序正确,被依赖的模块先引用。
  4. 作用域:在模块中声明的全局变量和函数,在整个应用中都可以访问,不需要额外导出。

学习要点

通过本综合演示,你可以学习到以下轻语言模块化开发技术:

知识点代码位置说明
引用关键字引用 "公用模块1.jsx"引入项目内 .jsx 中文脚本文件,编译时转换为 <script src="xxx.js">
外部 CDN 库引用引用 "https://code.jquery.com/jquery-1.12.4.min.js"引入网络第三方库,编译时同样转为 <script> 标签,可在前端直接调用 jQuery 等对象
后端 PHP 引用引用 "static/lib.php".sph 后端脚本中引入 PHP 文件,编译时转换为标准 include 语句
全局变量定义变量 公用模块1_网站URL = "http://www.vcnstudio.com".jsx 文件顶层用 变量 声明即可成为全局变量,所有页面共享
全局函数定义函数 公用模块1_计算乘法(参数一, 参数二).jsx 文件顶层用 函数 声明即可成为全局函数
跨页面共享数据公用模块2_全局登录状态在模块中声明的全局变量在多页面之间共享,无需额外导出
持久化存储保存配置("用户信息", JSON编码(用户信息))使用 localStorage 存储用户数据,配合 JSON编码/JSON解析 序列化对象
读取持久化数据JSON解析(读取配置("用户信息", "{}"))读取 localStorage 中的字符串并用 JSON解析 还原为对象
原生对象调用$(标签1.取原生对象()).text("xxx")在轻语言中通过 取原生对象() 拿到 DOM 节点,再用 jQuery 等原生库操作
页面跳转切换页面("首页")在事件中跳转到指定名称的页面

扩展方向

你可以基于本演示继续扩展以下功能:

  • 网络请求统一封装:在 .jsx 中封装一个全局函数 网络请求_带Token(接口,参数,回调),自动在请求头携带登录凭证
  • 路由守卫:在每个受保护页面 页面加载完毕 事件中调用 公用模块2_取登录状态(),未登录则跳转登录页
  • 多语言支持:在 lang.zh.jsxlang.en.jsx 中定义语言键值对,根据用户选择切换语言
  • 主题切换:使用 保存配置("主题","dark") 保存用户选择,在 页面加载完毕 时动态切换 CSS 变量
  • 数据缓存:使用 读取配置/保存配置 缓存首页轮播图、商品列表等高频数据,减少网络请求
  • 接口拦截器:基于 Axios 封装全局响应拦截器,统一处理 401 跳转登录、500 错误提示

💡 相关文档:本演示中使用的 保存配置/读取配置 函数用法请参考文档轻语言网站:变量与数组与对象的定义;网络请求相关函数(发送GET请求发送POST数据请求接口)请参考文档轻语言网站:发送网络请求与接口请求;与原生 JS 集成开发请参考文档轻语言网站:与原生JS混合开发;界面 XML 标签和属性定义请参考文档轻语言网站:界面XML定义规范

综合演示:手机移动端记事本网页开发

文档概述

本例程演示如何使用轻语言开发一个手机移动端记事本网站,覆盖三个页面(欢迎页、笔记列表页、撰写笔记页)的页面跳转、参数传递、移动端布局适配、列表渲染、延时执行等典型移动端开发知识点。整个项目仅由前端页面构成,使用模拟数据,不依赖后端服务。

💡 本演示在 .spldg 中通过 类型="wap" 指定页面为移动端类型;运行时请在浏览器开发者工具中将设备模式切换为手机(移动端)以查看效果。

学习目标

阅读本文档后,你应当能够掌握以下内容:

  • 移动端页面声明:在 .spldg 中为 <页面> 节点设置 类型="wap"
  • 多页面跳转:切换页面(目标页面, 参数)后退页面()
  • 跨页面参数传递与接收:切换页面("...", "id=1")取请求参数()
  • 顶部固定标题栏的实现:定位 = "fixed" + 显示层级
  • 右下角悬浮按钮的实现:使用 CSS calc() 结合 vh/vw 视口单位
  • 延时执行:延时执行(回调, 毫秒) 实现欢迎页倒计时跳转
  • 批量布局函数:批量赋值置组件水平居中置组件居中
  • 列表框的数据驱动渲染(与留言板演示同源)

涉及组件

本演示实际使用到的组件如下(按代码出现顺序):

组件名称作用参考文档
页面<页面 类型="wap">移动端页面根容器文档框架基础类_页面
绝对布局<绝对布局>父级定位容器文档布局类组件_绝对布局
标签<标签>顶部固定标题栏、欢迎语文档文本类组件_标签
列表框<列表框>笔记列表展示文档列表类组件_列表框
图片框<图片框>右下角悬浮书写图标、返回图标文档图像类组件_图片框
单行输入框<单行输入框>输入笔记标题文档文本类组件_单行输入框
编辑框<编辑框>输入笔记正文文档文本类组件_编辑框
按钮<按钮>提交保存文档文本类组件_按钮

📌 原文档列出的「列表框选项」「列表框选项标签」在本演示代码中并未出现——列表项是通过 置请求加载项目回调创建 标签() 动态生成的,与留言板演示同源。详见后文「关键代码解读」。

涉及函数与关键字

以下为本演示代码中出现的轻语言关键字与内置函数:

关键字: 变量事件 ... 结束 事件函数 ... 结束 函数变量循环 ... 结束循环如果 ... 结束 如果创建返回

全局函数(页面跳转与参数):

  • 切换页面(页面名称, 数据值) —— 切换到指定页面,可携带键值对参数(如 "id=1"
  • 后退页面() —— 返回上一页(基于浏览器 history)
  • 取请求参数() —— 取得从上一页面切换过来时传递的参数,返回对象

全局函数(布局与延时):

  • 置组件居中(...视图组件) —— 让组件在页面中水平+垂直居中
  • 置组件水平居中(...视图组件) —— 让组件在页面中水平居中
  • 批量赋值(属性名称, 目标值, ...视图组件) —— 批量给多个组件的同一属性赋值
  • 延时执行(子函数, 等待时间) —— 在指定毫秒后执行一次回调

组件方法(视图类通用):

  • 移动(左边, 顶边, 宽度, 高度) —— 一次性设置组件位置与尺寸
  • 置被单击回调(回调) —— 设置被单击的回调
  • 顶边对齐到底(目标组件, 偏移量) —— 顶边对齐到目标组件底边
  • 追加内联样式(样式文本) —— 追加 CSS 内联样式

列表框方法:

  • 添加项目(数据对象) —— 追加一条数据
  • 置请求加载项目回调(回调) —— 设置渲染回调
  • 渲染() —— 触发渲染
  • 拉伸内容 = 真 —— 隐藏滚动条、内容全部展开

程序结构与页面导航流

本项目由三个成对的页面文件组成:

欢迎页面.spldg + 欢迎页面.spl     ← 启动页,延时 1.5 秒后跳转列表页
笔记列表页.spldg + 笔记列表页.spl ← 笔记列表,点击项或书写图标跳转撰写页
撰写笔记页.spldg + 撰写笔记页.spl ← 笔记编辑,点击返回图标或保存后后退

页面跳转与参数传递流程:

欢迎页面 ──(延时 1.5s, 无参数)──> 笔记列表页
                                      │
                                      ├──(图片框1 被单击, 无参数)──> 撰写笔记页
                                      │
                                      └──(列表项被单击, "id=N")──> 撰写笔记页
                                                                    │
                                                                    └──(图片框1/按钮1 保存)──后退--> 笔记列表页

撰写笔记页 中通过 取请求参数() 取得 id 字段,用于从接口取回原笔记内容回填到编辑框(本演示为模拟数据)。

数据模型

列表项数据结构:

变量 项目对象 = { }
项目对象.标题 = "这是笔记标题" + i

跨页面传递参数采用键值对文本,接收时取对象属性:

' 传递:切换页面("撰写笔记页","id=" + 被单击索引)
' 接收:变量 参数值 = 取请求参数()
'       调试输出(参数值.id)

程序源代码

欢迎页面.spldg

<?xml version="1.0" encoding="utf-8"?>
<页面 标题="页面标题" 宽度="320" 高度="600" 类型="wap">
  <绝对布局 名称="根布局">
    <标签 名称="标签1" 左边="51" 顶边="128" 高度="52" 宽度="219" 文本="欢迎使用手机端网页笔记" 内容水平对齐方式="center" />
  </绝对布局>
</页面>

欢迎页面.spl

' ****************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 程序作者:
' 联系信息:
' 窗口描述:默认首页。
' ****************************************************************************

' ****************************************************************************
' 注意:
'         运行本程序后,请在浏览器中将设备模式调整为手机(移动端)模式
' ****************************************************************************

' 页面变量,整个页面都能使用
变量 页面变量 = "首页"

事件 页面加载完毕()
    置组件居中(标签1)
    ' 等待 1.5 秒后切换到笔记列表页面
    延时执行(()=>{
        切换页面("笔记列表页")
    },1500)
结束 事件

笔记列表页.spldg

<?xml version="1.0" encoding="utf-8"?>
<页面 标题="页面标题" 宽度="320" 高度="600" 类型="wap">
  <绝对布局 名称="根布局">
    <标签 名称="标签1" 左边="3" 顶边="0" 高度="40" 宽度="314" 文本="笔记列表" 背景颜色="#408127" 文本颜色="#ffffff" />
    <列表框 名称="列表框1" 左边="3" 顶边="92" 高度="127" 宽度="141" />
    <图片框 名称="图片框1" 左边="252" 顶边="261" 高度="50" 宽度="50" 图片="static/write.png" />
  </绝对布局>
</页面>

笔记列表页.spl

' ****************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 文件描述:
' 修改日志:
' ****************************************************************************

' 页面变量,整个页面都能使用
变量 页面变量 = "新页面"

事件 页面加载完毕()
    ' 让标签1作为顶部标题,且固定
    标签1.内容水平对齐方式 = "center"
    标签1.移动(0,0,"100%","50px")
    标签1.定位 = "fixed"
    标签1.显示层级 = "998"
    ' 让标题文字垂直居中
    标签1.行高 = "50px"
    ' 调整列表框布局和书写图标
    列表框1.移动(0,"50px","100%","100%")
    ' 书写小图标;宽高为 50px
    ' 顶边设置为:页面高度 - 100px ,左边为 页面宽度 - 100px
    ' 这样可以让小图标位于页面的右下角,这里的 calc 是一个CSS内置计算函数,具体使用可自行网上查询
    图片框1.顶边 = "calc(100vh - 100px)"
    图片框1.左边 = "calc(100vw - 100px)" 
    ' 设置显示层级到最上边,这样不会被列表框的内容遮盖
    图片框1.显示层级 = 999
    ' 设置定位为 fixed 固定,这样小图标不会随着页面移动
    图片框1.定位 = "fixed"
    ' 初始化列表框
    初始化笔记列表()
结束 事件

函数 初始化笔记列表()
    列表框1.拉伸内容 = 真
    ' 模拟添加一些项目数据
    变量循环(i = 0,30,1)
        变量 项目对象 = { }
        项目对象.标题 = "这是笔记标题" + i
        列表框1.添加项目(项目对象)
    结束循环
    ' 设置监听加载项目时,每个项目的渲染布局排版内容
    列表框1.置请求加载项目回调((项目集合,索引)=>{
        变量 标题标签 = 创建 标签()
        标题标签.字体大小 = "14px"
        标题标签.内边距 = "10px"
        标题标签.文本 = 项目集合[索引].标题
        标题标签.置被单击回调(()=>{
            列表项目被单击(索引)
        })
        返回 标题标签
    })
    列表框1.渲染()
结束 函数

函数 列表项目被单击(被单击索引)
    调试输出("项目被单击:" + 被单击索引)
    ' 切换页面时,将目标索引或笔记ID传递给撰写笔记页面
    ' 在撰写笔记页面,取出传递的ID,然后获取笔记、并将其笔记内容设置到编辑框中
    切换页面("撰写笔记页","id=" + 被单击索引)
结束 函数

事件 图片框1.被单击(源对象,事件源)
    切换页面("撰写笔记页")
结束 事件

撰写笔记页.spldg

<?xml version="1.0" encoding="utf-8"?>
<页面 标题="页面标题" 宽度="320" 高度="706" 类型="wap">
  <绝对布局 名称="根布局">
    <单行输入框 名称="单行输入框1" 左边="15" 顶边="70" 高度="43" 宽度="288" 提示文本="请输入笔记标题" />
    <编辑框 名称="编辑框1" 左边="15" 顶边="136" 高度="431" 宽度="287" 提示文本="请输入笔记内容" />
    <按钮 名称="按钮1" 左边="15" 顶边="593" 高度="42" 宽度="286" 文本="提交" 背景颜色="#408127" 文本颜色="#FFFFFF" />
    <标签 名称="标签1" 左边="0" 顶边="0" 高度="43" 宽度="320" 背景颜色="#408127" 文本颜色="#ffffff" 文本="撰写笔记" />
    <图片框 名称="图片框1" 左边="3" 顶边="1" 高度="42" 宽度="49" 图片="static/back.png" />
  </绝对布局>
</页面>

撰写笔记页.spl

' ****************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 文件描述:
' 修改日志:
' ****************************************************************************

' 页面变量,整个页面都能使用
变量 页面变量 = "新页面"

事件 页面加载完毕()
    初始化调整页面布局()
    ' 获取上个页面传递过来的数据
    变量 参数值 = 取请求参数()
    如果(参数值 != 空)
        ' 这里返回的参数值为一个对象,例如:上个窗口传递的为 id = 1
        ' 那么这里就能直接通过这个参数值调用 id 这个字段
        调试输出(参数值)
        ' 输出id的值
        调试输出(参数值.id)
        ' 根据 id 查询接口获取当前笔记内容、并将其设置到编辑框中
        ' 例如:这里模拟设置
        单行输入框1.内容 = "笔记标题:" + 参数值.id
        编辑框1.内容 = "笔记内容:" + 参数值.id
    结束 如果

结束 事件

函数 初始化调整页面布局()
    ' 与列表页一样,使用标签作为标题栏并固定
    标签1.内容水平对齐方式 = "center"
    标签1.移动(0,0,"100%","50px")
    标签1.定位 = "fixed"
    标签1.显示层级 = "98"
    标签1.行高 = "50px"
    ' 调整返回图标按钮,注意这里:标题栏高度为 50 ,当设置图标为30时
    ' 则剩余空间为 20 ,左边、顶边设置 10 ,即可上下居中
    图片框1.移动(10,10,"30px","30px")
    图片框1.显示层级 = "99" ' 注意小细节哦,显示层级必须在标签标题上面
    ' 批量设置编辑框、按钮宽度为90%
    批量赋值("宽度","90%",单行输入框1,编辑框1,按钮1)
    ' 然后再批量设置将其在页面中水平居中
    置组件水平居中(单行输入框1,编辑框1,按钮1)
    ' 将按钮1调整到编辑框1底部
    按钮1.顶边对齐到底(编辑框1,10)
结束 函数

事件 按钮1.被单击(源对象,事件源)
    如果(单行输入框1.内容 == "")
        弹出提示("笔记标题不能为空")
        返回
    结束 如果
    如果(编辑框1.内容 == "")
        弹出提示("笔记内容不能为空")
        返回
    结束 如果
    ' 请求接口保存数据
    弹出提示("保存数据...")
    延时执行(()=>{
        后退页面()
    },1500)
结束 事件

事件 图片框1.被单击(源对象,事件源)
    后退页面()
结束 事件

关键代码解读

1. 移动端页面声明:类型="wap"

<页面 标题="页面标题" 宽度="320" 高度="600" 类型="wap">

.spldg 中为 <页面> 节点设置 类型="wap" 即声明该页面为移动端类型,框架会据此适配移动端视口(viewport)、缩放策略等。运行前需在浏览器开发者工具中将设备模式切换为手机查看效果。

2. 顶部固定标题栏的实现

标签1.移动(0,0,"100%","50px")
标签1.定位 = "fixed"
标签1.显示层级 = "998"
标签1.行高 = "50px"
  • 移动(0,0,"100%","50px") 一次性设置:左边 0、顶边 0、宽度 100%、高度 50px
  • 定位 = "fixed" 让标题栏相对视口固定,不随页面滚动
  • 显示层级 = "998" 提高层级避免被列表内容遮挡
  • 行高 = "50px" 与高度一致,使文字垂直居中

3. 右下角悬浮按钮:calc + 视口单位

图片框1.顶边 = "calc(100vh - 100px)"
图片框1.左边 = "calc(100vw - 100px)"
图片框1.显示层级 = 999
图片框1.定位 = "fixed"
  • 100vh 为视口高度、100vw 为视口宽度(与留言板演示中 80vw 同源)
  • calc(100vh - 100px) 即「视口高度减去 100px」,让 50×50 的图标距底/距右各 50px
  • 配合 定位 = "fixed" 实现不随滚动消失的悬浮效果
  • 显示层级 = 999 高于标题栏的 998,保证不被遮挡

4. 欢迎页延时跳转

延时执行(()=>{
    切换页面("笔记列表页")
},1500)
  • 延时执行(回调, 毫秒) 类似 JavaScript 的 setTimeout,仅执行一次
  • 返回值是时钟 ID,可用 销毁延时执行(ID) 取消(本演示未用到)
  • 适合做启动页倒计时、保存成功后延时返回等场景

5. 跨页面参数传递与接收

传递(笔记列表页):

' 无参数跳转
切换页面("撰写笔记页")
' 带参数跳转,参数为键值对文本
切换页面("撰写笔记页","id=" + 被单击索引)

接收(撰写笔记页):

变量 参数值 = 取请求参数()
如果(参数值 != 空)
    调试输出(参数值.id)
结束 如果
  • 切换页面 的第二个参数是键值对字符串(如 "id=1"),可携带多个参数("id=1&name=test"
  • 取请求参数() 返回对象,直接通过 参数值.字段名参数值["字段名"] 访问
  • 无参数跳转时 取请求参数() 返回 ,需判空处理

6. 批量布局函数

批量赋值("宽度","90%",单行输入框1,编辑框1,按钮1)
置组件水平居中(单行输入框1,编辑框1,按钮1)
  • 批量赋值(属性名称, 目标值, ...组件) 给多个组件的同一属性赋同一值
  • 置组件水平居中(...组件) 让多个组件在页面中水平居中
  • 与留言板演示的 置组件宽度 相比,批量赋值 更通用(可设置任意属性)

7. 列表框数据驱动渲染(与留言板同源)

列表框1.置请求加载项目回调((项目集合,索引)=>{
    变量 标题标签 = 创建 标签()
    标题标签.字体大小 = "14px"
    标题标签.内边距 = "10px"
    标题标签.文本 = 项目集合[索引].标题
    标题标签.置被单击回调(()=>{
        列表项目被单击(索引)
    })
    返回 标题标签
})
列表框1.渲染()

要点:

  • 「数据集合 + 渲染回调」分离式渲染,详见文档综合演示:网页留言板开发
  • 注意:回调内 索引 是闭包捕获的,循环中需保证每次迭代都拿到当前值(轻语言此处按值捕获)
  • 列表项是 创建 标签() 动态生成的标签组件,并通过 置被单击回调 注册点击事件
  • 点击列表项后携带 id 参数跳转到撰写笔记页

8. 保存成功后延时返回

事件 按钮1.被单击(源对象,事件源)
    ' ...非空校验...
    弹出提示("保存数据...")
    延时执行(()=>{
        后退页面()
    },1500)
结束 事件
  • 弹出提示("保存数据...") 给用户即时反馈
  • 延时执行 1.5 秒后调用 后退页面() 返回上一页
  • 后退页面() 基于浏览器 history,与 切换页面 不同——切换页面是压栈新页面,后退页面是弹出当前页

注意事项

  • 运行前切换设备模式:本演示为移动端页面(类型="wap"),在 PC 浏览器中需按 F12 切换为手机模式查看效果。
  • 数据为模拟:列表中的 30 条项目与「根据 id 取笔记内容」均为模拟数据,生产环境需通过 请求接口 调用后端 .sph 接口获取真实数据(参考文档综合演示:MySQL数据库操作)。
  • calc 函数:是浏览器原生 CSS 函数,支持四则运算,注意 +- 运算符两侧必须有空格,否则无效。
  • fixed 定位与 显示层级:使用 fixed 固定组件时,必须设置足够高的 显示层级(如 998/999),否则会被普通流内容遮挡。
  • 闭包变量捕获:在 变量循环 中创建多个组件并绑定回调时,索引 变量的捕获行为需注意——轻语言此处按值捕获,每次迭代得到独立值。
  • 跨页面参数格式切换页面 的第二参数必须是键值对文本(如 "id=1"),不能直接传对象或 JSON 字符串。
  • 后退页面() vs 切换页面后退页面 基于浏览器 history 返回上一页,而 切换页面 是跳转到指定页面;两者适用场景不同。

学习要点总结

知识点关键代码适用场景
移动端页面声明类型="wap"手机网站
顶部固定标题栏定位="fixed" + 显示层级 + 行高移动端通用导航栏
悬浮按钮calc(100vh-100px) + fixed写作/返回顶部按钮
延时执行延时执行(回调, 毫秒)启动页跳转、保存后返回
页面跳转切换页面(目标, 参数)多页面导航
后退页面后退页面()返回上一页
跨页面参数传递切换页面("...", "id=1")取请求参数()详情页跳转
批量赋值批量赋值("宽度","90%",...)多组件统一样式
水平居中置组件水平居中(...组件)多组件统一对齐
完全居中置组件居中(...组件)启动页 logo 居中
列表渲染置请求加载项目回调 + 渲染()数据驱动列表
闭包回调标题标签.置被单击回调(()=>{...})列表项点击

相关文档

  • 文档框架基础类_页面 —— 页面级事件与 类型="wap" 属性
  • 文档框架基础类_视图 —— 通用方法(移动、定位、显示层级等)
  • 文档布局类组件_绝对布局 —— 绝对布局的使用
  • 文档文本类组件_标签 —— 标签组件(标题栏)
  • 文档文本类组件_编辑框 —— 编辑框的属性与方法
  • 文档文本类组件_单行输入框 —— 单行输入框(标题输入)
  • 文档文本类组件_按钮 —— 按钮的属性与事件
  • 文档图像类组件_图片框 —— 图片框(悬浮按钮、返回图标)
  • 文档列表类组件_列表框 —— 列表框的完整属性与方法
  • 文档前端(JavaScript)函数_窗口操作 —— 切换页面取请求参数置组件居中批量赋值
  • 文档前端(JavaScript)函数_历史类 —— 后退页面 的说明
  • 文档前端(JavaScript)函数_时钟类 —— 延时执行销毁延时执行
  • 文档轻语言网站:轻语言语法速查 —— 关键字、流程控制、拉姆达表达式
  • 文档轻语言网站:循环语句体结构 —— 变量循环 的用法
  • 文档综合演示:网页留言板开发 —— 列表框数据驱动渲染的同源示例
  • 文档综合演示:XML 定义待办事项列表演示 —— 另一个列表渲染示例
  • 文档综合演示:MySQL数据库操作 —— 后端接口与真实数据持久化方案

综合演示:网站页面事件的监听与处理

文档概述

本例程演示如何监听轻语言 web 框架中页面级的生命周期事件与浏览器事件,包括:页面加载完毕、页面解析完毕、窗口尺寸改变、页面内容滚动、页面即将被关闭、页面被关闭、页面发生错误、页面获得/失去焦点等。这些事件覆盖了网页运行过程中最重要的几个时机,是初始化逻辑、资源清理、用户离开提示、响应式布局、错误监控的基础。

学习目标

阅读本文档后,你应当能够掌握以下内容:

  • 轻语言页面级事件的命名规则与触发时机
  • 页面加载完毕页面解析完毕 的区别与用途
  • 窗口尺寸被改变 事件配合 取窗口宽度/取窗口高度 实现响应式
  • 页面内容被滚动 事件的监听
  • 页面即将被关闭 事件中通过 事件源.preventDefault() 阻止关闭
  • 页面被关闭页面即将被关闭 的先后关系
  • 页面发生错误页面获得焦点页面失去焦点 的用途
  • 在 IDE 中添加页面事件的两种方式(右键菜单 / Ctrl + E 快捷键)

涉及组件

组件名称作用参考文档
绝对布局根布局页面根布局容器文档布局类组件_绝对布局
标签标签1显示事件触发信息文档文本类组件_标签
按钮按钮1测试交互文档按钮类组件_按钮

涉及函数与关键字

关键字: 事件 ... 结束 事件

页面级事件:

事件名触发时机是否可阻止参考文档
页面加载完毕页面所有资源(含图片等)加载完成文档页面事件_页面加载完毕
页面解析完毕DOM 解析完成(早于加载完毕)文档页面事件_页面解析完毕
窗口尺寸被改变浏览器窗口尺寸变化文档页面事件_窗口尺寸被改变
页面内容被滚动页面滚动条被滚动文档页面事件_页面内容被滚动
页面即将被关闭用户尝试离开/关闭页面(可阻止)文档页面事件_页面即将被关闭
页面被关闭页面确认被关闭后文档页面事件_页面被关闭
页面发生错误页面脚本发生错误文档页面事件_页面发生错误
页面获得焦点页面获得焦点(切回当前标签)文档页面事件_页面获得焦点
页面失去焦点页面失去焦点(切换到其他标签/窗口)文档页面事件_页面失去焦点

事件参数:

  • 事件源 —— 部分事件可接收事件源对象,提供 preventDefault()returnValue 等原生 DOM API

窗口信息函数:

  • 取窗口宽度() —— 获取浏览器视口宽度
  • 取窗口高度() —— 获取浏览器视口高度

调试函数:

  • 调试输出(内容) —— 控制台输出
  • 置页面标题(文本) —— 修改浏览器标签栏标题(见贪吃蛇演示示例用法)

如何添加页面事件

在轻语言 IDE 中,添加页面事件有两种方式:

  1. 右键菜单:在 .spl 文件空白处右键 → 单击「单击事件」菜单项(实际为"添加事件"菜单)
  2. 快捷键:在 .spl 文件编辑区按下 Ctrl + E

💡 页面事件无需绑定具体组件,事件名以 页面窗口 开头,直接在 .spl 顶层定义即可。

程序源码

测试页面.spldg

<页面 标题="页面标题" 宽度="500" 高度="300">
	<绝对布局 名称="根布局" >
	  <标签 名称="标签1" 左边="12" 顶边="12" 高度="40" 宽度="218" 文本="我是最棒的!" />
	  <按钮 名称="按钮1" 左边="12" 宽度="218" 顶边="70" 高度="40" 文本="点击测试" />
	</绝对布局>
</页面>

测试页面.spl

' ****************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 程序作者:
' 联系信息:
' 窗口描述:默认首页。
' ****************************************************************************
' 如何添加页面事件?
' 1.在空白处右键菜单
' 2.单击“单击事件”菜单项
' 3.或直接使用 “Ctrl + E” 快捷键添加
' ****************************************************************************

事件 页面加载完毕()
    标签1.文本 = "页面加载完毕,欢迎使用 VcnStudio 网站开发插件!"
结束 事件

事件 页面解析完毕()
    标签1.文本 = "页面解析完毕"
结束 事件

事件 窗口尺寸被改变()
    标签1.文本 = "页面(浏览器)窗口尺寸被改变,宽度:" + 取窗口宽度() + ",高度:" + 取窗口高度()
结束 事件

事件 页面内容被滚动()
    标签1.文本 = "页面内容被滚动"
结束 事件

事件 页面即将被关闭(事件源)
    标签1.文本 = "页面即将被关闭"
    ' 取消关闭事件
    事件源.preventDefault()
    ' 谷歌浏览器 需要设置 returnValue
    事件源.returnValue = ""
    ' 显示给用户的提示信息(部分浏览器可能不会显示自定义信息)
    返回 "你确定要离开此页面吗?"
结束 事件

事件 页面被关闭()
    调试输出("页面被关闭")
结束 事件

事件 页面发生错误(事件源)
    调试输出("页面发生错误")
结束 事件

事件 页面获得焦点()
    调试输出("页面获得焦点")
结束 事件

事件 页面失去焦点()
    调试输出("页面失去焦点")
结束 事件

关键代码解读

1. 页面加载完毕 vs 页面解析完毕

事件 页面解析完毕()       ' DOM 解析完成即触发(不等图片等资源)
    标签1.文本 = "页面解析完毕"
结束 事件

事件 页面加载完毕()       ' 所有资源(含图片、样式等)加载完成后触发
    标签1.文本 = "页面加载完毕,欢迎使用 VcnStudio 网站开发插件!"
结束 事件
  • 对应浏览器原生的 DOMContentLoaded(解析完毕)与 load(加载完毕)事件
  • 页面解析完毕 触发更早,适合尽早操作 DOM
  • 页面加载完毕 触发较晚,适合依赖完整资源的初始化(如读取图片尺寸)
  • 两者都会触发,且 页面解析完毕 必然先于 页面加载完毕

2. 窗口尺寸被改变:响应式布局基础

事件 窗口尺寸被改变()
    标签1.文本 = "页面(浏览器)窗口尺寸被改变,宽度:" + 取窗口宽度() + ",高度:" + 取窗口高度()
结束 事件
  • 浏览器窗口尺寸变化时触发(对应原生 resize 事件)
  • 取窗口宽度()/取窗口高度() 取视口尺寸(数字)
  • 实际开发中常在此事件中重新计算并调整组件位置(如 置组件水平居中调整页面布局

3. 页面即将被关闭:阻止用户离开

事件 页面即将被关闭(事件源)
    标签1.文本 = "页面即将被关闭"
    ' 取消关闭事件
    事件源.preventDefault()
    ' 谷歌浏览器 需要设置 returnValue
    事件源.returnValue = ""
    ' 显示给用户的提示信息(部分浏览器可能不会显示自定义信息)
    返回 "你确定要离开此页面吗?"
结束 事件
  • 对应原生 beforeunload 事件,用户尝试关闭/刷新/跳转时触发
  • 三步阻止关闭:
    1. 事件源.preventDefault() —— 阻止默认行为
    2. 事件源.returnValue = "" —— Chrome 要求设置 returnValue 才能弹出确认框
    3. 返回 "提示文本" —— 部分浏览器会显示该文本作为确认提示
  • ⚠️ 注意:现代浏览器出于安全考虑,自定义提示文本通常不会被显示,浏览器只会弹出一个通用的"是否离开"确认框

4. 页面被关闭 vs 页面即将被关闭

事件 页面即将被关闭(事件源)   ' 可阻止,用户可取消关闭
    ...
结束 事件

事件 页面被关闭()              ' 不可阻止,页面确认要关闭后触发
    调试输出("页面被关闭")
结束 事件
  • 页面即将被关闭:用户尝试离开时触发,可阻止
  • 页面被关闭:用户确认离开后触发,不可阻止
  • 对应原生 beforeunloadunload
  • 页面被关闭 中适合做异步不可的资源清理(如发送统计请求),但页面已无法更新 UI

5. 页面发生错误:错误监控

事件 页面发生错误(事件源)
    调试输出("页面发生错误")
结束 事件
  • 对应原生 error 事件
  • 适合做错误上报、日志记录
  • 事件源 含错误详情(具体字段以框架封装为准)

6. 页面获得/失去焦点:用户活跃状态监控

事件 页面获得焦点()
    调试输出("页面获得焦点")
结束 事件

事件 页面失去焦点()
    调试输出("页面失去焦点")
结束 事件
  • 对应原生 focusblur(页面级,非组件级)
  • 用户切换到其他标签页/窗口时触发 页面失去焦点,切回时触发 页面获得焦点
  • 实际用途:暂停/恢复动画、停止轮询、统计用户停留时长

注意事项

  • 事件添加方式:在 IDE 中通过右键菜单或 Ctrl + E 快捷键添加,事件名以 页面/窗口 开头的是页面级事件,无需绑定组件。
  • 页面加载完毕 vs 页面解析完毕:前者晚于后者;依赖图片等资源的初始化放前者,尽早操作 DOM 的逻辑放后者。
  • 页面即将被关闭 的兼容性preventDefault() + returnValue + 返回 文本三步走,但现代浏览器大多不显示自定义提示,仅弹通用确认框。
  • 页面被关闭 中不可更新 UI:此时页面已开始卸载,DOM 操作无效;适合做不可逆的资源清理、统计上报。
  • 窗口尺寸被改变 频率:拖动窗口时该事件会高频触发,重计算逻辑建议加节流(如用时钟定时器延迟执行)。
  • 事件名大小写敏感:轻语言事件名为中文,大小写不敏感,但必须与框架定义的事件名完全一致。
  • 组件级事件与页面级事件:本节为页面级事件(无组件前缀),组件事件(如 按钮1.被单击)需带组件名前缀。

学习要点总结

知识点关键代码适用场景
页面加载完毕事件 页面加载完毕()资源依赖的初始化
页面解析完毕事件 页面解析完毕()尽早操作 DOM
窗口尺寸改变事件 窗口尺寸被改变() + 取窗口宽度()响应式布局
内容滚动事件 页面内容被滚动()滚动监听
阻止关闭事件源.preventDefault() + returnValue用户离开提示
页面被关闭事件 页面被关闭()资源清理
错误监控事件 页面发生错误(事件源)错误上报
焦点切换页面获得焦点/页面失去焦点暂停/恢复动画
添加事件Ctrl + E 快捷键 / 右键菜单IDE 操作

相关文档

  • 文档页面事件_页面加载完毕 —— 加载完毕事件详解
  • 文档页面事件_页面解析完毕 —— 解析完毕事件详解
  • 文档页面事件_窗口尺寸被改变 —— 窗口尺寸事件
  • 文档页面事件_页面内容被滚动 —— 滚动事件
  • 文档页面事件_页面即将被关闭 —— beforeunload 与阻止关闭
  • 文档页面事件_页面被关闭 —— unload 事件
  • 文档页面事件_页面发生错误 —— 错误事件
  • 文档页面事件_页面获得焦点 / 文档页面事件_页面失去焦点 —— 焦点事件
  • 文档前端(JavaScript)函数_窗口 —— 取窗口宽度/取窗口高度
  • 文档轻语言网站:轻语言语法速查 —— 事件定义语法、VB6 风格事件
  • 文档轻语言网站:界面XML定义规范 —— .spldg XML 写法
  • 文档综合演示:贪吃蛇游戏开发演示 —— 窗口尺寸被改变 配合 调整页面布局 的实战用法
  • 文档综合演示:手机移动端记事本网页开发 —— 页面加载完毕 中读取本地数据的实战用法

综合演示:网页留言板开发

文档概述

本例程演示了如何使用轻语言编写一个简单的本地留言板网站。整个项目仅由前端页面构成,不依赖后端服务与数据库,留言数据保存在内存中的列表框组件内,刷新页面后会清空——适合用来学习轻语言的页面布局、事件驱动、组件批量操作、列表框动态渲染等核心知识点。

💡 本演示为「纯前端 + 内存存储」的入门示例。如需持久化存储留言,可参考文档综合演示:MySQL数据库操作,将留言通过 请求接口 提交到 .sph 后端脚本入库。

学习目标

阅读本文档后,你应当能够掌握以下内容:

  • 轻语言网站项目的「页面布局文件(.spldg)+ 页面逻辑文件(.spl)」成对组织方式
  • 事件驱动编程模型:事件 ... 结束 事件函数 ... 结束 函数 的语法结构
  • 绝对布局下的相对对齐技巧:置组件水平居中右侧对齐到右侧对齐到左顶边对齐到底
  • 组件尺寸特殊取值 -1(填充父布局)与 -2(匹配内容)的语义
  • 列表框「数据 + 渲染回调」的分离式渲染模式:添加项目置请求加载项目回调渲染
  • 拉姆达表达式(箭头函数)在回调中的写法:(参数) => { ... }
  • 使用 InnerHTML 结合 HTML 标签实现富文本展示

涉及组件

本演示实际使用到的组件如下(按代码出现顺序):

组件名称作用参考文档
页面<页面>页面根容器,承载标题、宽高等文档框架基础类_页面
绝对布局<绝对布局>父级定位容器,子组件以坐标绝对定位文档布局类组件_绝对布局
标签<标签>显示标题、统计文本、版权信息等文档文本类组件_标签
编辑框<编辑框>多行留言内容输入文档文本类组件_编辑框
表单输入框<表单输入框>单行昵称输入,带标题标签文档文本类组件_表单输入框
按钮<按钮>提交留言文档文本类组件_按钮
列表框<列表框>展示留言列表,按需渲染每一项文档列表类组件_列表框

📌 列表框中的每一项留言并非预置组件,而是在 置请求加载项目回调 中通过 创建 标签() 动态生成的标签组件——这是一种「数据驱动渲染」的模式,详见后文「关键代码解读」。

涉及函数与关键字

以下为本演示代码中出现的轻语言关键字与内置函数,便于 AI 在生成类似代码时准确复用:

关键字: 变量事件 ... 结束 事件函数 ... 结束 函数如果 ... 否则 ... 结束 如果创建返回

全局函数:

  • 置页面标题(标题) —— 设置浏览器标签页标题
  • 置组件左边(值, 组件1, 组件2, ...) —— 批量设置多个组件的左边距
  • 置组件宽度(值, 组件1, 组件2, ...) —— 批量设置多个组件的宽度
  • 置组件水平居中(组件) —— 让指定组件在页面水平方向居中
  • 弹出提示(文本) —— 浏览器弹出轻提示

组件方法(视图类通用):

  • 追加内联样式(样式文本) —— 追加 CSS 内联样式,如 "font-size:36px;"
  • 右侧对齐到(目标组件) —— 将当前组件右边缘对齐到目标组件右边缘
  • 右侧对齐到左(目标组件, 偏移量) —— 将当前组件右边缘对齐到目标组件左边缘,可指定间距
  • 顶边对齐到底(目标组件, 偏移量) —— 将当前组件顶边对齐到目标组件底边,可指定间距

列表框方法:

  • 添加项目(数据对象) —— 向列表框数据集合追加一条数据
  • 置请求加载项目回调(回调) —— 设置渲染回调,列表框渲染时会按索引逐项调用,返回值为该项要显示的视图组件
  • 渲染() —— 触发列表框按当前数据集合重新渲染
  • 取项目数() —— 取得当前列表框中的项目数量

程序结构与运行流程

本项目为标准的轻语言网站页面,由成对的两个文件组成:

首页.spldg   ← 页面布局文件(XML 格式,定义组件结构与初始属性)
首页.spl     ← 页面逻辑文件(轻语言代码,定义事件与函数)

运行时流程如下:

  1. 浏览器打开网站 → 执行入口文件 App.spl(本演示未展示,可参考 文档轻语言网站:程序入口文件
  2. 入口文件调用 切换页面("首页") 加载 首页
  3. 框架解析 首页.spldg 构建 DOM,再执行 首页.spl 中的 页面加载完毕 事件
  4. 用户输入昵称与留言后点击「提交留言」→ 触发 按钮1.被单击 事件
  5. 校验非空 → 构造留言对象 → 加入列表框 → 重新渲染 → 清空输入框 → 更新统计
  6. 浏览器窗口尺寸变化时 → 触发 窗口尺寸被改变 事件 → 重新调用 调整页面布局 完成自适应

数据模型

每条留言以一个轻语言对象表示,结构如下:

变量 留言信息 = { "昵称": "张三", "留言内容": "你好,留言板!" }

该对象作为数据项被 添加项目 加入列表框的数据集合;在渲染回调中通过 项目集合[索引] 取出,访问 .昵称.留言内容 两个属性构造展示内容。

程序源代码

首页.spldg

<?xml version="1.0" encoding="utf-8"?>
<页面 标题="页面标题" 宽度="655" 高度="449">
  <绝对布局 名称="根布局">
    <绝对布局 名称="绝对布局1" 左边="70" 顶边="27" 高度="390" 宽度="512">
      <标签 名称="标签1" 左边="3" 顶边="13" 高度="59" 宽度="244" 文本="我的留言板" />
      <标签 名称="标签2" 宽度="167" 高度="29" 左边="3" 顶边="78" 文本="留言(共有0条留言)" />
      <编辑框 名称="编辑框1" 左边="3" 顶边="113" 高度="80" 宽度="495" />
      <按钮 名称="按钮1" 左边="404" 顶边="213" 高度="31" 宽度="94" 文本="提交留言" />
      <表单输入框 名称="表单输入框1" 左边="185" 顶边="213" 高度="31" 宽度="213" 标题="表单输入框1" />
      <列表框 名称="列表框1" 左边="9" 顶边="250" 高度="98" 宽度="488" />
      <标签 名称="标签3" 左边="155" 顶边="354" 高度="33" 宽度="206" 文本="VcnStudio.Inc © 2025" />
    </绝对布局>
  </绝对布局>
</页面>

首页.spl

' ****************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 程序作者:
' 联系信息:
' 窗口描述:简单的留言板演示。
' ****************************************************************************

' 页面变量,整个页面都能使用
变量 页面变量 = "首页"

事件 页面加载完毕()
    置页面标题("我的留言板 - By:VcnStudio")
    
    ' 设置内容布局的宽度始终为浏览器大小的80%
    ' 注意:这里不能使用 % 百分比、只能使用单位 vw
    绝对布局1.宽度 = "80vw"
    
    ' 初始化设置大标题样式及提示内容
    标签1.追加内联样式("font-size:36px;font-weight:700;")
    标签1.宽度 = -1 ' 填充父布局,标签宽度等于父布局
    标签1.高度 = -2 ' 匹配内容,内容多高、标签就多高
    标签1.背景颜色 = "#daffe2"
    '
    编辑框1.提示文本 = "请输入留言内容"
    表单输入框1.标题 = "昵称:"
    表单输入框1.提示文本 = "请输入昵称"
    '列表框1.显示模式 = 隐藏元素
    标签3.内容水平对齐方式 = 居中
    标签3.字体大小 = 14
    标签3.文本颜色 = "#2b2b2b"
    
    ' 批量调整组件左边及宽度(占满父布局)
    置组件左边(0,标签1,标签2,编辑框1,列表框1,标签3)
    置组件宽度(-1,标签1,标签2,编辑框1,列表框1,标签3)
    
    ' 调整组件在页面中的布局
    调整页面布局()
    
    ' 初始化列表框及监听其渲染
    列表框1.拉伸内容 = 真
    列表框1.置请求加载项目回调((项目集合,索引)=>{
        变量 局_标签 = 创建 标签()
        局_标签.定位 = ""
        局_标签.行高 = 30
        局_标签.InnerHTML = "用户:<b>" + 项目集合[索引].昵称 + " </b>给你留言:<br>留言内容:" + 项目集合[索引].留言内容
        返回 局_标签
    })
结束 事件

函数 调整页面布局()
    ' 设置放置界面内容的绝对布局1始终保持在页面中水平居中
    置组件水平居中(绝对布局1)
    ' 将按钮对齐到编辑框1的右侧
    按钮1.右侧对齐到(编辑框1)
    ' 将表单输入框放在按钮的左侧
    表单输入框1.右侧对齐到左(按钮1,10)
结束 函数

事件 按钮1.被单击(源对象,事件源)
	如果(编辑框1.内容 == "" 或 表单输入框1.内容 == "")
        弹出提示("留言内容及昵称不能为空!")
        返回
    结束 如果
    ' 构建一个留言信息对象体、然后将其添加到列表框中、然后渲染一下
    变量 留言信息 = { "昵称":表单输入框1.内容, "留言内容":编辑框1.内容 }
    列表框1.添加项目(留言信息)
    列表框1.渲染()
    ' 清空输入的内容
    编辑框1.内容 = ""
    表单输入框1.内容 = ""
    ' 移动标签3位置、让其始终保持在列表底部
    标签3.顶边对齐到底(列表框1,20)
    ' 修改留言统计标签内容
    标签2.InnerHTML = "留言(共有<span style='color:red;'>"+ 列表框1.取项目数() +"</span>条留言)"
结束 事件

事件 窗口尺寸被改变()
    调整页面布局()
结束 事件

关键代码解读

1. 组件尺寸的特殊取值:-1 与 -2

标签1.宽度 = -1 ' 填充父布局,标签宽度等于父布局
标签1.高度 = -2 ' 匹配内容,内容多高、标签就多高

在轻语言中,给组件的宽度/高度赋值为整数时有特殊语义:

  • -1 表示「填充父布局」(类似 CSS 的 width:100%
  • -2 表示「匹配内容」(类似 CSS 的 height:auto
  • 普通整数表示像素值(如 30 等价于 30px
  • 带单位的字符串需用双引号包裹,如 "80vw""100%"

📌 在 .spldg 中设置宽度时可直接写整数;在 .spl 代码中赋值字符串单位时必须加双引号,否则会被当作数值处理。

2. 批量操作函数:变参组件参数

置组件左边(0,标签1,标签2,编辑框1,列表框1,标签3)
置组件宽度(-1,标签1,标签2,编辑框1,列表框1,标签3)

置组件左边置组件宽度 等函数支持「首参数为值,其后为任意数量的组件引用」的变参形式,可一次性统一多个组件的布局属性,避免对每个组件单独赋值。这是轻语言中常见的「批量布局工具函数」模式。

3. 绝对布局下的相对对齐

虽然父容器是「绝对布局」,但通过一组对齐方法可以让子组件之间产生「相对位置关系」,从而实现类似流式布局的效果:

置组件水平居中(绝对布局1)        ' 让绝对布局1在页面水平居中
按钮1.右侧对齐到(编辑框1)         ' 按钮右边对齐到编辑框右边
表单输入框1.右侧对齐到左(按钮1,10) ' 表单输入框右边对齐到按钮左边,留 10px 间距
标签3.顶边对齐到底(列表框1,20)    ' 版权标签始终跟在列表框下方 20px 处

💡 这些方法都继承自 视图 类,所有可视组件均可使用。完整方法列表见 文档框架基础类_视图

4. 列表框的数据驱动渲染模式

列表框采用「数据集合 + 渲染回调」分离的设计:

' 第一步:配置渲染回调(每渲染一项就调用一次)
列表框1.置请求加载项目回调((项目集合,索引)=>{
    变量 局_标签 = 创建 标签()       ' 动态创建一个标签作为该项的展示视图
    局_标签.定位 = ""                ' 清除绝对定位,交由列表框接管布局
    局_标签.行高 = 30
    局_标签.InnerHTML = "用户:<b>" + 项目集合[索引].昵称 + " </b>给你留言:<br>留言内容:" + 项目集合[索引].留言内容
    返回 局_标签                     ' 返回该项要显示的视图组件
})

' 第二步:添加数据
变量 留言信息 = { "昵称":..., "留言内容":... }
列表框1.添加项目(留言信息)

' 第三步:触发渲染
列表框1.渲染()

要点:

  • 添加项目 只是向数据集合追加一条记录,不会立即产生 DOM
  • 必须调用 渲染() 后,框架才会遍历数据集合,按索引回调取每一项的视图
  • 回调返回的视图由列表框自动添加到容器中,开发者无需手动 添加组件
  • 回调内 创建 标签() 动态生成的组件,需设置 .定位 = "" 以便由列表框统一布局
  • 拉伸内容 = 真 表示隐藏滚动条、内容全部展开

5. 拉姆达表达式(箭头函数)作为回调

列表框1.置请求加载项目回调((项目集合,索引)=>{
    ' 回调体
    返回 局_标签
})

轻语言支持 (参数) => { 语句 } 形式的拉姆达表达式(编译为 JavaScript 箭头函数),常用于事件回调和异步回调中。详见 文档轻语言网站:轻语言语法速查 中的「拉姆达表达式」一节。

6. 富文本展示:InnerHTML 与 HTML 标签

标签2.InnerHTML = "留言(共有<span style='color:red;'>"+ 列表框1.取项目数() +"</span>条留言)"

通过 InnerHTML 属性可注入 HTML 片段,实现加粗(<b>)、换行(<br>)、带样式(<span style='...'>)的富文本展示。注意样式值使用单引号包裹,以避免与轻语言字符串的双引号冲突。

7. 事件驱动与页面自适应

事件 窗口尺寸被改变()
    调整页面布局()
结束 事件

窗口尺寸被改变 是页面级事件(详见 文档框架基础类_页面),浏览器窗口尺寸变化时触发。本演示将布局逻辑封装到 调整页面布局 函数中,在「页面加载完毕」和「窗口尺寸被改变」两处统一调用,实现内容随窗口宽度(80vw)变化而水平居中并保持组件相对位置。

注意事项

  • 本演示的留言数据仅存于浏览器内存中,刷新页面后会丢失;如需持久化,可改用后端接口(参考 文档综合演示:MySQL数据库操作)或使用 保存配置/读取配置 函数将数据写入浏览器本地存储(参考 文档综合演示:XML 定义待办事项列表演示)。
  • 宽度单位使用 vw(视口宽度的百分比)而非 %,因为绝对布局的百分比是基于父元素宽度,而 vw 始终基于浏览器视口,更适合做整页自适应。
  • 列表框1.拉伸内容 = 真 会让列表框隐藏滚动条、随内容增高,因此底部版权标签需用 顶边对齐到底 动态跟随,避免被内容遮挡。
  • 代码中的注释使用单引号 '不能使用 ///* */,详见 文档轻语言网站:轻语言语法速查

学习要点总结

知识点关键代码适用场景
页面文件成对组织首页.spldg + 首页.spl所有轻语言网站页面
事件驱动事件 页面加载完毕() / 事件 按钮1.被单击(...)用户交互响应
自定义函数函数 调整页面布局()复用逻辑
尺寸特殊值宽度 = -1 / 高度 = -2自适应布局
批量布局置组件宽度(-1, 组件1, 组件2, ...)统一多个组件属性
相对对齐右侧对齐到 / 右侧对齐到左 / 顶边对齐到底绝对布局下的相对定位
列表框渲染置请求加载项目回调 + 渲染()数据驱动列表展示
动态创建组件创建 标签()在回调中按需生成视图
拉姆达回调(参数) => { ... }异步与事件回调
富文本InnerHTML加粗、换行、行内样式
窗口自适应事件 窗口尺寸被改变()响应式布局

相关文档

  • 文档轻语言网站:工程项目结构 —— 了解 .spl/.spldg 等文件类型的命名约定
  • 文档轻语言网站:程序入口文件 —— 了解 App.spl网站被访问 事件
  • 文档轻语言网站:轻语言语法速查 —— 关键字、运算符、流程控制、函数、拉姆达表达式
  • 文档框架基础类_视图 —— 所有可视组件的公共属性与方法(含对齐方法)
  • 文档框架基础类_页面 —— 页面级事件(页面加载完毕、窗口尺寸被改变等)
  • 文档列表类组件_列表框 —— 列表框的完整属性、方法与示例
  • 文档综合演示:XML 定义待办事项列表演示 —— 类似的列表渲染模式,含本地持久化
  • 文档综合演示:MySQL数据库操作 —— 后端接口与数据库持久化方案

综合演示:贪吃蛇游戏开发

文档概述

本演示文档展示了如何使用轻语言(Qing)开发一个完整的网页版贪吃蛇游戏。该游戏利用画板组件进行图形渲染,通过键盘事件控制蛇的移动方向,演示了时钟定时器、数组操作、碰撞检测、随机数生成、动态布局调整等核心编程技术。贪吃蛇是一款经典的休闲游戏,玩家通过控制小蛇移动并吃到食物来获得分数,同时避免撞墙。

  • 核心玩法:玩家通过键盘方向键(↑ ↓ ← →)控制小蛇在画布中移动,吃到红色食物即可增加蛇身长度并累计分数
  • 游戏规则
    • 小蛇撞墙即游戏结束
    • 每吃到一个食物,蛇身长度增加,分数增加 10 分
    • 随着蛇身增长,游戏难度逐渐提升(操作空间变小)
  • 技术亮点
    • 使用画板组件进行游戏画面的实时渲染
    • 利用时钟组件实现游戏主循环(每 150 毫秒更新一次状态)
    • 通过键盘事件捕捉玩家操作,动态调整蛇的移动方向
    • 响应式布局适配:窗口尺寸变化时自动调整组件位置

涉及组件

  • 标签:显示游戏标题、玩法说明和得分信息
  • 按钮:开始/重新开始游戏
  • 画板:绘制游戏场景(蛇身、食物、得分)
  • 时钟类:游戏主循环定时器(每 150 毫秒更新一次)
  • 键盘按键被按下事件:捕捉键盘方向键控制蛇的方向
  • 窗口尺寸被改变事件:响应窗口大小变化,自动调整布局
  • 页面加载完毕事件:页面初始化,设置标题和画板尺寸

涉及函数与 API

函数/API用途
创建时钟(子函数, 间隔时间)创建游戏主循环定时器
销毁时钟(时钟ID)游戏结束时销毁定时器
添加成员首(数组, 值)在蛇身数组头部插入新蛇头坐标
删除成员尾(数组)未吃到食物时移除蛇尾,保持蛇身长度不变
取随机整数(最小值, 最大值)随机生成食物位置
置画布尺寸(宽度, 高度)设置画板的绘制区域尺寸
取实际宽度()获取组件的实际渲染宽度
事件源.keyCode获取键盘按键的键码值
置组件水平居中(组件)将组件水平居中
信息框(消息)弹出游戏结束提示框

💡 本演示中使用到的画板绘制函数(填充样式填充矩形画笔样式字体画文本)请参考画板组件专项文档。

程序代码

界面布局文件:游戏页面.spldg

<?xml version="1.0" encoding="utf-8"?>
<页面 标题="贪吃蛇游戏 - 中文代码版" 宽度="734" 高度="509">
  <绝对布局 名称="根布局" 宽度="100" 高度="100">
    <!-- 游戏标题 -->
    <标签 名称="标签2" 左边="115" 顶边="30" 宽度="600" 高度="30" 文本="🐍 贪吃蛇游戏 - 中文代码版" 字体大小="24" 字体粗细="粗体" />
    <!-- 游戏画板 -->
    <画板 名称="画板1" 左边="115" 顶边="80" 宽度="600" 高度="300" 背景颜色="#B5C493" />
    <!-- 玩法说明 -->
    <标签 名称="标签1" 左边="115" 顶边="395" 宽度="350" 高度="65" 文本="🎮 游戏玩法:\n点击「开始游戏」后,按下键盘中的 ↑ ↓ ← → 分别控制小蛇的移动方向。\n🐍 小蛇吃到的食物越多,蛇身越长,得分越高!" 字体大小="14" 文本颜色="#555555" />
    <!-- 开始按钮 -->
    <按钮 名称="按钮1" 左边="480" 宽度="180" 顶边="395" 高度="40" 文本="🚀 开始游戏" 背景颜色="#1890ff" 文本颜色="#ffffff" 边框圆角="6px" />
  </绝对布局>
</页面>

逻辑文件:游戏页面.spl

' ****************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 程序作者:VcnStudio
' 联系信息:
' 窗口描述:贪吃蛇游戏 - 中文代码版
' ****************************************************************************

' ========== 游戏核心变量 ==========
' 构建蛇身和食物的小方块尺寸
变量 方块尺寸 = 20

' 记录已经吃到的食物数量(得分)
变量 分数 = 0

' 循环游戏的计时器,负责循环渲染游戏界面
变量 时钟1

' 定义蛇身(数组)数组中的每个项为一个坐标对象
变量 蛇身 = [{X:10, Y:5}]

' 定义食物坐标
变量 食物 = { X:10, Y:10 }

' 定义移动方向(偏移量)
变量 水平偏移 = 1
变量 垂直偏移 = 0

' 定义游戏状态,是否已结束
变量 游戏已结束 = 假

' ========== 页面加载事件 ==========
事件 页面加载完毕()
    ' 设置页面标题
    置页面标题("贪吃蛇游戏网页版 - By:VcnStudio")

    ' 初始化画板
    画板1.置画布尺寸(600, 300)

    ' 调整页面布局(居中、对齐)
    调整页面布局()
结束 事件

' ========== 开始游戏按钮 ==========
事件 按钮1.被单击(源对象, 事件源)
    ' 重置游戏状态
    分数 = 0
    游戏已结束 = 假
    蛇身 = [{X:10, Y:5}]
    食物 = { X:10, Y:10 }
    水平偏移 = 1
    垂直偏移 = 0

    ' 更新按钮文字
    按钮1.文本 = "⏳ 游戏进行中..."
    按钮1.禁用 = 真

    ' 启动游戏主循环(每 150 毫秒更新一次)
    时钟1 = 创建时钟(更新游戏状态, 150)
结束 事件

' ========== 游戏主循环(由时钟触发) ==========
函数 更新游戏状态()
    如果(游戏已结束 == 真)
        返回
    结束 如果

    ' 计算新的蛇头位置(根据当前方向)
    变量 新蛇头坐标 = {
        X: 蛇身[0].X + 水平偏移, 
        Y: 蛇身[0].Y + 垂直偏移 
    }

    ' 检测是否撞墙,撞墙则结束游戏
    如果(检测是否撞墙(新蛇头坐标))
        游戏结束("撞墙了,游戏结束!")
        返回
    结束 如果

    ' 检测是否撞到自己(蛇头碰到蛇身)
    变量循环(计次 = 0, 取数组成员数(蛇身), 1)
        如果(计次 > 0 且 新蛇头坐标.X == 蛇身[计次].X 且 新蛇头坐标.Y == 蛇身[计次].Y)
            游戏结束("咬到自己了,游戏结束!")
            返回
        结束 如果
    结束循环

    ' 将新的蛇头坐标添加到蛇身
    添加成员首(蛇身, 新蛇头坐标)

    ' 检测是否吃到了食物
    如果(新蛇头坐标.X == 食物.X 且 新蛇头坐标.Y == 食物.Y)
        ' 吃到食物,得分增加
        分数 = 分数 + 10

        ' 生成新的食物坐标
        ' 注意:取随机数的最大值不能超过(画板宽度/方块尺寸)- 1
        变量 最大X = 画板1.取渲染宽度() / 方块尺寸 - 1
        变量 最大Y = 画板1.取渲染高度() / 方块尺寸 - 1
        食物 = { 
            X: 取随机整数(1, 最大X - 1), 
            Y: 取随机整数(1, 最大Y - 1) 
        }
    否则
        ' 没有吃到食物,则移除蛇尾
        ' 因为上一步已经添加了新的蛇头,没吃到食物需要保证蛇身长度不变
        删除成员尾(蛇身)
    结束 如果

    ' 绘制游戏元素
    绘制游戏内容()
结束 函数

' ========== 游戏结束处理 ==========
函数 游戏结束(提示信息)
    游戏已结束 = 真
    销毁时钟(时钟1)
    按钮1.文本 = "🔁 重新开始游戏"
    按钮1.禁用 = 假
    信息框(提示信息 + " 得分:" + 分数)
结束 函数

' ========== 绘制游戏画面 ==========
函数 绘制游戏内容()
    ' 清空画板内容(每次绘制都需要先清空上一次绘制的内容)
    画板1.填充样式 = "#B5C493"
    画板1.填充矩形(0, 0, 600, 300)

    ' ===== 绘制蛇身 =====
    画板1.填充样式 = "#2E8B57"
    ' 蛇头用稍微亮一点的颜色
    变量 蛇头 = 蛇身[0]
    画板1.填充矩形(蛇头.X * 方块尺寸, 蛇头.Y * 方块尺寸, 方块尺寸 - 2, 方块尺寸 - 2)

    ' 蛇身用绿色系
    画板1.填充样式 = "#32CD32"
    变量循环(索引 = 0, 取数组成员数(蛇身), 1)
        变量 坐标点 = 蛇身[索引]
        画板1.填充矩形(坐标点.X * 方块尺寸, 坐标点.Y * 方块尺寸, 方块尺寸 - 2, 方块尺寸 - 2)
    结束循环

    ' ===== 绘制食物 =====
    画板1.填充样式 = "#FF4444"
    画板1.填充矩形(食物.X * 方块尺寸, 食物.Y * 方块尺寸, 方块尺寸 - 2, 方块尺寸 - 2)

    ' ===== 绘制分数(左上角) =====
    画板1.画笔样式 = "#333333"
    画板1.字体 = "20px Arial"
    画板1.画文本("🎯 得分:" + 分数, 10, 25)

    ' ===== 如果游戏已结束,显示遮罩和提示 =====
    如果(游戏已结束)
        画板1.填充样式 = "rgba(0,0,0,0.5)"
        画板1.填充矩形(0, 0, 600, 300)
        画板1.画笔样式 = "#ffffff"
        画板1.字体 = "36px Arial"
        画板1.画文本("💀 游戏结束", 180, 130)
        画板1.字体 = "20px Arial"
        画板1.画文本("得分:" + 分数, 240, 180)
    结束 如果
结束 函数

' ========== 碰撞检测 ==========
函数 检测是否撞墙(蛇头坐标)
    变量 最大X = 画板1.取渲染宽度() / 方块尺寸 - 1
    变量 最大Y = 画板1.取渲染高度() / 方块尺寸 - 1

    返回 蛇头坐标.X < 0 或 蛇头坐标.X > 最大X 或 蛇头坐标.Y < 0 或 蛇头坐标.Y > 最大Y
结束 函数

' ========== 键盘控制 ==========
事件 键盘按键被按下(事件源)
    如果(游戏已结束)
        返回
    结束 如果

    变量 键码 = 事件源.keyCode

    判断(键码)
        分支 37  ' ← 左
            如果(水平偏移 != 1)  ' 不能直接掉头
                水平偏移 = -1
                垂直偏移 = 0
            结束 如果
        分支 38  ' ↑ 上
            如果(垂直偏移 != 1)  ' 不能直接掉头
                水平偏移 = 0
                垂直偏移 = -1
            结束 如果
        分支 39  ' → 右
            如果(水平偏移 != -1)  ' 不能直接掉头
                水平偏移 = 1
                垂直偏移 = 0
            结束 如果
        分支 40  ' ↓ 下
            如果(垂直偏移 != -1)  ' 不能直接掉头
                水平偏移 = 0
                垂直偏移 = 1
            结束 如果
    结束 判断
结束 事件

' ========== 窗口自适应 ==========
事件 窗口尺寸被改变()
    调整页面布局()
结束 事件

' ========== 布局调整函数 ==========
函数 调整页面布局()
    ' 将画板和标题水平居中
    置组件水平居中(画板1, 标签2)

    ' 按钮对齐到画板右侧
    按钮1.右侧对齐到(画板1)
    按钮1.顶边对齐到底(画板1, 10)

    ' 标签1对齐到画板左侧
    标签1.左侧对齐到(画板1)
    标签1.顶边对齐到底(画板1, 10)

    ' 标签2顶部边距
    标签2.顶边 = 30
结束 函数

游戏运行效果

运行后,你将看到:

  1. 游戏界面:包含标题、游戏画板、玩法说明和开始按钮
  2. 游戏流程
    • 点击「开始游戏」按钮,游戏启动
    • 使用键盘方向键(↑ ↓ ← →)控制小蛇移动
    • 小蛇吃到红色食物,蛇身变长,得分增加 10 分
    • 小蛇撞墙或咬到自己时,游戏结束
    • 点击「重新开始游戏」按钮可重新开始
  3. 交互反馈
    • 游戏过程中,蛇头和蛇身使用不同的绿色区分
    • 游戏结束时,画板会显示半透明遮罩和游戏结束提示
    • 得分实时显示在画板左上角

学习要点

通过本综合演示,你可以学习到以下轻语言编程技术:

知识点代码位置说明
画板图形绘制绘制游戏内容()使用 填充样式填充矩形画笔样式画文本 等 API 绘制游戏画面
时钟定时器创建时钟(更新游戏状态, 150)创建游戏主循环定时器,每 150 毫秒更新一次游戏状态
键盘事件键盘按键被按下(事件源)捕捉键盘方向键,控制蛇的移动方向
数组操作添加成员首()删除成员尾()管理蛇身坐标数组,实现蛇的移动逻辑
碰撞检测检测是否撞墙()蛇头撞自身检测检测蛇头是否撞墙或撞到自己
随机数生成取随机整数(最小值, 最大值)随机生成食物的位置
响应式布局调整页面布局()置组件水平居中()窗口尺寸变化时自动调整组件位置
事件清理销毁时钟(时钟1)游戏结束时销毁定时器,避免内存泄漏

扩展方向

你可以基于这个游戏继续扩展以下功能:

  • 难度递增:随着得分增加,时钟间隔逐渐缩短(蛇移动速度加快)
  • 障碍物模式:在画板中随机生成障碍物,蛇碰到障碍物则游戏结束
  • 无尽模式:蛇撞墙后从另一侧穿出(类似经典贪吃蛇)
  • 暂停/继续:添加空格键暂停游戏功能
  • 排行榜:使用本地存储(保存配置)记录最高分

💡 相关文档:本演示中使用的画板绘制函数、时钟函数、键盘事件等详细用法,请参考对应的专项文档。