Все решения выше и ниже (включая мое решение) подвержены ошибкам, особенно в IE & mdash; вполне возможно (пере) определить некоторые объекты / методы / свойства для имитации узла DOM, делающего тест недействительным.
Поэтому обычно я использую тестирование в стиле утиной типографии: я тестирую специально для того, что использую. Например, если я хочу клонировать узел, я проверяю его следующим образом:
if(typeof node == "object" && "nodeType" in node &&
node.nodeType === 1 && node.cloneNode){
// most probably this is a DOM node, we can clone it safely
clonedNode = node.cloneNode(false);
}
По сути, это небольшая проверка работоспособности + прямой тест для метода (или свойства), который я планирую использовать.
Между прочим, приведенный выше тест является хорошим тестом для узлов DOM во всех браузерах. Но если вы хотите быть в безопасности, всегда проверяйте наличие методов и свойств и проверяйте их типы.
РЕДАКТИРОВАТЬ: IE использует объекты ActiveX для представления узлов, поэтому их свойства не ведут себя как истинный объект JavaScript, например:
console.log(typeof node.cloneNode); // object
console.log(node.cloneNode instanceof Function); // false
в то время как он должен возвращать «функцию» и true
соответственно. Единственный способ проверить методы - это определить, определены ли они.