From c9de3e4d732abc1804c30ea46ebc23834e1d17fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8C=E8=B4=A7=E7=88=B1=E5=90=83=E7=99=BD=E8=90=9D?= =?UTF-8?q?=E5=8D=9C?= Date: Wed, 15 Mar 2023 11:48:28 +0800 Subject: [PATCH] feat: support isDOM (#432) --- src/Dom/findDOMNode.ts | 10 ++++++++-- tests/findDOMNode.test.tsx | 7 ++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/Dom/findDOMNode.ts b/src/Dom/findDOMNode.ts index 2026f3a7..432ced2b 100644 --- a/src/Dom/findDOMNode.ts +++ b/src/Dom/findDOMNode.ts @@ -1,13 +1,19 @@ import React from 'react'; import ReactDOM from 'react-dom'; +export function isDOM(node: any) { + // https://developer.mozilla.org/en-US/docs/Web/API/Element + // Since XULElement is also subclass of Element, we only need HTMLElement and SVGElement + return node instanceof HTMLElement || node instanceof SVGElement; +} + /** * Return if a node is a DOM node. Else will return by `findDOMNode` */ export default function findDOMNode( - node: React.ReactInstance | HTMLElement, + node: React.ReactInstance | HTMLElement | SVGElement, ): T { - if (node instanceof HTMLElement) { + if (isDOM(node)) { return node as unknown as T; } diff --git a/tests/findDOMNode.test.tsx b/tests/findDOMNode.test.tsx index 8666db4e..be4b6533 100644 --- a/tests/findDOMNode.test.tsx +++ b/tests/findDOMNode.test.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import { render } from '@testing-library/react'; +import * as React from 'react'; import findDOMNode from '../src/Dom/findDOMNode'; describe('findDOMNode', () => { @@ -55,4 +55,9 @@ describe('findDOMNode', () => { expect(errSpy).toHaveBeenCalled(); errSpy.mockRestore(); }); + + it('support svg', () => { + const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); + expect(findDOMNode(svg)).toBe(svg); + }); });