在使用 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
属性(也许它的值是一个函数)可能就足够了。
目前,我看到 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 havequerySelectorAll
available to it?
是的。例如:
- 属性节点(在 DOM4 中删除)
- 文档类型
- 文本节点
- 评论节点
我认为检查某物是否是节点的唯一可靠方法是尝试将其用作节点,并查看它是否抛出错误。
然而,检查对象是否有 querySelector
属性(也许它的值是一个函数)可能就足够了。