Показать сообщение отдельно
  #1 (permalink)  
Старый 12.03.2017, 03:42
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

Пища для ума
Задача чисто на интерес: можно ли написать функцию, которая проверяет является ли объект 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


Так как же быть?
Ответить с цитированием