在节点列表中查找节点

Find nodes in nodelist

我有一个这样的节点列表:

[text, div.post, comment, text, div.post, comment, text, div.post, comment, text, div.post, comment, text, div.post, comment, text]

这个节点列表是 ajax 调用的结果,div.post 是我的帖子,我想 select 它添加新的类名。

如何使用 vanilla javascript 从这个节点列表 select div.post

只需遍历它并添加 class。由于你不能按原样循环,你可以使用 Array.forEachFunction.call

[].forEach.call(nodelist, function(elm){
   if(elm.className.indexOf("post") > -1 && elm.nodeName == "DIV")
      elm.className += ' classNameHere';  
});

此处:https://developer.mozilla.org/en-US/docs/Web/API/NodeList.item

nodelist = [text, div.post, comment, text, div.post, comment, text, div.post, comment, text, div.post, comment, text, div.post, comment, text];

youritem = nodelist.item(1);

要遍历并找到所有符合条件的内容,您必须像 Amit 的回答那样进行循环。否则上面的解决方案将适用于挑选它。

喜欢 itmars 和 Amit Jokis 在 for 循环中的回答

 nodelist = [text, div.post, comment, text, div.post, comment, text, div.post, comment, text, div.post, comment, text, div.post, comment, text];
 for(var i=0; i< nodelist.length;i++){
      var nodeItem = nodelist.item(i);
      if(nodeItem.nodeName=="div" && (nodeItem.className.indexOf("post") > -1)){
           //do your stuff
      }
 }

您可以编写一个选择器查找器。这不是太具体,但肯定需要改进。您可以通过 class idtagName 找到选择器。它将 return 来自 NodeList 的第一个。

演示

var children = document.getElementById('foo').childNodes;

findAndPrint('#bar', children);
findAndPrint('div#baz', children);

function findAndPrint(selector, nodeList) {
  print('>> Found?: ' + JSON.stringify(toEl(getNodeBySelector(nodeList, selector))));
}

function print(str) {
  document.getElementById('out').innerHTML += str + '<br />';
}

function getNodeBySelector(nodeList, selector) {
  var parts = selector.split(/(?=[#\.])/g);
  for (var i = 0; i < nodeList.length; i++) {
    var node = nodeList[i];
    if (node !== undefined && isElement(node)) {
      var el = toEl(node);
      if (isMatch(el, parts)) {
        return node;
      }
    }
  };
  return undefined;
}

function isElement(node) {
  try {
    return node instanceof HTMLElement;
  } catch (e) {
    return (typeof node === "object") &&
      (node.nodeType === 1) && (typeof node.style === "object") &&
      (typeof node.ownerDocument === "object");
  }
}

function toEl(node) {
  if (node) {
    return {
      'name': node.tagName.toLowerCase(),
      'id': node.getAttribute('id'),
      'class': node.getAttribute('class')
    };
  }
  return undefined;
}

function isMatch(el, parts) {
  for (var i = 0; i < parts.length; i++) {
    var part = parts[i];
    if (part.indexOf('.') == 0) {
      if (el.class != null && el.class.indexOf(part.substr(1)) === -1) {
        return false;
      }
    } else if (part.indexOf('#') == 0) {
      if (el.id != null && el.id !== part.substr(1)) {
        return false;
      }
    } else {
      if (el.name != null && el.name !== part) {
        return false;
      }
    }
  }
  return true;
}
<div id="out"></div>

<div id="foo">
  <div id="bar"></div>
  <div id="baz"></div>
</div>

还有...

您可以修改 NodeList 中的每个节点,而不是使用以下方法返回第一个元素:

function applyToNode(nodeList, selector, callback) {
  var parts = selector.split(/(?=[#\.])/g);
  for (var i = 0; i < nodeList.length; i++) {
    var node = nodeList[i];
    if (node !== undefined && isElement(node)) {
      if (isMatch(toEl(node), parts)) {
        callback(node, i, nodeList);
      }
    }
  };
}

回调在哪里:

function callback(node, index, nodeList) {
  // ...
}