我使用 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 本地存储 引发的惨案.的更多相关文章

  1. 使用userData兼容IE6-10,chrome,FF 及360等浏览器的本地存储

    开发过程中涉及本地存储的使用,IE很多版本都不支持localStorage,没办法,就得兼容使用userData了.废话不说了,看代码: (function(window){var LS;(funct ...

  2. HTML5本地存储localStorage、sessionStorage及IE专属UserData

    By:王美建 from:http://www.cnblogs.com/wangmeijian/p/4518606.html 转载请保留署名和出处! 在客户端存储数据用的最普遍的方式非cookie莫属, ...

  3. JavaScript本地存储实践(html5的localStorage和ie的userData)

    http://www.css88.com/archives/3717 JavaScript本地存储实践(html5的localStorage和ie的userData) 发表于 2011年06月11日  ...

  4. js本地存储解决方案(localStorage与userData)

    WEB应用的快速发展,是的本地存储一些数据也成为一种重要的需求,实现的方案也有很多,最普通的就是cookie了,大家也经常都用,但是cookie的缺点是显而易见的,其他的方案比如:IE6以上的user ...

  5. localStorage 以及UserData[IE6 IE7]使用

    说在前头: UserData:属于IE6 IE7的老东西.麻烦且体验差,暂且不表 localStorage 属于HTML5的东西,兼容IE8以及其它W3C标准的主流浏览器.所以尽可能的具体解说 注意: ...

  6. HTML5 LocalStorage 本地存储

    HTML5 LocalStorage 本地存储 说到本地存储,这玩意真是历尽千辛万苦才走到HTML5这一步,之前的历史大概如下图所示: 最早的Cookies自然是大家都知道,问题主要就是太小,大概也就 ...

  7. (转载)HTML5 LocalStorage 本地存储

    原文地址:http://www.cnblogs.com/xiaowei0705/archive/2011/04/19/2021372.html HTML5 LocalStorage 本地存储 说到本地 ...

  8. store.js - 轻松实现本地存储(LocalStorage)

    store.js 是一个兼容所有浏览器的 LocalStorage 包装器,不需要借助 Cookie 或者 Flash.store.js 会根据浏览器自动选择使用 localStorage.globa ...

  9. HTML5 本地存储 LocalStorage

    说到本地存储,这玩意真是历尽千辛万苦才走到HTML5这一步,之前的历史大概如下图所示: 最早的Cookies自然是大家都知道,问题主要就是太小,大概也就4KB的样子,而且IE6只支持每个域名20个co ...

随机推荐

  1. Docker和CI/CD实战

    一.CICD和DevOps 前面已经了解了CI/CD,其实CI/CD已经存在多年了,只是最近软件工程方面又提出了敏捷开发.DevOps,又把CI/CD炒火了. 那么什么是DevOps?DevOps和C ...

  2. SQL 上线平台(内含全部完整资料)

    为了让 DBA 从日常繁琐的工作中解放出来,通过 SQL 自助平台,可以让开发自上线,开发提交 SQL 后就会自动执行并返回执行结果,无需 DBA 的再次审核,从而提升上线效率,有利于建立数据库开发规 ...

  3. CSS动画效果之animation

    Y(^o^)Y css动画大乱弹之animation. 概述 什么是animation呢?在回答这个问题之前,先要说明什么叫做@keyframe(关键帧).@keyframe算是一个动画模板.在其中, ...

  4. java并发编程——Excutor

    概述 Excutor这个接口用的不多,但是ThreadPoolExcutor这个就用的比较多了,ThreadPoolExcutor是Excutor的一个实现.Excutor体系难点没有,大部分的关键点 ...

  5. Vue实例 中的常用配置项

    创建Vue实例时,使用 new Vue ({//配置项}) 或者 组件定义中 export default {//配置项},所有的Vue组件都是Vue实例,并且接受相同的选项对象(一些根实例特有的选项 ...

  6. [MIT Intro. to algo]Lecture 1: 课程介绍,算法优势,插入算法和归并算法分析,渐近符号

    The theoretical study of computer program performance and resource useage.   First, analysis and the ...

  7. Netty源码分析第1章(Netty启动流程)---->第5节: 绑定端口

    Netty源码分析第一章:Netty启动步骤 第五节:绑定端口 上一小节我们学习了channel注册在selector的步骤, 仅仅做了注册但并没有监听事件, 事件是如何监听的呢? 我们继续跟第一小节 ...

  8. 基于神念TGAM的脑波小车(2)

    将数据处理移植到STM32上,采用串口的DMA接收模式,注意的是DMA_MODE采用Circular,DMA_BufferSize>(8*512+36=4132)(小包8个字节,每秒512个,完 ...

  9. 笨办法学Python - 习题3: Numbers and Math

    目录 习题 3: 数字和数学计算 算术运算符 加分习题: 我的答案: 总结: 扩展: Python比较运算符 Python赋值运算符 Python位运算符 Python逻辑运算符 Python成员运算 ...

  10. hive创建临时函数

    add jar /home/hjl/sunwg/Lower.jar; create temporary function my_lower as ‘com.example.hive.udf.Lower ...