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 ...
随机推荐
- 解决 java循环中使用 Map时 在put值时value值被覆盖的问题
其实很简单,只需要把容器换成list 然后在循环中,每次循环末尾map = new HashMap() 或者直接在循环中一开始就实例化hashmap(Map map = new HashMap();) ...
- org.springframework.mail.MailSendException: Failed messages: javax.mail.SendFailedException: Invalid Addresses
一.问题分析 org.springframework.mail.MailSendException: Failed messages: javax.mail.SendFailedException: ...
- C#四则运算器(多态方法实现)
在上一节C#课上,我们学习了用类的继承的方式来做一个四则运算器,然而老师的代码在课上演示的效果并不理想,而且没有使用多态的思想实现,今天我们就来用多态的方式实现四则运算器. 1. 题目及要求 2. A ...
- 随机图片api
什么是随机图片api 随机图片api是什么呢?通俗的讲就是当你访问一个api时,浏览器会随机返回给你一张图片. 其实原理很简单,把你要随机的图片放在一起,然后写一个php,当php被访问时,就随机指向 ...
- [codeForce-1006C]-Three Parts of the Array (简单题)
You are given an array d1,d2,…,dnd1,d2,…,dn consisting of nn integer numbers. Your task is to split ...
- WinDbg使用学习
拿到软件崩溃之后产生的crash文件,后缀名为dump 使用winDbg的File-----> Open Crash Dump 打开Crash文件 File---------> Symbo ...
- Go的CSP并发模型
golang的goroutine机制: 一.go 内部有三个对象: P对象(processor) 代表上下文(或者可以认为是cpu),M(work thread)代表工作线程,G对象(g ...
- React Native移动开发实战-3-实现页面间的数据传递
React Native使用props来实现页面间数据传递和通信.在React Native中,有两种方式可以存储和传递数据:props(属性)以及state(状态),其中: props通常是在父组件 ...
- ef5 数据库操作
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 自制session
原理 1.面向对象中通过索引的方式访问对象,需要内部实现 __getitem__ .__delitem__.__setitem__方法 2.Tornado框架中,默认执行Handler的get/pos ...