使用Object.prototype.toString.call()返回带有Javascript的对象类型 - 不在IE中工作

时间:2010-11-19 05:35:55

标签: javascript html internet-explorer-8

希望我能以一种可以理解的方式提出这个问题......

总的来说,我正在尝试确定我目前正在处理的对象类型。

我正在创建一个集合(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中可以正常工作但在IE8中返回[object Object] ...

我打电话

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 个答案:

答案 0 :(得分:13)

首先,我想告诉您Object.prototype.toString返回对象的内部[[Class]]属性的值,它实际上不是 Type

此内部属性的值表示对象的规范定义的分类(更多信息here)。

Javascript只有6种语言类型 Object,String,Number,Boolean,Null和Undefined ,就是这样。

主机对象的[[Class]]内部属性(作为DOM元素)的值可以是任何,它完全是依赖于实现的,在构建时在对象中使用它是安全的 - 除了IE中的一些例外情况,正如@Alex在他的答案中链接的文章中所指出的那样 - 。

您正在使用DOM元素,并且您想要弄清楚它是什么类型的节点,我的建议是简单地使用nodeName属性(请避免使用{{1} })

tagName属性包含您正在处理它的节点的名称,大写,因此您可以将其用作:

nodeName

答案 1 :(得分:2)

我只是指向一个讨论这个问题的blog post,而不是重新创建整个讨论和可能的解决方案。

答案 2 :(得分:0)

我相信IE会返回简单的数据类型,但其他一切只是一个对象。这是一个浏览器限制。我不知道IE9是否正在改善这种情况,但无论如何这可能对你没有帮助。

答案 3 :(得分:0)

我没有IE方便,但Firefox中的正确方法是使用object.constructor.nameobject.constructor是对象的构造函数,.name是函数名。)

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

但是,也是,

var Abc = function() {}
new Abc().constructor.name === 'Abc'