Задача чисто на интерес: можно ли написать функцию, которая проверяет является ли объект DOM-элементом, и которую невозможно обмануть, даже нарочно?
Проверять наличие tagName, nodeType не вариант - очень легко подать обычный объект:
var fake = { tagName : "DIV" }
Такая функция:
function isDOMElement(target) {
try {
document.createDocumentFragment().appendChild(target.cloneNode());
} catch (e) {
return false;
}
return true;
}
выглядит неплохо, но её можно обмануть, подав такой объект:
var fake = { cloneNode : function () { return document.createElement("DIV"); } }
Другой вариант:
function isDOMElement(target) {
try {
target.parentNode.insertBefore(target, target);
} catch (e) {
return false;
}
return true;
}
Её уже не провести, т.к. нативный insertBefore бросит исключение.
Но, к сожалению, не работает с новосозданными элементами, ведь у них нет parentNode:
isDOMElement( document.createElement("DIV") ); // false
Так как же быть?