在使用 querySelectorAll 之前仅检查参数是否为节点是否可靠?

Is it reliable to only check if an argument is a node before using querySelectorAll on it?

目前,我看到 querySelectorAll 方法在 document which is a node and not an element, and found on HTML elements 上找到。

我正在使用一个函数,它接受节点、元素或选择器作为第一个参数,然后找到一个元素。我需要检查节点的类型,因为函数应该工作是传入 document

function queryElement(elementOrSelector) {
    if (!isNode(elementOrSelector)) {
        elementOrSelector = document.querySelector(elementOrSelector);
    }
    // This next line is the line I worry about
    var possibleElements = elementOrSelector.querySelector('[test]');
    ...
}

function isNode(o) {
    return (
        typeof Node === "object" ? o instanceof Node :
        o && typeof o === "object" && typeof o.nodeType === "number" && typeof o.nodeName === "string"
    );
}

这允许我传递以下内容:

queryElement(document);
// or
queryElement(document.querySelector('select'));

它们都会起作用。但是现在,我只是检查它们是否属于 node 类型,从技术上讲,querySelectorAll 方法仅存在于 document 上,而 HTML Element 原型。我相信 Element 继承自 Node 所以这就是它大部分工作的原因。但是,如果我只检查 node 的类型,我会 运行 出问题吗?是否有一个特定的 node 也不是 Element 而没有 querySelectorAll 可用?

Is there a particular node that is also not an Element that will not have querySelectorAll available to it?

是的。例如:

  • 属性节点(在 DOM4 中删除)
  • 文档类型
  • 文本节点
  • 评论节点

我认为检查某物是否是节点的唯一可靠方法是尝试将其用作节点,并查看它是否抛出错误。

然而,检查对象是否有 querySelector 属性(也许它的值是一个函数)可能就足够了。