惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
Y
Y Combinator Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Security Blog
Microsoft Security Blog
aimingoo的专栏
aimingoo的专栏
I
InfoQ
C
Check Point Blog
IT之家
IT之家
MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
Vercel News
Vercel News
Last Week in AI
Last Week in AI
GbyAI
GbyAI
P
Proofpoint News Feed
量子位
Stack Overflow Blog
Stack Overflow Blog
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
人人都是产品经理
人人都是产品经理
B
Blog
T
The Blog of Author Tim Ferriss
H
Help Net Security
云风的 BLOG
云风的 BLOG

张鑫旭-鑫空间-鑫生活

1分钟速度了解text-align match-parent声明 « 张鑫旭-鑫空间-鑫生活 光标的形状也能设置了,就是CSS caret-shape属性 « 张鑫旭-鑫空间-鑫生活 pretext与文字四面环绕效果的实现 « 张鑫旭-鑫空间-鑫生活 JSON.rawJSON方法的作用是什么? « 张鑫旭-鑫空间-鑫生活 如何使用CSS判断鼠标从哪个方向进入元素? « 张鑫旭-鑫空间-鑫生活 借助mediabunny纯JS实现视频水印、剪裁、合成等功能 « 张鑫旭-鑫空间-鑫生活 务必谨慎使用JS WeakRef弱引用 « 张鑫旭-鑫空间-鑫生活 CSS六边形头像的实现与蜂巢布局 « 张鑫旭-鑫空间-鑫生活 CSS corner-shape与背景底纹技术 « 张鑫旭-鑫空间-鑫生活 浅学WebTransport API:下一代Web双向通信技术 « 张鑫旭-鑫空间-鑫生活 HTML dialog元素新支持了closedBy属性 « 张鑫旭-鑫空间-鑫生活 HTML interestfor属性与悬停popover交互效果 « 张鑫旭-鑫空间-鑫生活 CSS3模拟window7炫酷界面效果展示 « 张鑫旭-鑫空间-鑫生活 图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活 纯js无图片无外链CSS图片幻灯片播放插件 « 张鑫旭-鑫空间-鑫生活 CSS border三角、圆角图形生成技术简介 « 张鑫旭-鑫空间-鑫生活 CSS “渐进增强”在web制作中常见应用举例 « 张鑫旭-鑫空间-鑫生活 让IE6/IE7/IE8浏览器支持CSS3属性 « 张鑫旭-鑫空间-鑫生活 jQuery – 高亮动态显示页面HTML代码插件 « 张鑫旭-鑫空间-鑫生活 翻译 – 逐渐消失的Flash网站 « 张鑫旭-鑫空间-鑫生活 CSS reset的重新审视 – 避免样式重置 « 张鑫旭-鑫空间-鑫生活 新浪微博插入话题后部分文字选中的js实现 « 张鑫旭-鑫空间-鑫生活 JavaScript实现http地址自动检测并添加URL链接 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变背景(gradient)效果 « 张鑫旭-鑫空间-鑫生活 CSS content内容生成技术以及应用 « 张鑫旭-鑫空间-鑫生活 CSS gradient渐变之webkit核心浏览器下的使用 « 张鑫旭-鑫空间-鑫生活 CSS渐变之CSS3 gradient在Firefox3.6下的使用 « 张鑫旭-鑫空间-鑫生活 区分IE8/IE7/IE6及其他浏览器-CSS “\9″hack « 张鑫旭-鑫空间-鑫生活 CSS实现跨浏览器兼容性的盒阴影效果 « 张鑫旭-鑫空间-鑫生活 CSS3&HTML5各浏览器支持情况一览表 « 张鑫旭-鑫空间-鑫生活
残忍:IE10↘IE7-IE9 type=email的完全抛弃 « 张鑫旭-鑫空间-...
张鑫旭,zhangxinxu · 2012-12-13 · via 张鑫旭-鑫空间-鑫生活

by zhangxinxu from http://www.zhangxinxu.com
本文地址:http://www.zhangxinxu.com/wordpress/?p=2844

没错,我还是在下棋。

一、IE10, 你可以的

讲个故事吧。

—————故事开始——————
有个顽童名叫IE, 其9岁的时候,不举;10岁的时候,可以举。

这位叫做IE的顽童,跟纲手婆婆一样,可以向下控制年龄显示,7岁到9岁都可以。但是,为了不让人看穿其真实年龄,当其7~9岁模样的时候,需要不举。不过,身体是同一副,诱人妹子在眼前,不是说不举就不举的。

纲手婆婆

怎么办?按照道理讲,10岁的IE可以在多多熟悉9岁的身体,学会控制与忍耐。——但是,这是需要多多练习,需要付出不少努力的。然而,这位名叫IE的男童,好逸恶劳、不求上进,其想了一个快捷的办法:当我变成9岁的时候,直接把小弟弟咔嚓了,这样,不就举不起来了嘛!!哈哈,我好聪明!!
—————故事结束——————

这是第二个故事。
—————故事开始——————
IE6-IE9浏览器不支持type="email"的输入框,因此,在这些浏览器的表单提交时:

<input type="email" value="aaaaaaa" />

浏览器不会提示你“邮箱格式不正确”。

IE10下会,类似下面:
IE10邮箱格式不准确的提示 张鑫旭-鑫空间-鑫生活

也就是说,在IE6~IE9时代,虽然HTML代码是type="email"但是,表现型却是type="text",这使得我们可以渐进使用HTML5的指定表单元素。

在IE10浏览器中,存在如下一些模式:
IE10浏览器下的一些模式 张鑫旭-鑫空间-鑫生活

OK, 现在就存在举与不举的问题了——IE10 email可举,向下的IE7-IE9不可举,怎么办?

我们先看看IE9浏览器,虽然也存在向下兼容模式(IE7-IE8)。但是,所有浏览器都不认识type="email",因此,没有不同,没有处理!

但是,IE10……IE它是如此地懒惰,为了向下兼容,其做法相当霸气,直接将type="email"从渲染层面给“阉掉”了!

—————故事结束——————

前后两个故事,你更愿意相信那一个?

二、IE10,你个阉人

IE10兼容模式是如何“阉割”的?

且看如下简短HTML代码:

<id="email" type="email" />

然后,我们在IE10↘IE8以及ietseter IE8下输出其outerHTML代码,结果:
IE10↘IE8下outerHTML输出 张鑫旭-鑫空间-鑫生活

ietester ie8 outerHTML输出 张鑫旭-鑫空间-鑫生活

输出其getAttribute("type")值,IE10↘IE8下为:
IE10↘IE8下getAttribute("type")值 张鑫旭-鑫空间-鑫生活

其他IE8下:
常规IE8浏览器下type类型 张鑫旭-鑫空间-鑫生活

或者,我们从CSS层面查看,如下选择器:

input[type=email] {
    padding: 4px 2px 4px 25px;
    border: 1px solid #aaa;
    background: #fff url('邮箱小图标') no-repeat left center;
}

IE8浏览器是认识属性选择器的,但是,在IE10↘IE8下,由于IE10自以为高明地把type=email直接阉成了type=text,因此,输入框是这个样子:
属性选择器失效

而不是应该的这个样子:
正常IE8浏览器下type=email选择器是可以认识的 张鑫旭-鑫空间-鑫生活

上面三个小证明,可以狠狠地点击这里查看:type=email前后渲染变化demo

一句话,IE10浏览器下,所有向下兼容的版本,在渲染< type="email" />这段HTML时候,擅自改动了HTML内容,以< type="text" />输出并渲染!因此,这种阉割导致了很多相关不兼容与悲剧!!

我看查看加载后的HTML代码:
加载后被渲染的HTML代码 张鑫旭-鑫空间-鑫生活

只有HTML5支持类型input框才有此悲剧
什么意思?也就是说,IE10向下版本,只有IE10本身支持的type=emailurlnumbertelrange的时候,才会阉割成text类型。

IE10本身不支持的类型,如type=date或自定义的type=zipcode是可以正常识别的。
type=date是可以识别的 张鑫旭-鑫空间-鑫生活

三、渐进使用的大悲剧

IE10这种取巧的懒惰做法是在是太龌龊了,

我表示很气愤!

这种龌龊做法实际上阻碍的HTML5表单当下阶段的普及与应用。

比方说,我想根据文本框的type类型,进行正则匹配,进行表单验证。使用HTML5表单是最佳选择,因为①规范②面向未来③低学习成本

如果没有IE10,尤其IE10浏览器向下兼容版本的龌龊做法,这个idea是相当赞,可行性相当高,且无压力。IE10真是毁锅的老鼠屎!

四、后知后觉的存在

进过我的反复尝试与测试,要让type=email存在于页面文档中,只能在页面渲染完毕后(后知后觉)进行处理,只能是这样子干:

var email = document.createElement("input");
email.type = "email";    // 某些IE浏览器如正统IE9会报"无效参数"错误
document.body.appendChild(email);

可以看到,IE10↘IE8,[type=email]CSS属性选择器作用了,HTML代码也是type="email"了:
type=email终于认识了 张鑫旭-鑫空间-鑫生活

您可以狠狠地点击这里:DOM创建示意demo

但是,在实际使用中,表单元素不可能通过JS DOM创建(注意,innerHTML注入<input type="email">是无效的!),因此,这个方法只可远观而不可亵玩焉。

或者,如下比较蛋疼的后知后觉做法:
在书写HTML的时候,我们不是type="email"而是type="email ",在后面(或前面)键入一个空格(或其他非单词字符)。上面已经提过了,email会被阉割成text,但是,email+空格却不会。

因此,如下HTML代码:

<id="email" type="email " />

然后,如下JS代码:

var email = document.getElementById("email");
try { email.type = email.type.replace(/\s+$/, ""); } catch(e) {}

结果:
默认框框状态 点击后框框状态

您可以狠狠地点击这里:后期trim type效果demo

看上去还不错。但是,部分IE浏览器是不允许type类型的改变的,因此,上面的做法只能是部分修复——不过好在的是IE10以及其他现代浏览器(支持HTML5表单元素的)都是支持这种修复的。

因此:

  1. 不影响支持HTML5表单的浏览器的原生使用
  2. 蛋疼的IE10向下兼容以及其他IE浏览器可以知道这个是email类型输入框(简单trim下即可)

五、希望啊希望

据说IE10是自动升级的,我就希望,过个个把月,IE10把这个糟糕的bug给修复了,我还可以可以给他说两句好话,否则,我没事就拿IE10吐槽!

目前而言,如果您遇到这个问题,最好的做法是:什么也不用做!

没有什么好的修复方法!加上使用IE10浏览器的人国内并不多,加上使用IE10兼容模式的也不多,因此,先忽略这个让人吐血折寿的问题吧,该喝咖啡的和咖啡,该刷微博的刷微博……

如果您实在想做点什么,试试在头部加上这个meta源信息吧(并不推荐):

<meta http-equiv="X-UA-Compatible" content="IE=edge" />

本文为原创文章,转载请注明来自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com]
本文地址:http://www.zhangxinxu.com/wordpress/?p=2844

(本篇完)