当我在Firefox(Firefox 20,Linux)中运行此功能时,我只看到{};{}
:
es.addEventListener('error', function(e){document.getElementById('debug').innerHTML+="ERR:"+JSON.stringify(e)+";"+JSON.stringify(es)+"<br/>";},false);
BTW,es
是EventSource
个对象,e
是Event
个对象。
所以,我尝试了这个替代方案:
function objToString (obj) {
var str = '';
for (var p in obj) {
if (obj.hasOwnProperty(p)) {
str += p + '::' + obj[p] + '\n';
}
}
return str;
}
//...
es.addEventListener('error', function(e){document.getElementById('debug').innerHTML+="ERR:"+objToString(e)+";"+objToString(es)+"<br/>";},false);
仍然没有得到任何输出。所以我尝试了这种方法,但仍然没有得到任何东西,无论是toString()还是key。 (toSource()
也是一样。)
es.addEventListener('error', function(e){document.getElementById('debug').innerHTML+="ERR:"+e.toString()+";"+Object.keys(e).toString()+";"+es.toString()+";"+Object.keys(es).toString()+"<br/>";},false);
仍然没有。这似乎不公平,因为通过使用Firebug设置断点,我可以看到两个对象都有很多属性。然后我尝试在Chrome中,发现所有这三种技术都有效。这三个人也在Opera工作。
那么,Firefox发生了什么?查看内置对象的属性有一些限制吗?我可以通过设置一些Firefox属性来覆盖它的安全性吗?
注意:之前标记为重复(How to get error event details in Firefox using addEventListener?)的帖子是另一个问题。我可以在所有浏览器中访问e.type
,es.url
等,包括Firefox。 Firefox的不同之处在于es.toString()返回一个空字符串,JSON.stringify看到一个空对象,Object.Keys(es)返回一个空数组等。
答案 0 :(得分:1)
好的,从评论延伸:
因为在Firefox / Gecko中,许多与DOM相关的属性位于原型链中,而不是在对象实例的属性中(例如clientHeight
中的Element.prototype
,而不是在任何元素实例中),因此{{1将为false,obj.hasOwnProperty(p)
将返回一个空数组。
比较
Object.keys
在Chrome中:
Object.getPrototypeOf(document.documentElement)
在Firefox中:
(列出普通第一级中的所有常量,属性,方法;哎呀,Firefox的本机控制台结果很难复制)。