2

当我在 Firefox(Firefox 20、Linux)中运行此功能时,我只看到{};{}

es.addEventListener('error', function(e){document.getElementById('debug').innerHTML+="ERR:"+JSON.stringify(e)+";"+JSON.stringify(es)+"<br/>";},false);

顺便说一句,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() 和键仍然一无所获。(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 属性来覆盖安全性吗?


注意:之前被标记为重复的帖子(如何使用 addEventListener 在 Firefox 中获取错误事件详细信息?)是一个不同的问题。我可以在包括火狐在内的所有浏览器中访问e.type,es.url等。Firefox 的不同之处在于 es.toString() 返回一个空字符串, JSON.stringify 看到一个空对象, Object.Keys(es) 返回一个空数组,等等。

4

1 回答 1

1

好的,从评论延伸:

因为在 Firefox/Gecko 中,许多与 DOM 相关的属性位于原型链中,而不是在对象实例自己的属性中(例如clientHeightin Element.prototype,不在任何元素实例中),所以obj.hasOwnProperty(p)会为 false,并且Object.keys会返回一个空数组。

比较

Object.getPrototypeOf(document.documentElement)

在 Chrome 中:

HTMLHtmlElement {insertAdjacentHTML: function, insertAdjacentText: function, click: function, insertAdjacentElement: function, getAttribute: function…}
    constructor: function HTMLHtmlElement() { [native code] }
    __proto__: HTMLElement
        click: function click() { [native code] }
        constructor: function HTMLElement() { [native code] }
        /*... all native functions */
        __proto__: Node

在火狐中:

(以普通的第一级列出所有常量、属性、方法;见鬼,Firefox 的本机控制台结果很难复制)。

于 2013-06-11T03:44:04.290 回答