devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
199 lines (198 loc) • 7.73 kB
JavaScript
/**
* DevExtreme (core/utils/dom.js)
* Version: 18.2.18
* Build date: Tue Oct 18 2022
*
* Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
"use strict";
var $ = require("../../core/renderer"),
config = require("../../core/config"),
domAdapter = require("../../core/dom_adapter"),
windowUtils = require("./window"),
window = windowUtils.getWindow(),
eventsEngine = require("../../events/core/events_engine"),
inArray = require("./array").inArray,
typeUtils = require("./type"),
isDefined = typeUtils.isDefined,
isRenderer = typeUtils.isRenderer,
htmlParser = require("../../core/utils/html_parser"),
elementStrategy;
var resetActiveElement = function() {
var activeElement = domAdapter.getActiveElement();
if (activeElement && activeElement !== domAdapter.getBody() && activeElement.blur) {
activeElement.blur()
}
};
var clearSelection = function() {
var 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) {}
}
}
};
var closestCommonParent = function(startTarget, endTarget) {
var $startTarget = $(startTarget),
$endTarget = $(endTarget);
if ($startTarget[0] === $endTarget[0]) {
return $startTarget[0]
}
var $startParents = $startTarget.parents(),
$endParents = $endTarget.parents(),
startingParent = Math.min($startParents.length, $endParents.length);
for (var i = -startingParent; i < 0; i++) {
if ($startParents.get(i) === $endParents.get(i)) {
return $startParents.get(i)
}
}
};
var triggerVisibilityChangeEvent = function(eventName) {
var VISIBILITY_CHANGE_SELECTOR = ".dx-visibility-change-handler";
return function(element) {
var $element = $(element || "body");
var changeHandlers = $element.filter(VISIBILITY_CHANGE_SELECTOR).add($element.find(VISIBILITY_CHANGE_SELECTOR));
for (var i = 0; i < changeHandlers.length; i++) {
eventsEngine.triggerHandler(changeHandlers[i], eventName)
}
}
};
var uniqueId = function() {
var counter = 0;
return function(prefix) {
return (prefix || "") + counter++
}
}();
var dataOptionsAttributeName = "data-options";
var getElementOptions = function(element) {
var optionsString = $(element).attr(dataOptionsAttributeName) || "";
return config().optionsParser(optionsString)
};
var createComponents = function(elements, componentTypes) {
var result = [],
selector = "[" + dataOptionsAttributeName + "]";
var $items = elements.find(selector).add(elements.filter(selector));
$items.each(function(index, element) {
var $element = $(element),
options = getElementOptions(element);
for (var componentName in options) {
if (!componentTypes || inArray(componentName, componentTypes) > -1) {
if ($element[componentName]) {
$element[componentName](options[componentName]);
result.push($element[componentName]("instance"))
}
}
}
});
return result
};
var createMarkupFromString = function(str) {
if (!window.WinJS) {
return $(htmlParser.parseHTML(str))
}
var tempElement = $("<div>");
window.WinJS.Utilities.setInnerHTMLUnsafe(tempElement.get(0), str);
return tempElement.contents()
};
var extractTemplateMarkup = function(element) {
element = $(element);
var templateTag = element.length && element.filter(function() {
var $node = $(this);
return $node.is("script[type]") && $node.attr("type").indexOf("script") < 0
});
if (templateTag.length) {
return templateTag.eq(0).html()
} else {
element = $("<div>").append(element);
return element.html()
}
};
var normalizeTemplateElement = function normalizeTemplateElement(element) {
var $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
};
var toggleAttr = function($target, attr, value) {
value ? $target.attr(attr, value) : $target.removeAttr(attr)
};
var clipboardText = function(event, text) {
var clipboard = event.originalEvent && event.originalEvent.clipboardData || window.clipboardData;
if (1 === arguments.length) {
return clipboard && clipboard.getData("Text")
}
clipboard && clipboard.setData("Text", text)
};
var contains = function(container, element) {
if (!element) {
return false
}
element = domAdapter.isTextNode(element) ? element.parentNode : element;
return domAdapter.isDocument(container) ? container.documentElement.contains(element) : container.contains(element)
};
var getPublicElement = function($element) {
return elementStrategy($element)
};
var setPublicElementWrapper = function(value) {
elementStrategy = value
};
setPublicElementWrapper(function(element) {
return element && element.get(0)
});
var createTextElementHiddenCopy = function(element, text, options) {
var elementStyles = window.getComputedStyle($(element).get(0));
var 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: "nowrap",
position: "absolute",
"float": "left"
})
};
exports.setPublicElementWrapper = setPublicElementWrapper;
exports.resetActiveElement = resetActiveElement;
exports.createMarkupFromString = createMarkupFromString;
exports.triggerShownEvent = triggerVisibilityChangeEvent("dxshown");
exports.triggerHidingEvent = triggerVisibilityChangeEvent("dxhiding");
exports.triggerResizeEvent = triggerVisibilityChangeEvent("dxresize");
exports.getElementOptions = getElementOptions;
exports.createComponents = createComponents;
exports.extractTemplateMarkup = extractTemplateMarkup;
exports.normalizeTemplateElement = normalizeTemplateElement;
exports.clearSelection = clearSelection;
exports.uniqueId = uniqueId;
exports.closestCommonParent = closestCommonParent;
exports.clipboardText = clipboardText;
exports.toggleAttr = toggleAttr;
exports.contains = contains;
exports.getPublicElement = getPublicElement;
exports.createTextElementHiddenCopy = createTextElementHiddenCopy;