2012-01-12 3 views
1

Предположим, что у меня есть следующий фрагмент кода HTML:HTML DOM имя элемента в виде строки

<input type="text" id="myinput" /> 

Теперь я хочу, чтобы получить, что DOM элемент с помощью JavaScript:

var element = document.getElementById("myinput"); 

работает отлично, никаких проблем до сих пор ,

Но когда я печатаю его внутри окна предупреждения, используя alert(element);, он отображает object HTMLInputElement.
Есть ли способ получить это имя элемента (HTMLInputElement) в виде строки?

(Обратите внимание, что, когда говорят «имя элемента» Я не имею в видуnameатрибут элемента, а имя, как оно отображается при использовании alert(), например, как описано выше.

+0

Лучшее решение может зависеть от того, d имя. Можете ли вы рассказать о том, в чем вы нуждаетесь? – Alohci

ответ

4

В некоторых браузерах such as Firefox (и Chrome, потенциально другие), вы можете сделать:

element.constructor.name; // => "HTMLInputElement" 

Но в целом это a bit more complicated, возможно, даже не вполне надежным. Самый простой способ может быть такой:

function getClassName(o) { 
    // TODO: a better regex for all browsers... 
    var m = (o).toString().match(/\[object (.*?)\]/); 
    return (m) ? m[1] : typeof o; 
} 
getClassName(element); // => "HTMLInputElement" 
getClassName(123); // => "number" 

[Редактировать]

Или, используя the "nodeName" attribute, вы могли бы написать функцию полезности, которая должна быть как правило, гораздо более надежными:

function getHtmlElementClassName(htmlElement) { 
    var n = htmlElement.nodeName; 
    if (n.matches(/^H(\d)$/)) { 
    return "HTMLHeadingElement"; 
    } else if (/* other exceptional cases? */) { 
    // ... 
    } else { 
    return "HTML" + n.charAt(0) + n.substr(1).toLowerCase() + "Element"; 
    } 
} 

(Спасибо @Esailija за более разумную реализацию, @Alohci за указание исключительных случаев.)

+0

Вместо того, чтобы записывать 35100 коммутационных шкафов, вы можете просто сделать что-то вроде «HTML» + nodename.charAt (0) + nodename.substr (1) .toLowerCase() + «Element»; ' – Esailija

+0

@Esailija: да, намного лучше =) – maerics

+0

@maerics @Esailija Означает ли это, что 'HTMLInputElement' не является фактическим (классом) именем объекта? –

2
+1

Или из спецификации, а не (довольно хороший) мета-сайт: http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-F68D095 –

+0

Неправильно, он отображает 'INPUT', а не' HTMLInputElement'. –

+0

'nodeName' просто возвращает 'INPUT' –

0

document.getElementById возвращает HTML-элемент в качестве объекта. Просто получить атрибут объекта, который вы хотите дис вместо этого играйте в предупреждении (например, alert(element.getAttribute('ID'));). Кроме того, если вы хотите, чтобы в предупреждении отображался «[объект HTMLInputElement]», просто вызовите метод toString() для объекта в предупреждении (например, alert(element.toString());).

Надеется, что это помогает,

Пит

+0

Я думаю, вы хотите снова прочитать вопрос. :-) –

+0

Сообщение было обновлено, это было не так ясно ИМО, когда это было опубликовано. – Craig

+0

Перечитайте вопрос и продлите мой ответ. Благодаря! – pete

0

, если я правильно получил вопрос, который вы должны попробовать document.getElementById("myinput").toString().

1

При передаче объекта функции alert() он неявно вызывает .toString() на этом объекте, чтобы получить текст для предупреждения. Вы могли бы сделать что-то вроде:

var element = document.getElementById("myInput"); 
var string = element.toString(); // this will return 'object HTMLInputElement' 

затем работать с переменной string получить только HTMLInputElement часть.

+1

Вздох, а не нет. Например, в IE7 он возвращает '' [object] "'. Гораздо лучше получить '.nodeName' и добавить часть HTML и Element самостоятельно, если это вообще важно. – Esailija

Смежные вопросы