devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
171 lines (170 loc) • 5.98 kB
JavaScript
/**
* DevExtreme (esm/__internal/core/utils/m_dom.js)
* Version: 24.2.6
* Build date: Mon Mar 17 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
import domAdapter from "../../../core/dom_adapter";
import $ from "../../../core/renderer";
import {
each
} from "../../../core/utils/iterator";
import {
isDefined,
isRenderer,
isString,
isWindow
} from "../../../core/utils/type";
import {
getWindow
} from "../../../core/utils/window";
const window = getWindow();
const getRootNodeHost = element => {
if (!element.getRootNode) {
return
}
const {
host: host
} = element.getRootNode();
if (isString(host)) {
return
}
return host
};
export const resetActiveElement = () => {
const activeElement = domAdapter.getActiveElement();
if (activeElement && activeElement !== domAdapter.getBody()) {
var _activeElement$blur;
null === (_activeElement$blur = activeElement.blur) || void 0 === _activeElement$blur || _activeElement$blur.call(activeElement)
}
};
export const clearSelection = () => {
const selection = window.getSelection();
if (!selection) {
return
}
if ("Caret" === selection.type) {
return
}
if (selection.empty) {
selection.empty()
} else if (selection.removeAllRanges) {
try {
selection.removeAllRanges()
} catch (e) {}
}
};
export const closestCommonParent = (startTarget, endTarget) => {
const $startTarget = $(startTarget);
const $endTarget = $(endTarget);
if ($startTarget[0] === $endTarget[0]) {
return $startTarget[0]
}
const $startParents = $startTarget.parents();
const $endParents = $endTarget.parents();
const startingParent = Math.min($startParents.length, $endParents.length);
for (let i = -startingParent; i < 0; i++) {
if ($startParents.get(i) === $endParents.get(i)) {
return $startParents.get(i)
}
}
};
export const extractTemplateMarkup = element => {
element = $(element);
const templateTag = element.length && element.filter((function() {
const $node = $(this);
return $node.is("script[type]") && !$node.attr("type").includes("script")
}));
if (templateTag.length) {
return templateTag.eq(0).html()
}
element = $("<div>").append(element);
return element.html()
};
export const normalizeTemplateElement = element => {
let $element = isDefined(element) && (element.nodeType || isRenderer(element)) ? $(element) : $("<div>").html(element).contents();
if (1 === $element.length) {
if ($element.is("script")) {
$element = normalizeTemplateElement($element.html().trim())
} else if ($element.is("table")) {
$element = $element.children("tbody").contents()
}
}
return $element
};
export const clipboardText = (event, text) => {
const clipboard = event.originalEvent && event.originalEvent.clipboardData || window.clipboardData;
if (!text) {
return clipboard && clipboard.getData("Text")
}
clipboard && clipboard.setData("Text", text)
};
export const contains = (container, element) => {
if (!element) {
return false
}
if (isWindow(container)) {
return contains(container.document, element)
}
return container.contains(element) || contains(container, getRootNodeHost(element))
};
export const createTextElementHiddenCopy = (element, text, options) => {
const elementStyles = window.getComputedStyle($(element).get(0));
const includePaddings = options && options.includePaddings;
return $("<div>").text(text).css({
fontStyle: elementStyles.fontStyle,
fontVariant: elementStyles.fontVariant,
fontWeight: elementStyles.fontWeight,
fontSize: elementStyles.fontSize,
fontFamily: elementStyles.fontFamily,
letterSpacing: elementStyles.letterSpacing,
border: elementStyles.border,
paddingTop: includePaddings ? elementStyles.paddingTop : "",
paddingRight: includePaddings ? elementStyles.paddingRight : "",
paddingBottom: includePaddings ? elementStyles.paddingBottom : "",
paddingLeft: includePaddings ? elementStyles.paddingLeft : "",
visibility: "hidden",
whiteSpace: "pre",
position: "absolute",
float: "left"
})
};
export const insertBefore = (element, newElement) => {
if (newElement) {
domAdapter.insertElement(element.parentNode, newElement, element)
}
return element
};
export const replaceWith = (element, newElement) => {
if (!(newElement && newElement[0])) {
return
}
if (newElement.is(element)) {
return element
}
each(newElement, ((_, currentElement) => {
insertBefore(element[0], currentElement)
}));
element.remove();
return newElement
};
export const isElementInDom = $element => {
const element = null === $element || void 0 === $element ? void 0 : $element.get(0);
const shadowHost = null === element || void 0 === element ? void 0 : element.getRootNode().host;
return !!$(shadowHost || element).closest(getWindow().document).length
};
export default {
resetActiveElement: resetActiveElement,
clearSelection: clearSelection,
closestCommonParent: closestCommonParent,
extractTemplateMarkup: extractTemplateMarkup,
normalizeTemplateElement: normalizeTemplateElement,
clipboardText: clipboardText,
contains: contains,
createTextElementHiddenCopy: createTextElementHiddenCopy,
insertBefore: insertBefore,
replaceWith: replaceWith,
isElementInDom: isElementInDom
};