今天看到一个代码,通过document.all函数判断浏览器是否是IE。代码大致是这样的:
if (document.all){ // 是IE }else{ // 不是IE }
这里面有个有意思的地方。
document.all函数会返回页面上所有html元素的集合,现在主流浏览器均支持,比如在chrome中执行一下:
在返回的集合中包含了页面上所有的html元素。
那么问题来了,既然chrome也支持这个函数,结果也不为空,这样判断时不应该是true吗?
试一下将其转换为布尔值,结果竟然是false!惊了!
其实,在IE之外的浏览器里,运行 typeof document.all ,得到的都是结果都是undefined。而在IE里就是object。
这个现象是有历史原因的。document.all最早是由IE4实现的,当时很多程序猿就通过document.all来判断是否是IE浏览器。后来其他浏览器也实现了document.all,但是又不想被旧程序判断为IE浏览器,所以就把document.all的类型设置为undefined了。
这样,在IE之外的浏览器里判断document.all就会得到false了。
ps:IE11里判断document.all也是false了,所以此方法已经不可靠。
在JavaScript中使用document.all来判断是否是IE浏览器
javascript中的document.getElementsByClassName()方法是很实用也很常见的DOM选择器方法,然而IE8及以下版本的IE浏览器并不支持此方法(IE8都支持querySelector()方法了,却不支持getElementsByClassName()方法,实在匪夷所思)。
下面的代码可以在低版本IE浏览器中实现一个document.getElementsByClassName()方法。
if (!document.getElementsByClassName) { document.getElementsByClassName = function(className, element) { var children = (element || document).getElementsByTagName('*'); var elements = new Array(); for (var i = 0; i < children.length; i++) { var child = children[i]; var classNames = child.className.split(' '); for (var j = 0; j < classNames.length; j++) { if (classNames[j] == className) { elements.push(child); break; } } } return elements; }; }
加入这份代码之后,就可以正常使用document.getElementsByClassName()方法了。
(也许遍历所有HTML标签开销比较大←_← 只要求兼容到IE8的话尽情的使用querySelector()方法和querySelectorAll()方法吧)
在低版本IE浏览器上实现getElementsByClassName()方法
最近做的网站,都已经上线了,但是同事的百度浏览器用兼容模式查看发现superslide没有生效,原本应该是滚动显示的banner图一张张竖着排了下来。后来用ietester的ie8模式重现了此问题。虽然确实从代码上找出了些问题,但还是让我感叹低版本ie8的纠错容错能力太差了。
1.需要的js是否都加载了
2.有无语法错误,例如js被注释,或js最后的结束标记复制的时候留在了原地,导致标签错误
3.jq放在所有js的最前面
4.查看是否引用了多个jq,如头部模板引入了一个,底部模板又引入了一个(即使是同一个jq文件),保留一个就行
5.如果底部有很多乱七八糟的js,例如广告的、统计的,那么把我们直接用script标签写出的js代码移到底部前面去,以免受到其影响。
6.如果有些选择器已经不存在了,删除对应的js代码。例如首页有两个地方用到了supersild,二级页面却只用了一个。如果直接复制第一个页面的js代码到二级页面,那么第二个元素不存在,ie就会报错。
7.如果怀疑有js和jq有冲突,可以试下用稍低版本的jq,或者把js一个个删除排查。
8.也许可以试试在页面头部添加之类的玩意,死马当做活马医,这类玩意参数很多,具体可百度。
js出错排查的一些注意事项
最近做的网站引用了SuperSlide,其需要jq的支持,于是我不假思索下载了2.0.3版本的jq。这是个比较新的版本,现在项目都快上线了,有个同事用360极速浏览器的兼容模式查看,发现SuperSlide没有生效。后来我就拿ie8实验,在ietest里用ie8模式打开此网页后,不断报错:
这个大概是jq根据SuperSlide的指令执行操作被浏览器报错
这个是SuperSlide使用的jquery()方法不起效
去你妹的吧,在各种百度各种尝试,浪费最少半小时之后,忽然想到以前一件事情,某投资网站根据用户输入的数值来计算相应的其他值,我当时也是把jq换成新版本就报错了。只是我这里chrome里面没报错,只有ie8有问题,果断把jq换成百度cdn的1.9,世界清静了,又用I6模式看了下,连IE6都给我跪下了爆裂吧IE!!!就你们IE和系统捆绑紧,xp的ie只能到ie8,诚心找事啊
jquery并非越新越好——为了兼容性
刚才逛7吧看到一坟贴,楼主问他把桌面的ie图标删了,怎么恢复出来,而且不要发送快捷方式的这样(当然正版win7桌面是没有IE图标的,又是G版装机)。我工作的这台电脑也是一样,原本桌面有ie图标,我给删了,我就想试试帖子里说的方法。这是用的注册表方法,复制以下代码另存为一个reg文件,双击导入,之后再刷新桌面就能看到ie图标了。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{00000000-0000-0000-0000-100000000001}]
@="Internet Explorer"
[HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-100000000001}]
@="Internet Explorer"
[HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-100000000001}\DefaultIcon]
@="C:\\Windows\\System32\\ieframe.dll,-190"
[HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-100000000001}\shell]
@=""
[HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-100000000001}\shell\NoAddOns]
@="无加载项(&N)"
[HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-100000000001}\shell\NoAddOns\Command]
@="\"C:\\Program Files\\Internet Explorer\\iexplore.exe\" -extoff"
[HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-100000000001}\shell\Open]
@="打开主页(&H)"
[HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-100000000001}\shell\Open\Command]
@="\"C:\\Program Files\\Internet Explorer\\iexplore.exe\""
[HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-100000000001}\shell\Set]
@="属性(&R)"
[HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-100000000001}\shell\Set\Command]
@="\"C:\\Windows\\System32\\rundll32.exe\" C:\\Windows\\System32\\shell32.dll,Control_RunDLL C:\\Windows\\System32\\inetcpl.cpl"
如果想要删除这个图标,可以尝试把以下代码保存为reg文件导入注册表。
Windows Registry Editor Version 5.00
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{86AEFBE8-763F-0647-899C-A93278894D8F}]
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{ADCB47F7-5074-4971-8B5E-CA46E23D7B08}]
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{e17d4fc0-5564-11d1-83f2-00a0c90dc849}]
导入注册表后刷新桌面,如果没反应,注销或者重启一下。如果图标还没有消失,那就需要进注册表手动删除了。
进入注册表,展开到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\之下,然后一个个点击里面的项目,找到右侧值为Internet Explorer的一项,删除该值。
之后注销或重启电脑,IE图标就消失了。但在此之后,上面显示IE的注册表值就不会再生效了。
WIN7在桌面显示隐藏IE图标的方法
在其他浏览器里看到的输入框文字是垂直居中的,这正是我想要的效果
但是在IE8里面就蛋疼了
经过百度找到了问题所在,要给输入框设置高、行高以及垂直居中属性。
#id{ height:22px; line-height:22px; vertical-align:middle; }