ie6 ie7 userdata 本地存储 引发的惨案.
我使用 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。
ie6 ie7 userdata 本地存储 引发的惨案.的更多相关文章
- 使用userData兼容IE6-10,chrome,FF 及360等浏览器的本地存储
开发过程中涉及本地存储的使用,IE很多版本都不支持localStorage,没办法,就得兼容使用userData了.废话不说了,看代码: (function(window){var LS;(funct ...
- HTML5本地存储localStorage、sessionStorage及IE专属UserData
By:王美建 from:http://www.cnblogs.com/wangmeijian/p/4518606.html 转载请保留署名和出处! 在客户端存储数据用的最普遍的方式非cookie莫属, ...
- JavaScript本地存储实践(html5的localStorage和ie的userData)
http://www.css88.com/archives/3717 JavaScript本地存储实践(html5的localStorage和ie的userData) 发表于 2011年06月11日 ...
- js本地存储解决方案(localStorage与userData)
WEB应用的快速发展,是的本地存储一些数据也成为一种重要的需求,实现的方案也有很多,最普通的就是cookie了,大家也经常都用,但是cookie的缺点是显而易见的,其他的方案比如:IE6以上的user ...
- localStorage 以及UserData[IE6 IE7]使用
说在前头: UserData:属于IE6 IE7的老东西.麻烦且体验差,暂且不表 localStorage 属于HTML5的东西,兼容IE8以及其它W3C标准的主流浏览器.所以尽可能的具体解说 注意: ...
- HTML5 LocalStorage 本地存储
HTML5 LocalStorage 本地存储 说到本地存储,这玩意真是历尽千辛万苦才走到HTML5这一步,之前的历史大概如下图所示: 最早的Cookies自然是大家都知道,问题主要就是太小,大概也就 ...
- (转载)HTML5 LocalStorage 本地存储
原文地址:http://www.cnblogs.com/xiaowei0705/archive/2011/04/19/2021372.html HTML5 LocalStorage 本地存储 说到本地 ...
- store.js - 轻松实现本地存储(LocalStorage)
store.js 是一个兼容所有浏览器的 LocalStorage 包装器,不需要借助 Cookie 或者 Flash.store.js 会根据浏览器自动选择使用 localStorage.globa ...
- HTML5 本地存储 LocalStorage
说到本地存储,这玩意真是历尽千辛万苦才走到HTML5这一步,之前的历史大概如下图所示: 最早的Cookies自然是大家都知道,问题主要就是太小,大概也就4KB的样子,而且IE6只支持每个域名20个co ...
随机推荐
- python+appium 实现qq聊天的消息,滑动删除聊天消息
有人问我,appium怎么去删除qq聊天的, 当时想到的是滑动, 可是具体的大概有个思路,于是乎,就想自己来实现下, 打开模拟器,开发者选项,找到显示坐标的 然后去打开qq获取要删除的消息的坐标后, ...
- 【轮子狂魔】抛弃IIS,打造个性的Web Server - WebAPI/Lua/MVC(附带源码)
引言 此篇是<[轮子狂魔]抛弃IIS,向天借个HttpListener - 基础篇(附带源码)>的续篇,也可以说是提高篇,如果你对HttpListener不甚了解的话,建议先看下基础篇. ...
- Makefile详解
原文链接:https://blog.csdn.net/qq_38646470/article/details/79917494 专栏链接:https://blog.csdn.net/column/de ...
- 初识IT行业,人生苦短,我学python
第一次写,我也不知道该怎么写.只有慢慢的去体会大神们的见解与看法. Python是一个较强的脚本语言,而Java是强类型的编程语言.为了更好的入门,我没有去选择强类型语言的Java,而选择使用Pyth ...
- 【转】Linux系统下的ssh使用
Linux系统下的ssh使用(依据个人经验总结) 对于linux运维工作者而言,使用ssh远程远程服务器是再熟悉不过的了!对于ssh的一些严格设置也关系到服务器的安全维护,今天在此,就本人工作中使 ...
- halcon算子之tuple_gen_const,用于生成特定长度的元组并且初始化其元素
原文地址:http://blog.sina.com.cn/s/blog_d38f8be50102wczk.html 函数原型: tuple_gen_const(: : Length, Const : ...
- 本地使用js或jquery操作cookie在谷歌浏览器chrome中不生效
一般是在本地调试cookie,无论使用jquery cookie插件还是js原生态cookie方法,在谷歌浏览器chrome中都不生效,这是什么原因? 原因是: chrome不支持js在本地操作coo ...
- Python 3 利用 Dlib 19.7 进行人脸检测
0. 引言 / Overview 介绍 Dlib 中基于 HOG,Histogram of Oriented Gradients / 方向梯度直方图 实现 Face Detect / 人脸检测 的两个 ...
- 对PBFT算法的理解
PBFT论文断断续续读了几遍,每次读或多或少都会有新的理解,结合最近的项目代码,对于共识的原理有了更清晰的认识.虽然之前写过一篇整理PBFT论文的博客,但是当时只是知道了怎么做,却不理解为什么.现在整 ...
- PropertyGrid中的枚举显示为中文
参考http://www.cnblogs.com/yank/archive/2011/09/17/2179598.html 在上述文档的基础上做了改进.从EnumConverter类派生 显示效果: ...