@@ -68,6 +68,25 @@ if (empty) $.fn.empty = empty
6868
6969export default $
7070
71+ import { toString } from './util'
72+
73+ export const isDocument = ( value : any ) : value is Document => {
74+ return toString ( value ) === '[object HTMLDocument]'
75+ }
76+
77+ export const isShadowRoot = ( value : any ) : value is ShadowRoot => {
78+ return toString ( value ) === '[object ShadowRoot]'
79+ }
80+
81+ export const isDataTransfer = ( value : any ) : value is DataTransfer => {
82+ return toString ( value ) === '[object DataTransfer]'
83+ }
84+
85+ const HTML_ELEMENT_STR_REG_EXP = / \[ o b j e c t H T M L ( [ A - Z ] [ a - z ] * ) ? E l e m e n t \] /
86+ export const isHTMLElememt = ( value : any ) : value is HTMLElement => {
87+ return HTML_ELEMENT_STR_REG_EXP . test ( toString ( value ) )
88+ }
89+
7190// ------------------------------- 分割线,以下内容参考 slate-react dom.ts -------------------------------
7291
7392// COMPAT: This is required to prevent TypeScript aliases from doing some very
@@ -109,20 +128,14 @@ export const isDOMElement = (value: any): value is DOMElement => {
109128 * Check if a value is a DOM node.
110129 */
111130export const isDOMNode = ( value : any ) : value is DOMNode => {
112- const window = getDefaultView ( value )
113- return (
114- ! ! window &&
115- // @ts -ignore
116- value instanceof window . Node
117- )
131+ return value != null && typeof value . nodeType === 'number'
118132}
119133
120134/**
121135 * Check if a value is a DOM selection.
122136 */
123137export const isDOMSelection = ( value : any ) : value is DOMSelection => {
124- const window = value && value . anchorNode && getDefaultView ( value . anchorNode )
125- return ! ! window && value instanceof window . Selection
138+ return toString ( value ) === '[object Selection]'
126139}
127140
128141/**
@@ -343,7 +356,7 @@ export function walkTextNodes(
343356 handler : ( textNode : DOMNode , parent : DOMElement ) => void
344357) {
345358 // void elem 内部的 text 不处理
346- if ( elem instanceof HTMLElement && elem . dataset . slateVoid === 'true' ) return
359+ if ( isHTMLElememt ( elem ) && elem . dataset . slateVoid === 'true' ) return
347360
348361 for ( let nodes = elem . childNodes , i = nodes . length ; i -- ; ) {
349362 const node = nodes [ i ]
0 commit comments