diff --git a/src/component/axisPointer/AxisPointerModel.ts b/src/component/axisPointer/AxisPointerModel.ts index 8f81891025..cb0dc9f982 100644 --- a/src/component/axisPointer/AxisPointerModel.ts +++ b/src/component/axisPointer/AxisPointerModel.ts @@ -89,6 +89,7 @@ class AxisPointerModel extends ComponentModel { snap: false, triggerTooltip: true, triggerEmphasis: true, + triggerOnNull: false, value: null, status: null, // Init value depends on whether handle is used. diff --git a/src/component/axisPointer/axisTrigger.ts b/src/component/axisPointer/axisTrigger.ts index e3051b953d..7747c8b0dc 100644 --- a/src/component/axisPointer/axisTrigger.ts +++ b/src/component/axisPointer/axisTrigger.ts @@ -166,13 +166,14 @@ export default function axisTrigger( each(coordSysAxesInfo.coordSysAxesInfo[coordSysKey], function (axisInfo, key) { const axis = axisInfo.axis; const inputAxisInfo = findInputAxisInfo(inputAxesInfo, axisInfo); + const triggerOnNull = axisInfo.triggerOnNull; // If no inputAxesInfo, no axis is restricted. - if (!shouldHide && coordSysContainsPoint && (!inputAxesInfo || inputAxisInfo)) { + if (coordSysContainsPoint && (triggerOnNull || (!shouldHide && (!inputAxesInfo || inputAxisInfo)))) { let val = inputAxisInfo && inputAxisInfo.value; if (val == null && !isIllegalPoint) { val = axis.pointToData(point); } - val != null && processOnAxis(axisInfo, val, updaters, false, outputPayload); + (triggerOnNull || val != null) && processOnAxis(axisInfo, val, updaters, false, outputPayload); } }); }); diff --git a/src/component/axisPointer/modelHelper.ts b/src/component/axisPointer/modelHelper.ts index 2b03d20104..5e82c8564e 100644 --- a/src/component/axisPointer/modelHelper.ts +++ b/src/component/axisPointer/modelHelper.ts @@ -50,6 +50,7 @@ interface AxisInfo { axisPointerModel: Model triggerTooltip: boolean triggerEmphasis: boolean + triggerOnNull: boolean involveSeries: boolean snap: boolean useHandle: boolean @@ -89,6 +90,7 @@ export function collect(ecModel: GlobalModel, api: ExtensionAPI) { * axisPointerModel, * triggerTooltip, * triggerEmphasis, + * triggerOnNull, * involveSeries, * snap, * seriesModels, @@ -197,6 +199,7 @@ function collectAxesInfo(result: CollectionResult, ecModel: GlobalModel, api: Ex const snap = axisPointerModel.get('snap'); const triggerEmphasis = axisPointerModel.get('triggerEmphasis'); + const triggerOnNull = axisPointerModel.get('triggerOnNull'); const axisKey = makeKey(axis.model); const involveSeries = triggerTooltip || snap || axis.type === 'category'; @@ -208,6 +211,7 @@ function collectAxesInfo(result: CollectionResult, ecModel: GlobalModel, api: Ex axisPointerModel: axisPointerModel, triggerTooltip: triggerTooltip, triggerEmphasis: triggerEmphasis, + triggerOnNull: triggerOnNull, involveSeries: involveSeries, snap: snap, useHandle: isHandleTrigger(axisPointerModel), diff --git a/src/util/types.ts b/src/util/types.ts index c15e8c2639..6659b82d11 100644 --- a/src/util/types.ts +++ b/src/util/types.ts @@ -1380,6 +1380,8 @@ export interface CommonAxisPointerOption { triggerEmphasis?: boolean + triggerOnNull?: boolean + /** * current value. When using axisPointer.handle, value can be set to define the initial position of axisPointer. */ diff --git a/test/axisPointer-triggerOnNull-snap.html b/test/axisPointer-triggerOnNull-snap.html new file mode 100644 index 0000000000..f06044da88 --- /dev/null +++ b/test/axisPointer-triggerOnNull-snap.html @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + +
+
+ + + + diff --git a/test/axisPointer-triggerOnNull.html b/test/axisPointer-triggerOnNull.html new file mode 100644 index 0000000000..721a76c0c8 --- /dev/null +++ b/test/axisPointer-triggerOnNull.html @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + +
+
+ + + + diff --git a/test/runTest/actions/__meta__.json b/test/runTest/actions/__meta__.json index e5263c1683..f2a96282f5 100644 --- a/test/runTest/actions/__meta__.json +++ b/test/runTest/actions/__meta__.json @@ -16,6 +16,8 @@ "axis-minorTick": 1, "axis-multiple": 1, "axis-style": 2, + "axisPointer-triggerOnNull": 1, + "axisPointer-triggerOnNull-snap": 1, "axisPosition": 2, "bar": 2, "bar-background": 3, diff --git a/test/runTest/actions/axisPointer-triggerOnNull-snap.json b/test/runTest/actions/axisPointer-triggerOnNull-snap.json new file mode 100644 index 0000000000..29f9fe71c3 --- /dev/null +++ b/test/runTest/actions/axisPointer-triggerOnNull-snap.json @@ -0,0 +1 @@ +[{"name":"Action 1","ops":[{"type":"mousemove","time":548,"x":123,"y":162},{"type":"mousemove","time":758,"x":131,"y":163},{"type":"mousemove","time":975,"x":142,"y":165},{"type":"mousemove","time":1182,"x":149,"y":165},{"type":"mousemove","time":1391,"x":158,"y":165},{"type":"mousemove","time":1599,"x":171,"y":165},{"type":"mousemove","time":1810,"x":179,"y":165},{"type":"screenshot","time":1996},{"type":"mousemove","time":2016,"x":181,"y":165},{"type":"mousemove","time":2225,"x":234,"y":165},{"type":"mousemove","time":2431,"x":263,"y":165},{"type":"mousemove","time":2631,"x":274,"y":165},{"type":"mousemove","time":2832,"x":287,"y":166},{"type":"mousemove","time":3033,"x":303,"y":167},{"type":"mousemove","time":3234,"x":316,"y":167},{"type":"mousemove","time":3447,"x":326,"y":167},{"type":"mousemove","time":3649,"x":329,"y":167},{"type":"mousemove","time":3857,"x":333,"y":166},{"type":"screenshot","time":3977},{"type":"mousemove","time":4097,"x":333,"y":166},{"type":"mousemove","time":4305,"x":336,"y":166},{"type":"mousemove","time":4514,"x":355,"y":165},{"type":"mousemove","time":4716,"x":371,"y":165},{"type":"mousemove","time":4922,"x":394,"y":165},{"type":"mousemove","time":5127,"x":411,"y":166},{"type":"mousemove","time":5331,"x":428,"y":166},{"type":"mousemove","time":5531,"x":442,"y":167},{"type":"mousemove","time":5731,"x":456,"y":168},{"type":"mousemove","time":5932,"x":468,"y":168},{"type":"mousemove","time":6143,"x":482,"y":168},{"type":"mousemove","time":6351,"x":496,"y":167},{"type":"mousemove","time":6557,"x":500,"y":167},{"type":"screenshot","time":6594},{"type":"mousemove","time":6764,"x":503,"y":167},{"type":"mousemove","time":6966,"x":520,"y":168},{"type":"mousemove","time":7177,"x":541,"y":168},{"type":"mousemove","time":7381,"x":566,"y":165},{"type":"mousemove","time":7582,"x":582,"y":165},{"type":"mousemove","time":7791,"x":598,"y":164},{"type":"mousemove","time":7993,"x":605,"y":163},{"type":"mousemove","time":8198,"x":613,"y":163},{"type":"mousemove","time":8400,"x":621,"y":163},{"type":"mousemove","time":8609,"x":628,"y":163},{"type":"mousemove","time":8815,"x":630,"y":163},{"type":"mousemove","time":9025,"x":632,"y":164},{"type":"screenshot","time":9057}],"scrollY":0,"scrollX":0,"timestamp":1687300745407}] \ No newline at end of file diff --git a/test/runTest/actions/axisPointer-triggerOnNull.json b/test/runTest/actions/axisPointer-triggerOnNull.json new file mode 100644 index 0000000000..29f9fe71c3 --- /dev/null +++ b/test/runTest/actions/axisPointer-triggerOnNull.json @@ -0,0 +1 @@ +[{"name":"Action 1","ops":[{"type":"mousemove","time":548,"x":123,"y":162},{"type":"mousemove","time":758,"x":131,"y":163},{"type":"mousemove","time":975,"x":142,"y":165},{"type":"mousemove","time":1182,"x":149,"y":165},{"type":"mousemove","time":1391,"x":158,"y":165},{"type":"mousemove","time":1599,"x":171,"y":165},{"type":"mousemove","time":1810,"x":179,"y":165},{"type":"screenshot","time":1996},{"type":"mousemove","time":2016,"x":181,"y":165},{"type":"mousemove","time":2225,"x":234,"y":165},{"type":"mousemove","time":2431,"x":263,"y":165},{"type":"mousemove","time":2631,"x":274,"y":165},{"type":"mousemove","time":2832,"x":287,"y":166},{"type":"mousemove","time":3033,"x":303,"y":167},{"type":"mousemove","time":3234,"x":316,"y":167},{"type":"mousemove","time":3447,"x":326,"y":167},{"type":"mousemove","time":3649,"x":329,"y":167},{"type":"mousemove","time":3857,"x":333,"y":166},{"type":"screenshot","time":3977},{"type":"mousemove","time":4097,"x":333,"y":166},{"type":"mousemove","time":4305,"x":336,"y":166},{"type":"mousemove","time":4514,"x":355,"y":165},{"type":"mousemove","time":4716,"x":371,"y":165},{"type":"mousemove","time":4922,"x":394,"y":165},{"type":"mousemove","time":5127,"x":411,"y":166},{"type":"mousemove","time":5331,"x":428,"y":166},{"type":"mousemove","time":5531,"x":442,"y":167},{"type":"mousemove","time":5731,"x":456,"y":168},{"type":"mousemove","time":5932,"x":468,"y":168},{"type":"mousemove","time":6143,"x":482,"y":168},{"type":"mousemove","time":6351,"x":496,"y":167},{"type":"mousemove","time":6557,"x":500,"y":167},{"type":"screenshot","time":6594},{"type":"mousemove","time":6764,"x":503,"y":167},{"type":"mousemove","time":6966,"x":520,"y":168},{"type":"mousemove","time":7177,"x":541,"y":168},{"type":"mousemove","time":7381,"x":566,"y":165},{"type":"mousemove","time":7582,"x":582,"y":165},{"type":"mousemove","time":7791,"x":598,"y":164},{"type":"mousemove","time":7993,"x":605,"y":163},{"type":"mousemove","time":8198,"x":613,"y":163},{"type":"mousemove","time":8400,"x":621,"y":163},{"type":"mousemove","time":8609,"x":628,"y":163},{"type":"mousemove","time":8815,"x":630,"y":163},{"type":"mousemove","time":9025,"x":632,"y":164},{"type":"screenshot","time":9057}],"scrollY":0,"scrollX":0,"timestamp":1687300745407}] \ No newline at end of file