2012-09-25 21 views
0

我需要区分对象上的“纯”JavaScript属性和本机属性,如innerHTMLstyle确定属性是Chrome/Firefox中的本机DOM属性

在Safari中我可以使用Object.getOwnPropertyDescriptor()并检查configurable财产(这是特殊性质的错误),但不幸的是这不会对Chrome或Firefox相同的结果(返回该属性是可配置)。

尝试在不同的浏览器上尝试this fiddle以查看问题。

有没有可靠的方法来确定属性是否是一个特殊的内部属性?

更新

我注意到,Firefox的实际返回undefined如果你试图得到一个原生属性的属性描述符,这样有可能正常工作。这使Chrome浏览器不幸返回了一个属性描述符,看起来就像一个普通的属性。

例如,下面是innerHTML描述符在Chrome:

{"value":"","writable":true,"enumerable":true,"configurable":true} 

...这里名为 “测试” 的空字符串属性:

{"value":"","writable":true,"enumerable":true,"configurable":true} 

完全一样。 :(

+0

[ 'getOwnPropertyDescriptor()'](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor)似乎存在于Chrome 5+,FF 4+和IE8 +中。 – Blender

+0

I don不要认为getOwnPropertyDescriptor实际上在做你认为的事情,它可以在任何o上设置属性也可能是不可配置的。您是否真的想知道对象的属性是否是本机属性,即由浏览器运行时提供的属性? – Geuis

+0

是的,但我不关心显式的不可配置属性。主要是我需要告诉我是否可以重新定义一个属性,而不会破坏它的本地处理。 – devios1

回答

2

你必须检查属性的DOM元素的问题一个新创建的实例定义:

'innerHTML' in (document.createElement('div')); //yes 

,测试这可能看起来像一个函数:

var test = function (elem, prop) { 
    return prop in (typeof elem === 'string' ? document.createElement(elem) : elem) 
} 

console.log(test('div', 'innerHTML')); 
console.log(test(document.getElementsByTagName('body')[0], 'innerHTML')); 
console.log(test(document.getElementsByTagName('body')[0], 'monkey'));​ 
+0

是的,我认为这是正确的方向。我也在考虑检查该属性是否定义在一个像'HTMLElement'这样的已知原型上。 – devios1

+0

我明白你要去哪里,但我真的希望有一种方法可以做到这一点,而不必为了执行测试而创建一个元素。我预计这会非常低效。 – devios1

+1

如果您找到了另一种方法,请在此留言,以便日后阅读。与此同时,我认为这与你将要得到的一样接近。在内存中创建元素非常便宜。除非你在循环或其他方面做了这么多次,否则它并不是真正的性能密集型。 – Geuis