#javascript #dom #html
#javascript #dom #HTML
Вопрос:
как я могу получить тип объекта с помощью элементов dom?
единственная подсказка, которую я вижу, — это
метод, использующий то же имя. многообещающе, что у него также есть наследование _
proto _
. _
proto _
правильный ли это путь, за исключением IE?
если да, то что бы
function getNodeType( node ) return string
// would return HTMLLIElement for example
function isNodeType( node, type ) return boolean
// whether node is or is inherited from that type
будет выглядеть следующим образом?
Комментарии:
1. Возможно, вы могли бы проанализировать его с помощью регулярного выражения…
Ответ №1:
instanceof
должно быть нормально, если вы имеете дело только с одним документом. Если вы тестируете объекты из другого фрейма, то instanceof
не будет работать:
document.body instanceof HTMLBodyElement // true
var iframe = document.body.appendChild(document.createElement('iframe'));
iframe.contentDocument.body instanceof HTMLBodyElement // false!
Вместо этого вам нужно выполнить сравнение строк. Это то, что в конечном итоге сделало Google Closure для реализации goog.isArray
(до Array.isArray([])
изобретения). Например:
iframe.contentDocument.body.toString() === '[object HTMLBodyElement]' // true
Но я бы рекомендовал просто использовать tagName
или nodeName
.
Комментарии:
1. проблема с использованием tagName или nodeName заключается в том, что они не симметричны с документом instanceof — even <code>. экземпляр тела «HTMLElement»</code> завершается с ошибкой, потому что «HTMLElement» заключен в кавычки, и нет автоматического преобразования между строками и типами объектов
Ответ №2:
Дает ли это вам то, что вы хотите?
el.tagName;
Или, посмотрите на instanceof
оператор.
Комментарии:
1. tagName вернет имя тега, например «li», «html»
2. по-видимому, близко, насколько это возможно. el.nodeName, вероятно, немного лучше.
3. Я обнаружил, что instanceof может доставить вам проблемы в x-browser. Таким образом, я бы предложил придерживаться проверки el.nodeName.
Ответ №3:
function isNodeType( node, type ){
return node instanceof type;
}
function getNodeType(node){
return node.__proto__;
}
var div = document.createElement("div");
isNodeType(div, HTMLDivElement); // true
getNodeType(div); // HTMLDivElement
Комментарии:
1. возвращает узел.__proto__ возвращает вновь созданный узел этого типа, это неправильно? думаю, мне нужно имя типа объекта, а не экземпляр типа объекта.
2. @cc young node.__proto__ возвращает функцию конструктора узла