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 ...
随机推荐
- request不能接受前端传来的参数的问题
这是因为设置了 disabled ,所以接收不到参数,只需要去掉disabled即可.
- tabindex 属性
tabindex 属性规定元素的 tab 键控制次序(当 tab 键用于导航时). 语法:<element tabindex="number">规定元素的 tab 键控 ...
- 安装vs2017后,RDLC 报表定义具有无法升级的无效目标命名空间
原先的RDLC报表定义用的命名空间是2008,用vs2017报表设计器重新保存后,会自动升级成2016,导致无法使用. 不想升级控件,太麻烦,所以就手动修改RDLC文件吧. 1.修改http://sc ...
- 百道Python入门级练习题(新手友好)第一回合——矩阵乘法
题目描述 [问题描述] 编写程序,完成3*4矩阵和4*3整数矩阵的乘法,输出结果矩阵. [输入形式] 一行,供24个整数.以先行后列顺序输入第一个矩阵,而后输入第二个矩阵. [输出形式] 先行后列顺序 ...
- FileZilla-FTP连接失败
状态: 已登录状态: 读取“/”的目录列表...命令: CWD /响应: 250 CWD successful. "/" is current directory.命令: TYPE ...
- 备份win10的驱动程序
目录 折腾历程 怎么备份驱动 备份的驱动如何使用 关于驱动程序的OS兼容性 驱动程序的其他安装方式 1.折腾历程 从闲鱼上收了一个INSIGNIA的二合一笔记本,w7100,因原装win10性能不行自 ...
- 学习记录 div悬停在顶部 。div阻止冒泡
如何让一个div可点击,并且div里面的a元素也能点击? 楼主应该是想要这样的,阻止事件冒泡 点击里面的a的时候不触发外面的div的点击事件 <script type="text/ja ...
- spring boot之创建web项目并访问jsp页面
1,创建spring boot的web项目 刚创建好的项目路径如下: 2,pom中要有下面的依赖 <dependency> <groupId>org.springframewo ...
- 必应词典手机版(IOS版)与有道词典(IOS版)之软件分析【功能篇】【用户体验篇】
1.序言: 随着手机功能的不断更新和推广,手机应用市场的竞争变得愈发激烈.这次我们选择必应词典和有道词典的苹果客户端作对比,进一步分析这两款词典的客户端在功能和用户体验方面的利弊.这次测评的主要评测人 ...
- Daily Srum 10.28
这两天我们和其他两组进行了一次会议,主要讨论的是用什么框架来搭建这个平台.在线系统的那一组希望我们用nutch.solr.hbase这一套工具,这对于我们两组来说是一次挑战,毕竟我们一开始用的是关系型 ...