希望我能以一种可以理解的方式提出这个问题......
总的来说,我正在尝试确定我目前正在处理的对象类型。
我正在创建一个集合(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中返回对象的类型,或者我是非常远离并咆哮灯柱而不是树?
答案 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.name
(object.constructor
是对象的构造函数,.name
是函数名。)
function Xyz() {}
new Xyz().constructor.name === 'Xyz'
但是,也是,
var Abc = function() {}
new Abc().constructor.name === 'Abc'