Файл: library/wysihtml5/src/dom/get_parent_element.js
Строк: 139
<?php
/**
* Walks the dom tree from the given node up until it finds a match
* Designed for optimal performance.
*
* @param {Element} node The from which to check the parent nodes
* @param {Object} matchingSet Object to match against (possible properties: nodeName, className, classRegExp)
* @param {Number} [levels] How many parents should the function check up from the current node (defaults to 50)
* @return {null|Element} Returns the first element that matched the desiredNodeName(s)
* @example
* var listElement = wysihtml5.dom.getParentElement(document.querySelector("li"), { nodeName: ["MENU", "UL", "OL"] });
* // ... or ...
* var unorderedListElement = wysihtml5.dom.getParentElement(document.querySelector("li"), { nodeName: "UL" });
* // ... or ...
* var coloredElement = wysihtml5.dom.getParentElement(myTextNode, { nodeName: "SPAN", className: "wysiwyg-color-red", classRegExp: /wysiwyg-color-[a-z]/g });
*/
wysihtml5.dom.getParentElement = (function() {
function _isSameNodeName(nodeName, desiredNodeNames) {
if (!desiredNodeNames || !desiredNodeNames.length) {
return true;
}
if (typeof(desiredNodeNames) === "string") {
return nodeName === desiredNodeNames;
} else {
return wysihtml5.lang.array(desiredNodeNames).contains(nodeName);
}
}
function _isElement(node) {
return node.nodeType === wysihtml5.ELEMENT_NODE;
}
function _hasClassName(element, className, classRegExp) {
var classNames = (element.className || "").match(classRegExp) || [];
if (!className) {
return !!classNames.length;
}
return classNames[classNames.length - 1] === className;
}
function _getParentElementWithNodeName(node, nodeName, levels) {
while (levels-- && node && node.nodeName !== "BODY") {
if (_isSameNodeName(node.nodeName, nodeName)) {
return node;
}
node = node.parentNode;
}
return null;
}
function _getParentElementWithNodeNameAndClassName(node, nodeName, className, classRegExp, levels) {
while (levels-- && node && node.nodeName !== "BODY") {
if (_isElement(node) &&
_isSameNodeName(node.nodeName, nodeName) &&
_hasClassName(node, className, classRegExp)) {
return node;
}
node = node.parentNode;
}
return null;
}
return function(node, matchingSet, levels) {
levels = levels || 50; // Go max 50 nodes upwards from current node
if (matchingSet.className || matchingSet.classRegExp) {
return _getParentElementWithNodeNameAndClassName(
node, matchingSet.nodeName, matchingSet.className, matchingSet.classRegExp, levels
);
} else {
return _getParentElementWithNodeName(
node, matchingSet.nodeName, levels
);
}
};
})();
?>