Match-id-73c0fd446aab80ee0e351fda1a6d575656e751f4

This commit is contained in:
* 2021-12-22 20:03:34 +08:00 committed by *
parent f7f9956ddc
commit 325d9571ec
3 changed files with 109 additions and 0 deletions

View File

@ -0,0 +1,75 @@
import {HorizonDom} from './Interface';
/**
* input textarea
* @param currentDoc document
*/
export function getFocusedDom(currentDoc?: Document): HorizonDom | void {
let currentDocument;
if (currentDoc) {
currentDocument = currentDoc;
} else {
if (document) {
currentDocument = document;
}
}
if (!currentDocument) {
return null;
} else if (currentDocument.activeElement) {
return currentDocument.activeElement;
} else {
return currentDocument.body;
}
}
// 如果 input 或者 textarea 元素中有文字被选中时activeElement 属性就会返回该元素
// 此处是为了返回深层的 iframe 中的真实元素
export function getIFrameFocusedDom() {
const currentWindow = window;
let focusedDom = getFocusedDom();
// 深度优先,返回的元素如果是 iframe 对象则继续查找
while (focusedDom instanceof currentWindow.HTMLIFrameElement) {
try {
// 访问 HTMLIframeElement 的 contentDocument 可能会导致浏览器抛出错误
if (typeof focusedDom.contentWindow.location.href === 'string') { // iframe 的内容为同源
focusedDom = getFocusedDom(focusedDom.contentWindow.document);
} else { // 非同源 iframe 因为安全性原因无法获取其中的具体元素
break;
}
} catch (e) { // 非同源 iframe 因为安全性原因无法获取其中的具体元素
break;
}
}
return focusedDom;
}
export function isElement(dom) {
return dom.nodeType === 1;
}
export function isText(dom) {
return dom.nodeType === 3;
}
export function isComment(dom) {
return dom.nodeType === 8;
}
export function isDocument(dom) {
return dom.nodeType === 9;
}
export function isDocumentFragment(dom) {
return dom.nodeType === 11;
}
export function getRootElement(dom: HorizonDom): HorizonDom {
let rootElement = dom;
while (rootElement.parentNode) {
// @ts-ignore
rootElement = rootElement.parentNode;
}
return rootElement;
}

View File

@ -0,0 +1,25 @@
export const NSS = {
html: 'http://www.w3.org/1999/xhtml',
math: 'http://www.w3.org/1998/Math/MathML',
svg: 'http://www.w3.org/2000/svg',
};
// 创建DOM元素
export function createDom(
tagName: string,
props: Object,
parentNamespace: string,
): Element {
let dom: Element;
const selfNamespace = NSS[tagName] || NSS.html;
const ns = parentNamespace !== NSS.html ? parentNamespace : selfNamespace;
if (ns !== NSS.html) {
dom = document.createElementNS(ns, tagName);
} else {
dom = document.createElement(tagName);
}
return dom;
}

View File

@ -0,0 +1,9 @@
export interface IProperty {
[propName: string]: any
}
export interface HorizonSelect extends HTMLSelectElement {
_multiple: boolean;
}
export type HorizonDom = Element | HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;