2014-03-28 33 views
2

我正在开发一个JavaScript library,我需要在DOM元素上设置各种属性。任何避免将属性设置为旧IE中的属性的方法?

例如,DOM元素可能具有所谓的“州”设置属性(一个普通的对象)就可以了:

_('input').get('states') 

/*  OUTPUT 

    { 
     hidden: true, 
     anotherState: false, 
     andAnotherOne: true, 
    } 

*/ 

在IE < 9中,输出将看起来像这样(我了解仅仅是本土传统IE的行为):

<input type="text" value="some value" states="[object Object]"> 

其他性能将会不定期对DOM元素使用相同的方法,以及设置,并在有冲突的属性,属性的DOM元素上设置的问题可能会弹出( IE < 9 m在这种情况下绑定)。

任何方法来避免这种情况,或者这只是你必须忍受的事情?

编辑澄清

为了让在香草JavaScript的一个例子,说你这样做:

document.getElementById('foo').bar = 'foobar'; 

在IE小于9的任何版本,在DOM输出将显示如下:

<div id="foo" bar="foobar"></div> 

在绝大多数其他浏览器中,这不会发生。

现在,如果你这样做:

document.getElementById('foo').bar = { 
    a: 'b', 
    c: 'd' 
} 

在任何版本的IE小于9,您可以:

<div id="foo" bar="[object Object]"></div> 

再次,这并不在大多数其他浏览器发生。

+0

不知道你想要什么......?你在找'JSON.stringfy()'吗? –

+1

@ Karl-AndréGagnon看起来像OP想阻止设置为元素的自定义属性反映到该元素的属性列表。 – Teemu

+0

@ Karl-AndréGagnon,Teemu是正确的。请参阅我的问题的更新版本以获得更多的说明。 –

回答

0

只是想一想你的技术。您正在尝试通过为数据附加属性来修改本机对象。这不是一个好主意。实际上,原型库对元素做了什么,导致了许多不好的问题,为什么图书馆最终消失了。

更好的方法是创建一个包装元素的对象,这是jQuery的功能。现在说,你正试图将数据绑定到元素,可能是为了持久化。你可能想重新考虑一下。例如,可能使用数据属性或仅将数据保存在localStorage中。我想你会发现你有一个更好的解决方案来维护,但也会更高性能。

说这是一个谁试图做我认为你正在尝试做的人。

+0

当谈到较老的IE时,'data- *'和'localStorage'不是选项... – Teemu

+0

您可以使用旧版本的数据,当然它不会在那个时间框架的HTML验证器中验证。我相信,自IE8以来,localStorage已经可用。 –