{{ if: ${deprecated} }}
从 `v${version}` 开始不推荐使用(deprecated)。${deprecated}
+{{ elif: ${feature} }}
+${feature} 从 `v${version}` 开始支持
{{ else }}
从 `v${version}` 开始支持
{{ /if }}
diff --git a/zh/option-gl/partial/version.md b/zh/option-gl/partial/version.md
index cf9cb8a5..60d19e9b 100644
--- a/zh/option-gl/partial/version.md
+++ b/zh/option-gl/partial/version.md
@@ -4,6 +4,8 @@
{{ if: ${deprecated} }}
从{{ if: ${isECharts} }} ECharts{{ /if }} `v${version}` 开始不推荐使用(deprecated)。${deprecated}
+{{ elif: ${feature} }}
+${feature} 从{{ if: ${isECharts} }} ECharts{{ /if }} `v${version}` 开始支持
{{ else }}
从{{ if: ${isECharts} }} ECharts{{ /if }} `v${version}` 开始支持
{{ /if }}
diff --git a/zh/option/component/title.md b/zh/option/component/title.md
index 4520c13b..fe2c1490 100644
--- a/zh/option/component/title.md
+++ b/zh/option/component/title.md
@@ -43,10 +43,16 @@ const option = {
主标题文本,支持使用 `\n` 换行。
+{{ use: partial-security-warning(
+ securityRiskExclamation: '如果使用了 [toolbox.feature.saveAsImage](~toolbox.feature.saveAsImage),并且没有设置 [toolbox.feature.saveAsImage.name](~toolbox.feature.saveAsImage.name),会用 `title[0].text` 替代。这种用法是历史实现但并不推荐,应该总是显式指定[toolbox.feature.saveAsImage.name](~toolbox.feature.saveAsImage.name);否则,不得不考虑 `title.text` 是否是个正确的文件名,以及其 **安全性**。'
+)}}
+
## link(string) = ''
主标题文本超链接。
+{{ use: partial-security-url-common-warning }}
+
## target(string) = 'blank'
指定窗口打开主标题超链接。
@@ -80,6 +86,8 @@ const option = {
副标题文本超链接。
+{{ use: partial-security-url-common-warning }}
+
## subtarget(string) = 'blank'
指定窗口打开副标题超链接,可选:
diff --git a/zh/option/component/toolbox.md b/zh/option/component/toolbox.md
index b05af9f2..054c8bde 100644
--- a/zh/option/component/toolbox.md
+++ b/zh/option/component/toolbox.md
@@ -63,6 +63,11 @@ ${name} icon 样式设置。由于 icon 的文本信息只在 icon hover 时候
是否显示该工具。
#### title(string) = '${title}'
+{{ if: ${warnToolboxDataViewSecurity} }}
+{{ use: partial-security-warning(
+ desc: '`dataView` 面板是用 HTML 实现的,一些部分允许用户自定义格式和样式。`title` 字段会直接拼接到此 HTML 中,并没有做转义。因此传入前须要正确转义。'
+)}}
+{{ /if }}
#### icon(string)
@@ -243,11 +248,19 @@ option = {
+ 如果 `renderer` 的类型在 [初始化图表](api.html#echarts.init) 时被设为 `'canvas'`(默认),则支持 `'png'`(默认)和 `'jpg'`;
+ 如果 `renderer` 的类型在 [初始化图表](api.html#echarts.init) 时被设为 `'svg'`,则 `type` 只支持 `'svg'`(`'svg'` 格式的图片从 `v4.8.0` 开始支持)。
+{{ use: partial-security-warning(
+ securityRiskExclamation: '`type` 会被用于文件的扩展名。但是实现中并没有在内部对其进行合法性校验(历史因素)。所以不要传入不合法的值;否则,需要考虑 **安全风险**。'
+)}}
+
#### name(string)
-保存的文件名称,默认使用 [title.text](~title.text) 作为名称。
+保存的文件名称的扩展名之前的部分。如果没有指定,会使用 [title[0].text](~title.text)(如果存在的话)。完整的文件名是 `{name}.{type}`。
+
+{{ use: partial-security-warning(
+ securityRiskExclamation: '建议总是显式指定 `name`,以及不使用“不可信任来源”的字符串。否则,须要考虑作为文件名的 **正确性** 和 **安全性**。'
+)}}
#### backgroundColor(Color) = 'auto'
@@ -288,7 +301,8 @@ option = {
数据视图工具,可以展现当前图表所用的数据,编辑后可以动态更新。
{{ use: feature-common(
- title = "数据视图"
+ title = "数据视图",
+ warnToolboxDataViewSecurity = true
) }}
#### readOnly(boolean) = false
@@ -305,22 +319,26 @@ option = {
自定义 dataView 展现函数,用以取代默认的 textarea 使用更丰富的数据编辑。可以返回 dom 对象或者 html 字符串。
+{{ use: partial-security-warning(
+ desc: '`dataView` 面板是用 HTML 实现的,一些部分允许用户自定义格式和样式。`optionToContent` 给出的 HTML 会直接拼接到面板 HTML 中,并没有做转义。因此传入前须要正确转义。'
+)}}
+
如下示例使用表格展现数据值:
```ts
optionToContent: function(opt) {
var axisData = opt.xAxis[0].data;
var series = opt.series;
var table = '
'
- + '| 时间 | '
- + '' + series[0].name + ' | '
- + '' + series[1].name + ' | '
- + '
';
+ + '时间 | '
+ + '' + echarts.format.encodeHTML(series[0].name) + ' | '
+ + '' + echarts.format.encodeHTML(series[1].name) + ' | '
+ + '';
for (var i = 0, l = axisData.length; i < l; i++) {
table += ''
- + '| ' + axisData[i] + ' | '
- + '' + series[0].data[i] + ' | '
- + '' + series[1].data[i] + ' | '
- + '
';
+ + '' + echarts.format.encodeHTML(axisData[i]) + ' | '
+ + '' + echarts.format.encodeHTML(series[0].data[i]) + ' | '
+ + '' + echarts.format.encodeHTML(series[1].data[i]) + ' | '
+ + '';
}
table += '
';
return table;
@@ -339,6 +357,10 @@ optionToContent: function(opt) {
数据视图上有三个话术,默认是`['数据视图', '关闭', '刷新']`。
+{{ use: partial-security-warning(
+ desc: '`dataView` 面板是用 HTML 实现的,一些部分允许用户自定义格式和样式。`lang` 中的内容会直接拼接到此 HTML 中,并没有做转义。因此传入前须要正确转义。'
+)}}
+
#### backgroundColor(string) = '#fff'
diff --git a/zh/option/component/visual-map.md b/zh/option/component/visual-map.md
index 249bdf8e..875a2c8d 100644
--- a/zh/option/component/visual-map.md
+++ b/zh/option/component/visual-map.md
@@ -295,6 +295,47 @@ chart.setOption(option); // option设置回 ${componentMainType}
可以是一个 id 或者一个 id 数组。
默认取所有系列。
+## seriesTargets(Array)
+
+{{ use: partial-version(version = "6.0.1") }}
+
+指定多个系列及其对应的维度映射关系。当配置了 `seriesTargets` 时,`seriesIndex`、`seriesId` 和 `dimension` 将被忽略。
+
+这个选项允许单个 `visualMap` 组件同时映射多个维度到各自的系列,特别适用于使用 dataset 的场景。
+
+每个目标对象应包含以下属性:
+- `seriesIndex` 或 `seriesId`:指定系列(二者选其一)
+- `dimension`:指定该系列使用的数据维度
+
+示例:
+```javascript
+option = {
+ tooltip: {},
+ dataset: {
+ source: [
+ ['product', '2015', '2016', '2017'],
+ ['Matcha Latte', 43.3, 85.8, 93.7],
+ ['Milk Tea', 83.1, 73.4, 55.1],
+ ['Cheese Cocoa', 86.4, 65.2, 82.5],
+ ['Walnut Brownie', 72.4, 53.9, 39.1]
+ ]
+ },
+ xAxis: { type: 'category' },
+ yAxis: {},
+ series: [{ type: 'bar' }, { type: 'bar' }, { type: 'bar' }],
+ visualMap: {
+ type: 'piecewise',
+ min: 30,
+ max: 100,
+ seriesTargets: [
+ { seriesIndex: 0, dimension: 1 },
+ { seriesIndex: 1, dimension: 2 },
+ { seriesIndex: 2, dimension: 3 }
+ ]
+ }
+};
+```
+
## hoverLink(boolean) = true
打开 `hoverLink` 功能时,鼠标悬浮到 `visualMap` 组件上时,鼠标位置对应的数值 在 图表中对应的图形元素,会高亮。
diff --git a/zh/option/partial/security-warning.md b/zh/option/partial/security-warning.md
new file mode 100644
index 00000000..d15e0a0d
--- /dev/null
+++ b/zh/option/partial/security-warning.md
@@ -0,0 +1,12 @@
+{{ target: partial-security-warning }}
+
+[警告]: ${desc} {{ if: ${securityRiskExclamation} }}${securityRiskExclamation}{{ else }}使用时必须考虑 **安全风险**。{{ /if }}文档 [“安全指南”](${handbookPath}best-practices/security) 给出了安全使用建议。
+
+{{ /target }}
+
+{{ target: partial-security-url-common-warning }}
+{{ use: partial-security-warning(
+ desc: '此 URL 字符串直接被使用,并未在内部做其他净化处理(sanitization)',
+ securityRiskExclamation: '如果他们来自于“不受信任”的来源,必须考虑 **安全风险**。'
+)}}
+{{ /target }}
diff --git a/zh/option/partial/tooltip-common.md b/zh/option/partial/tooltip-common.md
index d4fbb02e..0bd352ed 100644
--- a/zh/option/partial/tooltip-common.md
+++ b/zh/option/partial/tooltip-common.md
@@ -311,11 +311,36 @@ formatter: '{b0}: {c0}
{b1}: {c1}'
回调函数格式:
```ts
-(params: Object|Array, ticket: string, callback: (ticket: string, html: string)) => string | HTMLElement | HTMLElement[]
+(params: Object|Array, ticket: string, callback: (ticket: string, html: string | HTMLElement | HTMLElement[])) => string | HTMLElement | HTMLElement[]
```
支持返回 HTML 字符串或者创建的 DOM 实例。
+{{ use: partial-security-warning(
+ desc: 'tooltip 是用 HTML 实现的(除非 [tooltip.renderMode](~tooltip.renderMode) 设为 `richText`)。允许用此方式定制 HTML。传入 HTML 前须要对其内容进行正确转义。'
+)}}
+
+组装 HTML 字符串时,**必须进行 HTML 转义(HTML-escaping)**。例如:
+```js
+{
+ tooltip: {
+ formatter: params => {
+ const { name, value } = params;
+ // 必须进行 HTML 转义。
+ // 否则,如果 name 或 value 中含有功能性字符,如 '<' '>' 等,
+ // 则可能渲染不正确。
+ // 同时,如果 name 或 value 的值来自于“非受信任”的来源,则可能被注入恶意代码;
+ // 如果未被转义,则会被运行。
+ return echarts.format.encodeHTML(name)
+ + '
' + echarts.format.encodeHTML(value) + '';
+ // 注:`echarts.format.encodeHTML` 是个工具函数,把特殊字符
+ // ('&'、'<'、'>'、'"'、"'")转换成他们对应的 HTML entities.
+ // 这只是个例子,任何 HTML 转义工具函数都可使用。
+ }
+ }
+}
+```
+
第一个参数 `params` 是 formatter 需要的数据集。格式如下:
{{ use: partial-formatter-params-structure(
@@ -375,7 +400,10 @@ tooltip 中数值显示部分的格式化回调函数。
(value: number | string, dataIndex: number) => string
```
-> 自 `v5.5.0` 版本起提供 `dataIndex`。
+{{ use: partial-version(
+ feature = '`dataIndex` 参数',
+ version = '5.3.0'
+) }}
示例:
@@ -383,6 +411,7 @@ tooltip 中数值显示部分的格式化回调函数。
// 添加 $ 前缀
valueFormatter: (value) => '$' + value.toFixed(2)
```
+> **[注]:** 不同于 [tooltip.formater](~tooltip.formatter),本方式不支持返回原始 HTML。返回内容渲染前会被自动按需转义。
{{ /if }}
#${prefix} backgroundColor(Color) = 'rgba(50,50,50,0.7)'
@@ -453,3 +482,7 @@ valueFormatter: (value) => '$' + value.toFixed(2)
extraCssText: 'box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);'
```
+{{ use: partial-security-warning(
+ desc: 'tooltip 是用 HTML 实现的(除非 [tooltip.renderMode](~tooltip.renderMode) 设为 `richText`)。允许用此方式定制 toolbox 外壳的 CSS text。',
+ securityRiskExclamation: '如果此 CSS text 来自于“不受信任”的来源,必须考虑 **安全风险**。'
+)}}
diff --git a/zh/option/partial/version.md b/zh/option/partial/version.md
index fbcd0fe5..ddd5265a 100644
--- a/zh/option/partial/version.md
+++ b/zh/option/partial/version.md
@@ -4,6 +4,8 @@
{{ if: ${deprecated} }}
从 `v${version}` 开始不推荐使用(deprecated)。${deprecated}
+{{ elif: ${feature} }}
+${feature} 从 `v${version}` 开始支持
{{ else }}
从 `v${version}` 开始支持
{{ /if }}
diff --git a/zh/option/series/sunburst.md b/zh/option/series/sunburst.md
index 020ca31c..5efe7752 100644
--- a/zh/option/series/sunburst.md
+++ b/zh/option/series/sunburst.md
@@ -364,6 +364,8 @@ const option = {
参见 [series-sunburst.data.target](~series-sunburst.data.target)。
+{{ use: partial-security-url-common-warning }}
+
### target(string) = 'blank'
意义同 HTML `
` 标签中的 `target`,参见 [series-sunburst.data.link](~series-sunburst.data.link)。可选值为:`'blank'` 或 `'self'`。
diff --git a/zh/option/series/treemap.md b/zh/option/series/treemap.md
index 1344490a..a259bbce 100644
--- a/zh/option/series/treemap.md
+++ b/zh/option/series/treemap.md
@@ -535,6 +535,8 @@ treemap 默认把第一个维度(Array 第一项)映射到『面积』上。
参见 [series-treemap.data.target](~series-treemap.data.target)。
+{{ use: partial-security-url-common-warning }}
+
### target(string) = 'blank'
意义同 `html` `` 标签中的 `target`,参见 [series-treemap.data.link](~series-treemap.data.link)。可选值为:`'blank'` 或 `'self'`。
diff --git a/zh/tutorial/visual-map.md b/zh/tutorial/visual-map.md
index cee60541..830eb0e1 100644
--- a/zh/tutorial/visual-map.md
+++ b/zh/tutorial/visual-map.md
@@ -146,4 +146,33 @@ option = {
};
```
+例三(使用 seriesTargets 映射不同系列的不同维度):
+```javascript
+option = {
+ tooltip: {},
+ dataset: {
+ source: [
+ ['product', '2015', '2016', '2017'],
+ ['Matcha Latte', 43.3, 85.8, 93.7],
+ ['Milk Tea', 83.1, 73.4, 55.1],
+ ['Cheese Cocoa', 86.4, 65.2, 82.5],
+ ['Walnut Brownie', 72.4, 53.9, 39.1]
+ ]
+ },
+ xAxis: { type: 'category' },
+ yAxis: {},
+ series: [{ type: 'bar' }, { type: 'bar' }, { type: 'bar' }],
+ visualMap: {
+ type: 'piecewise',
+ min: 30,
+ max: 100,
+ seriesTargets: [
+ { seriesIndex: 0, dimension: 1 },
+ { seriesIndex: 1, dimension: 2 },
+ { seriesIndex: 2, dimension: 3 }
+ ]
+ }
+};
+```
+
更多详情,参见 [visualMap.inRange](option.html#visualMap.inRange) 和 [visualMap.outOfRange](option.html#visualMap.outOfRange)。