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); + }); });