简介 #
HTML 组件是 SmartChart 中最灵活的组件类型,适合实现输入控件(筛选器、按钮)、展示组件(指标卡片、表格)和富文本内容。通过在 JS 代码中使用 dom__name__.innerHTML 渲染 HTML,并结合数据集实现动态内容。
| 关键语法 | 说明 |
|---|---|
dom__name__ |
当前图形 DOM 容器,__name__ 自动替换为唯一 ID |
innerHTML |
向容器写入 HTML 内容 |
ds_setParam() |
设置参数,触发联动 |
ds_refresh(n) |
刷新序号 n 的图形 |
__dataset__ |
后端传入的标准二维数组 |
应用场景 #
HTML 组件是 SmartChart 中最灵活的组件类型,适合实现:
- 输入控件:输入框、下拉筛选器、多选框、单选框、按钮、日期选择器等
- 展示组件:富文本、图片、视频、指标卡片、进度条等
- 表格组件:静态表格、动态数据表格、可点击联动的列表
如果还不熟悉 HTML,建议先花几分钟阅读 HTML 基础教程。
实际开发中遇到不熟悉的组件(如时间选择器),直接搜索即可找到现成 HTML 代码。

核心语法:SmartChart 中的 HTML 写法 #
在图形编辑器的 JS 区中,用 dom__name__.innerHTML = ... 将 HTML 字符串渲染到容器中。
let dataset = __dataset__ // 接收后端数据集
dom__name__.innerHTML = '<h2>Hello SmartChart</h2>'
dom__name__是当前图形的 DOM 容器,__name__会被自动替换为唯一 ID,避免多图形之间的 DOM 冲突。
从静态 HTML 到动态 SmartChart 组件 #
第一步:找到 HTML 原型 #
以"多选框 + 提交按钮"为例,标准 HTML 如下:
<label><input type="checkbox">孙尚香</label>
<label><input type="checkbox">张飞</label>
<button id='submit_btn'>提交</button>
第二步:转化为静态 SmartChart 写法 #
let dataset = __dataset__
let table = `
<label><input type="checkbox">孙一香</label>
<label><input type="checkbox">孙二香</label>
<label><input type="checkbox">孙三香</label>
`
table += "<button id='id_select__name__'>提交</button>"
dom__name__.innerHTML = table
注意:按钮 id 要加上
__name__后缀,避免多个图形中同名 id 冲突。
第三步:改为数据集动态驱动 #
让内容随数据库数据动态变化,只需循环遍历数据集:
let dataset = __dataset__ // 例如:[['name'], ['孙一香'], ['孙二香'], ['孙三香']]
let table = ''
for (let i = 1; i < dataset.length; i++) {
table += `<label><input type="checkbox" value="${dataset[i][0]}"/>${dataset[i][0]}</label> `
}
table += `<button id='id_select__name__'>提交</button>`
dom__name__.innerHTML = table
常用 HTML 组件示例 #
下拉筛选器(联动刷新) #
let dataset = __dataset__ // [['city'], ['长沙'], ['广州'], ['深圳']]
let options = dataset.slice(1).map(row => `<option value="${row[0]}">${row[0]}</option>`).join('')
dom__name__.innerHTML = `
<select id="sel__name__" style="width:100%;padding:6px">
<option value="">全部</option>
${options}
</select>
`
// 绑定 change 事件,联动刷新其他图形
document.getElementById('sel__name__').addEventListener('change', function() {
ds_setParam('city', this.value)
ds_refresh(2) // 刷新序号 2 的图形
ds_refresh(3)
})
输入框 + 按钮(查询联动) #
dom__name__.innerHTML = `
<div style="display:flex;gap:8px;padding:8px">
<input id="kw__name__" type="text" placeholder="输入关键词..." style="flex:1;padding:6px;border:1px solid #ddd;border-radius:4px"/>
<button id="btn__name__" style="padding:6px 16px;background:#1890ff;color:#fff;border:none;border-radius:4px;cursor:pointer">查询</button>
</div>
`
document.getElementById('btn__name__').addEventListener('click', function() {
let kw = document.getElementById('kw__name__').value
ds_setParam('keyword', kw)
ds_refresh(2)
})
指标卡片 #
let dataset = __dataset__ // [['指标', '值', '同比'], ['销售额', '1,234,567', '+12.5%']]
let cards = dataset.slice(1).map(row => `
<div style="flex:1;background:#fff;border-radius:8px;padding:16px;text-align:center;box-shadow:0 2px 8px rgba(0,0,0,.08)">
<div style="color:#666;font-size:13px">${row[0]}</div>
<div style="color:#1890ff;font-size:28px;font-weight:bold;margin:8px 0">${row[1]}</div>
<div style="color:#52c41a;font-size:12px">${row[2]}</div>
</div>
`).join('')
dom__name__.innerHTML = `<div style="display:flex;gap:12px;height:100%;align-items:center">${cards}</div>`
动态表格 #
let dataset = __dataset__
let thead = dataset[0].map(h => `<th>${h}</th>`).join('')
let tbody = dataset.slice(1).map(row =>
`<tr>${row.map(cell => `<td>${cell}</td>`).join('')}</tr>`
).join('')
dom__name__.innerHTML = `
<table style="width:100%;border-collapse:collapse;font-size:13px">
<thead style="background:#f0f2f5">
<tr>${thead}</tr>
</thead>
<tbody>${tbody}</tbody>
</table>
`
为 HTML 组件添加点击联动 #
HTML 组件的点击事件需要在 innerHTML 赋值完成后绑定:
// 先渲染 HTML
dom__name__.innerHTML = table
// 再绑定事件(使用 jQuery 的 unbind+click 确保不重复绑定)
$('#container___name__ button').unbind('click').click(function() {
// 获取选中的多选框值
let selected = []
$('#container___name__ input[type=checkbox]:checked').each(function() {
selected.push($(this).val())
})
ds_setParam('items', selected.join(','))
ds_refresh(2)
})
学习资源 #
更多 HTML 组件开发实战请参考"万能表格系列视频":