Использование Object.prototype.toString.call () для возврата типа объекта с Javascript - не работает в IE - PullRequest
4 голосов
/ 19 ноября 2010

Надеюсь, я смогу спросить об этом в понятной форме ...

В целом, я пытаюсь определить, с каким типом объекта я сейчас имею дело.

Я создаю коллекцию(HTML является примером, а не буквальным), и мне нужно отфильтровать мою коллекцию по определенным элементам, например:

        <div id="tabContentWrap">
            <div id="tab">
                <a href="http://somelink">Link Element</a><img src="img.jpg" alt="img" />
                <select id="my_select"><option value="1">1</option></select>
            </div>
        </div>

function getFilteredElements() {
    var tabContent = getElementsByClass("tabContentWrap", document.getElementById(tabWrapId), "div");

    for (var j = 0; j < tabContent.length; j++){
        tabContentLinks = tabContent[j].getElementsByTagName('*');
        for (var k = 0; k < tabContentLinks.length; k++){
            // Here i attempt to filter the collection
            if (tabContentLinks[k] == '[object HTMLSelectElement]') {
                alert("found select list");
            }
         }
     }
 }

, которая прекрасно работает в Mozilla, но не в Internet Explorer 8, tabContentLinks[k] возвращает [object] вместо[object 'ObjectType']

Итак, я исследовал и обнаружил, что вы можете использовать Object.prototype.toString.call(object) для получения типа объекта, который снова прекрасно работает в Mozilla, но возвращает [object Object] в IE8 ...

Iвызов

get_type(tabContentsLink[k]);

, который выполняет следующую функцию:

function get_type(thing){
    if (thing === null) return "[object Null]";
    // special case
    return Object.prototype.toString.call(thing);
}

Но это просто возвращает [object Object]

Возвращает ли Object.prototype.toString.call() тип объекта в IEили я очень далеко и лаю фонарный столб вместо дерева?

Ответы [ 4 ]

13 голосов
/ 19 ноября 2010

Ну, во-первых, я хочу сказать вам, что Object.prototype.toString возвращает значение внутреннего свойства [[Class]] объекта, на самом деле это не Тип .

Значение этого внутреннего свойства представляет специфицированную классификацию объекта (подробнее здесь ).

Javascript имеет только 6 типов языка : Объект, Строка, Число, Булево, Нулевое и Неопределенное , вот и все.

Значение внутреннего свойства [[Class]] для хост-объектов - как элементов DOM - может составлять что угодно , оно полностью зависит от реализации , для встроенных объектов безопасно использовать его - за исключением некоторых исключений в IE, как @Alex указал в статье, на которую ссылается его ответ -.

Вы работаете с элементами DOM и хотите выяснить, что это за узел, я предлагаю просто использовать свойство nodeName (пожалуйста, избегайте использования tagName) .

Свойство nodeName содержит имя узла, с которым вы работаете, в верхнем регистре, поэтому вы можете использовать его следующим образом:

function getFilteredElements() {
  var tabContent = getElementsByClass("tabContentWrap", 
  document.getElementById(tabWrapId), "div");

  for (var j = 0; j < tabContent.length; j++){
    tabContentLinks = tabContent[j].getElementsByTagName('*');
    for (var k = 0; k < tabContentLinks.length; k++){
      // Here i attempt to filter the collection
      if (tabContentLinks[k].nodeName == 'SELECT') { // <- SELECT elements
        alert("found select list");
      }
    }
  }
}
2 голосов
/ 19 ноября 2010

Вместо того, чтобы воссоздавать все обсуждение и возможные решения, я просто укажу на сообщение в блоге , в котором обсуждается именно эта проблема.

0 голосов
/ 19 ноября 2010

У меня нет под рукой IE, но в Firefox правильно использовать object.constructor.name (object.constructor - конструктор объекта, .name - имя функции).

function Xyz() {}
new Xyz().constructor.name === 'Xyz'

Но тогда, также,

var Abc = function() {}
new Abc().constructor.name === 'Abc'
0 голосов
/ 19 ноября 2010

Я верю, что IE вернет простые типы данных, но все остальное - просто объект. Это ограничение браузера. Я не знаю, улучшил ли IE9 ситуацию, но это, вероятно, не помогло бы вам в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...