Вход Регистрация
Файл: 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(nodeNamedesiredNodeNames) {
    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(elementclassNameclassRegExp) {
    var 
classNames = (element.className || "").match(classRegExp) || [];
    if (!
className) {
      return !!
classNames.length;
    }
    return 
classNames[classNames.length 1] === className;
  }
  
  function 
_getParentElementWithNodeName(nodenodeNamelevels) {
    while (
levels-- && node && node.nodeName !== "BODY") {
      if (
_isSameNodeName(node.nodeNamenodeName)) {
        return 
node;
      }
      
node node.parentNode;
    }
    return 
null;
  }
  
  function 
_getParentElementWithNodeNameAndClassName(nodenodeNameclassNameclassRegExplevels) {
    while (
levels-- && node && node.nodeName !== "BODY") {
      if (
_isElement(node) &&
          
_isSameNodeName(node.nodeNamenodeName) &&
          
_hasClassName(nodeclassNameclassRegExp)) {
        return 
node;
      }
      
node node.parentNode;
    }
    return 
null;
  }
  
  return function(
nodematchingSetlevels) {
    
levels levels || 50// Go max 50 nodes upwards from current node
    
if (matchingSet.className || matchingSet.classRegExp) {
      return 
_getParentElementWithNodeNameAndClassName(
        
nodematchingSet.nodeNamematchingSet.classNamematchingSet.classRegExplevels
      
);
    } else {
      return 
_getParentElementWithNodeName(
        
nodematchingSet.nodeNamelevels
      
);
    }
  };
})();
?>
Онлайн: 1
Реклама