в javascript, как вы определяете тип объекта dom, например, HTMLLIElement или HTMLElement

#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__ возвращает функцию конструктора узла