office-ui-fabric-react
Version:
Reusable React components for building experiences for Office 365.
102 lines (100 loc) • 3.03 kB
JavaScript
/**
* Sets the virtual parent of an element.
* Pass `undefined` as the `parent` to clear the virtual parent.
*
* @export
* @param {HTMLElement} child
* @param {HTMLElement} parent
*/
function setVirtualParent(child, parent) {
var virtualChild = child;
var virtualParent = parent;
if (!virtualChild._virtual) {
virtualChild._virtual = {
children: []
};
}
var oldParent = virtualChild._virtual.parent;
if (oldParent && oldParent !== parent) {
// Remove the child from its old parent.
var index = oldParent._virtual.children.indexOf(virtualChild);
if (index > -1) {
oldParent._virtual.children.splice(index, 1);
}
}
virtualChild._virtual.parent = virtualParent || undefined;
if (virtualParent) {
if (!virtualParent._virtual) {
virtualParent._virtual = {
children: []
};
}
virtualParent._virtual.children.push(virtualChild);
}
}
exports.setVirtualParent = setVirtualParent;
function getVirtualParent(child) {
var parent;
if (isVirtualElement(child)) {
parent = child._virtual.parent;
}
return parent;
}
exports.getVirtualParent = getVirtualParent;
/**
* Gets the element which is the parent of a given element.
* If `allowVirtuaParents` is `true`, this method prefers the virtual parent over
* real DOM parent when present.
*
* @export
* @param {HTMLElement} child
* @param {boolean} [allowVirtualParents=true]
* @returns {HTMLElement}
*/
function getParent(child, allowVirtualParents) {
if (allowVirtualParents === void 0) { allowVirtualParents = true; }
return allowVirtualParents && getVirtualParent(child) || child.parentElement;
}
exports.getParent = getParent;
/**
* Determines whether or not a parent element contains a given child element.
* If `allowVirtualParents` is true, this method may return `true` if the child
* has the parent in its virtual element hierarchy.
*
* @export
* @param {HTMLElement} parent
* @param {HTMLElement} child
* @param {boolean} [allowVirtualParents=true]
* @returns {boolean}
*/
function elementContains(parent, child, allowVirtualParents) {
if (allowVirtualParents === void 0) { allowVirtualParents = true; }
var isContained;
if (allowVirtualParents) {
isContained = false;
while (child) {
var nextParent = getParent(child);
if (nextParent === parent) {
isContained = true;
break;
}
child = nextParent;
}
}
else {
isContained = parent.contains(child);
}
return isContained;
}
exports.elementContains = elementContains;
/**
* Determines whether or not an element has the virtual hierarchy extension.
*
* @param {(HTMLElement | IVirtualElement)} element
* @returns {element is IVirtualElement}
*/
function isVirtualElement(element) {
return !!element._virtual;
}
//# sourceMappingURL=dom.js.map
;