ie6 ie7 userdata 本地存储 引发的惨案.

本文探讨了在使用Mootools时遇到的问题,特别是在IE浏览器中使用documentElement作为userdata载体时,会出现选择器错误。文章分析了问题的原因,并讨论了jQuery如何避免此问题。
摘要由CSDN通过智能技术生成

我使用 documentElement 作为userdata 作为本地存储的载体. 

document.documentElement.addBehavior("#default#userdata");

悲剧就产生了.

 

当使用mootools 的 选择器方法 时.  如果很悲剧的 使用了不恰当的选择符.比如

$$('[attr=123]'); 

就报错了. 为什么呢?

查看 mootools 源码 发现 他的选择器在遍历所有节点时 简单的使用了下面的逻辑 :

 

 

getProperty: function(attribute){
		var key = attributes[attribute];
		var value = (key) ? this[key] : this.getAttribute(attribute, 2);
		return (bools[attribute]) ? !!value : (key) ? value : value || null;
}

 

 

问题就出在 this.getAttribute(attribute,2)  这个参数2上. 

 

 

 因为我使用documentElement作为 userdata载体节点. 则在

document.documentElement.addBehavior("#default#userdata");

语句执行后,ie会重写 该节点的getAttribute方法 . 而这个新重写的方法.只支持一个参数.而这个方法大概是c++ 语言实现的.不支持动态参数. 那么你传递了第二个参数 就会导致异常.

 

当this 指的是document.documentElement 即 HTML节点时.  则 明显 mootools 上面的代码就会执行到这个被重写过的方法.并传入第二参数.

 

好吧. 到了这里 你可能会问我. 为什么你非要用DocumentElement作为载体呢? 选个其他节点不就ok了?  遗憾的是 .上面的选择器方法调用时.要遍历 所有节点... 那么 我用哪个节点 可以逃脱这个魔咒呢?. (如果这个节点不在dom树上.那么addBehavior将会报无权限.).

 

那么 出现这种悲剧 到底是谁的过错呢? 我想 即不是 那个写下 $$('[attr=123]');的人 ,也不是 使用了userdata的我 . 而是万恶的 微软. 你既然给你节点的 getattribute原始方法 设计了 第二参数..那么你,那么你重写他的时候.为什么又去掉了第二参数呢? 更可悲的是,你还是不给他容错.

好吧.现在可好了..要么我让人家别用mootools 要么我不用userdata。 要么我用一个复杂的解决办法 修改userdata的操作方式.要么人家要修改 mootools 源码,或选择器器的选择符.  

 

说些题外话. jquery 就考虑到了这个问题. 

人家就做了判断 动态 切换  选择使用参数2 或不适用.

 

最后补充下getAttribute方法,第二参数 值为2 的作用.

 

对于一个 a 标签.  当我们使用getAttribute方法 获取他的 href属性时. 第二参数就起到关键作用了:

如下表:

获得href和src属性的浏览器差异(相对地址与自动编码情况)
 .href getAttribute(“href”)getAttribute(“href”, 2)
IE6相对转绝对,不编码 相对转绝对,不编码 原始值
IE7相对转绝对,汉字不编码,特殊符号编码 相对转绝对,汉字不编码,特殊符号编码 原始值
IE8 as IE7相对转绝对,汉字不编码,特殊符号编码 相对转绝对,汉字不编码,特殊符号编码 原始值
IE8 standard相对转绝对,汉字不编码,特殊符号编码 原始值 原始值
Firefox 3.0+相对转绝对,全部编码 原始值 原始值
Chrome 2.0+相对转绝对,全部编码 原始值 原始值
Safari 4.0+相对转绝对,汉字编码,特殊符号不编码 原始值 原始值
Opera 9.6+相对转绝对,汉字编码,特殊符号不编码 原始值 原始值

 

补充:

1. IE9,似乎只有getAttribute('href',4) 才能相对转绝对. 其编码行为是,汉字编码,= ? 等不变吗.

2. 根据西红柿的测试, 如果是在iframe里的话,IE浏览器就有点不可思议了,需要把创建的a元素appendChild到iframe的document之后,才能获得基于iframe URL的绝对路径,获取方式跟第一点一样。其他浏览器没有这个问题,不用appendChild。

转载于:https://www.cnblogs.com/_franky/archive/2010/10/25/1860649.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值