javascript - 构建 DOM 中任何给定节点的 querySelector 字符串值

标签 javascript dom css-selectors selectors-api

我正在尝试找到一种方法来构建任何给定节点的 querySelector 字符串。换句话说 - 选择页面上的任何节点 - 是否可以遍历 DOM 并构建一个字符串,允许我将生成的字符串传递给 document.querySelector 并取回我选择的节点?

据我所知,querySelector 有一个错误,您只能在字符串中使用 nth-child 一次。

我已经尝试过多次,但到目前为止都未能找到解决方案。我想在 native JavaScript 中执行此操作,而不是 jQuery。有什么建议吗?

最佳答案

我看到这个问题是 2015 年的,但我刚刚处理了这个问题,并且必须构建一个自定义函数来执行此操作。

我制作了一个代码片段来测试它,只需单击任何元素,querySelector 就会在底部 div 中显示为字符串。

function getQuerySelector(elem) {

  var element = elem;
  var str = "";

  function loop(element) {

    // stop here = element has ID
    if(element.getAttribute("id")) {
      str = str.replace(/^/, " #" + element.getAttribute("id"));
      str = str.replace(/\s/, "");
      str = str.replace(/\s/g, " > ");
      return str;
    }

    // stop here = element is body
    if(document.body === element) {
      str = str.replace(/^/, " body");
      str = str.replace(/\s/, "");
      str = str.replace(/\s/g, " > ");
      return str;
    }

    // concat all classes in "queryselector" style
    if(element.getAttribute("class")) {
      var elemClasses = ".";
      elemClasses += element.getAttribute("class");
      elemClasses = elemClasses.replace(/\s/g, ".");
      elemClasses = elemClasses.replace(/^/g, " ");
      var classNth = "";

      // check if element class is the unique child
      var childrens = element.parentNode.children;

      if(childrens.length < 2) {
        return;
      }

      var similarClasses = [];

      for(var i = 0; i < childrens.length; i++) {
        if(element.getAttribute("class") == 
childrens[i].getAttribute("class")) {
          similarClasses.push(childrens[i]);
        }
      }

      if(similarClasses.length > 1) {
        for(var j = 0; j < similarClasses.length; j++) {
          if(element === similarClasses[j]) {
            j++;
            classNth = ":nth-of-type(" + j + ")";
            break;
          }
        }
      }

      str = str.replace(/^/, elemClasses + classNth);

    }
    else{

      // get nodeType
      var name = element.nodeName;
      name = name.toLowerCase();
      var nodeNth = "";

      var childrens = element.parentNode.children;

      if(childrens.length > 2) {
        var similarNodes = [];

        for(var i = 0; i < childrens.length; i++) {
          if(element.nodeName == childrens[i].nodeName) {
            similarNodes.push(childrens[i]);
          }
        }

        if(similarNodes.length > 1) {
          for(var j = 0; j < similarNodes.length; j++) {
            if(element === similarNodes[j]) {
              j++;
              nodeNth = ":nth-of-type(" + j + ")";
              break;
            }
          }
        }

      }

      str = str.replace(/^/, " " + name + nodeNth);

    }

    if(element.parentNode) {
      loop(element.parentNode);
    }
    else {
      str = str.replace(/\s/g, " > ");
      str = str.replace(/\s/, "");
      return str;
    }

  }

  loop(element);

  return str;


}

https://jsfiddle.net/wm6goeyw/

关于javascript - 构建 DOM 中任何给定节点的 querySelector 字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29787964/

相关文章:

python - 如何通过 Selenium 和 Python 点击​​某个元素

html - 如何在 CSS 中为特定段落下的多行文本着色?

javascript - 我的 AngularJS 1.x 应用程序在 Angular 2 之后还能运行吗?

javascript - SASS 编译可以,但 Gulp 不行

java - 使用 Dom 进行解析会产生类型不匹配

javascript - 使用 CSS 添加一个 div 到 DOM

javascript - AngularJS:在 ui-router 解析后无法访问 Controller 中的变量

javascript - 第一次加载时出现 Angularjs $on $routeChangeSuccess 错误

javascript - 您如何调试 Javascript 中的时序问题?

javascript - 通过祖 parent 的父类选择一个 css3 元素