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

时间:2016-07-22 03:53:42

标签: javascript dom selectors-api

目前,我发现方法querySelectorAll位于documentnode而不是元素,可在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没有// For each row for (int i = 0; i < descs.rows; ++i) { // Perform L1 normalization cv::normalize(descs.row(i), descs.row(i), 1.0, 0.0, cv::NORM_L1); } // Perform sqrt on the whole descriptor matrix cv::sqrt(descs, descs);

1 个答案:

答案 0 :(得分:1)

  

是否存在不属于Element的特定节点   有querySelectorAll可用吗?

是。例如:

  • 属性节点(在DOM4中删除)
  • DOCTYPES
  • 文字节点
  • 评论节点

我认为检查某些节点是否为节点的唯一可靠方法是尝试将其用作节点,并查看是否会引发错误。

但是,检查对象是否具有querySelector属性(可能它的值是函数)可能就足够了。